来当个伸手党,用 python 写的爬虫,在 win 下内存占用就 70M 多,为什么放到 512m 的 vps 下没多久就被 kill 掉 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
sandideas
V2EX    Python

来当个伸手党,用 python 写的爬虫,在 win 下内存占用就 70M 多,为什么放到 512m 的 vps 下没多久就被 kill 掉

  •  
  •   sandideas 2015-07-20 10:33:52 +08:00 8229 次点击
    这是一个创建于 3743 天前的主题,其中的信息可能已经有所发展或是发生改变。
    40 条回复    2015-07-21 19:55:19 +08:00
    sandideas
        1
    sandideas  
    OP
       2015-07-20 10:35:51 +08:00
    是linux的vps。。。开了ss之类的,内存占用40%。。感觉剩下的应该够跑吧。
    neoblackcap
        2
    neoblackcap  
       2015-07-20 10:50:55 +08:00   1
    你是不是就直接用shell去启动你的脚本?然后就退出了ssh?
    laiyilong
        3
    laiyilong  
       2015-07-20 10:51:58 +08:00 via Android   1
    没有优化好。。可以考虑多线程,把swap空间调大应该也可以
    icedx
        4
    icedx  
       015-07-20 10:52:01 +08:00   1
    代码呢
    loading
        5
    loading  
       2015-07-20 10:52:12 +08:00 via Android   1
    cpu超了?
    msg7086
        6
    msg7086  
       2015-07-20 11:10:02 +08:00   1
    虚拟内存设定呢?
    paw
        7
    paw  
       2015-07-20 11:26:02 +08:00   1
    ulimit -a
    看一下,是不是这里限制了,virtual memory;open files ;stack size 等
    以前在用OAH的VPS的时候碰到过,virtual memory有限制,坑爹货。
    sandideas
        8
    sandideas  
    OP
       2015-07-20 12:22:31 +08:00
    @neoblackcap
    对。。。第一次弄这个,难道不是直接启动。。然后扔那么
    kqz901002
        9
    kqz901002  
       2015-07-20 12:23:22 +08:00
    @sandideas nohup $$$&
    sandideas
        10
    sandideas  
    OP
       2015-07-20 12:25:53 +08:00
    @laiyilong 就是多线程。。我查查怎么调swap空间。
    lcqtdwj
        11
    lcqtdwj  
       2015-07-20 12:25:56 +08:00
    win7长时间开着内存也就70M么?
    sandideas
        12
    sandideas  
    OP
       2015-07-20 12:28:14 +08:00
    @icedx 写的很乱。。不敢贴。但是我urlib,file之类的都有close掉。应该没问题吧。
    sandideas
        13
    sandideas  
    OP
       2015-07-20 12:29:19 +08:00
    @loading cpu超了也会么。。好像cpu占用是挺高的。。i7下都占用10+...
    sandideas
        14
    sandideas  
    OP
       2015-07-20 12:30:12 +08:00
    @msg7086
    没去设置。。我觉得应该够吧。。那我去设置下虚拟内存。
    sandideas
        15
    sandideas  
    OP
       2015-07-20 12:30:52 +08:00
    @paw virtual memory是unlimited。。
    sandideas
        16
    sandideas  
    OP
       2015-07-20 12:33:06 +08:00
    @kqz901002 看了下。。这样是为了防止退出ssh被自动关掉么。。但是我连上去后就没关掉。。眼睁睁的看着他显示被kill。。
    sandideas
        17
    sandideas  
    OP
       2015-07-20 12:33:45 +08:00
    @lcqtdwj 对。。。我看了好几次,基本就在70上下。
    kqz901002
        18
    kqz901002  
       2015-07-20 13:07:35 +08:00   1
    @sandideas是的 nohup $command&
    neoblackcap
        19
    neoblackcap  
       2015-07-20 13:12:58 +08:00   1
    @sandideas 贴代码是最快的,你还是贴下代码让大家review一下
    knightlhs
        20
    knightlhs  
       2015-07-20 13:45:15 +08:00   2
    @sandideas 不贴代码很难确认

    从代码的角度思考
    问题可能有:
    1、是否有内存泄露
    2、CPU突发峰值是否超标
    3、内存突发峰值是否超标

    从服务器的角度考虑
    问题可能有:
    1、服务器参数是否虚标 是否超售 特别是 OVZ的类型 内存严重不足
    2、CPU是否被严格限制在一定的指标

    其他暂时还没想到
    msg7086
        21
    msg7086  
       2015-07-20 14:01:55 +08:00   1
    @sandideas 首先你要看的是commit charge,这个关系到进程是否被kill。
    sandideas
        22
    sandideas  
    OP
       2015-07-20 14:08:24 +08:00   1
    @knightlhs
    @msg7086
    @neoblackcap
    @kqz901002
    非常感谢你们回复。。
    找到原因了,因为系统和mysql之类的会占用到百分之40左右的内存。
    而我的代码会在刚开始一段时间从70多到200+。然后才会稳定到70多。。
    原本默认的swap才100m。。我改成1g就够了。这样就不会被系统kill掉了。
    新手。。莫笑。
    sandideas
        23
    sandideas  
    OP
       2015-07-20 14:09:16 +08:00
    @knightlhs cpu超的话会导致进程被kill么。。我看cpu在vps里面一直占到90+。。
    sandideas
        24
    sandideas  
    OP
       2015-07-20 14:12:56 +08:00 via iPhone
    @neoblackcap
    @knightlhs
    不贴代码是因为实在写的渣。。好多异常懒得处理直接忽视了。。
    试运行可以了再优化代码。
    knightlhs
        25
    knihtlhs  
       2015-07-20 14:13:25 +08:00
    @sandideas
    这个要看主机商的设定 我这里无法粗浅的下结论
    一般的中小型VPS提供商 长时间占用CPU不但会kill 还会封帐号
    但是也是有区分的 有些专供计算类的云产品 是可以长时间高负荷的 只是价格比较喜人
    具体你要问问你的服务商 具体的要求是什么了
    sandideas
        26
    sandideas  
    OP
       2015-07-20 14:21:21 +08:00 via iPhone
    @knightlhs 了解了。。那我发个tk问一下客服
    zts1993
        27
    zts1993  
       2015-07-20 14:37:19 +08:00   1
    一般主机的后台会有监控 可以查看 CPU内存的使用历史记录
    sandideas
        28
    sandideas  
    OP
       2015-07-20 20:20:42 +08:00
    http://paste.ubuntu.com/11908931/

    @knightlhs
    @neoblackcap
    @icedx
    我还是贴代码吧。。
    虽然可以运行,但是swap速度太慢了。
    开了是个线程内存就会涨到300+
    icedx
        29
    icedx  
       2015-07-21 02:45:58 +08:00   1
    我感觉是你这个bs4 的对象没有被及时回收
    开始代码 soup=BeautifulSoup(page)
    sandideas
        30
    sandideas  
    OP
       2015-07-21 07:59:57 +08:00 via iPhone
    @icedx 好的。。我试试
    sandideas
        31
    sandideas  
    OP
       2015-07-21 09:18:01 +08:00
    @icedx 回收是怎么回收。。我直接del soup不行。。没发现soup有close。。
    icedx
        32
    icedx  
       2015-07-21 10:53:14 +08:00
    @sandideas 应该是函数执行结束后自动回收... 但是多线程下 内存使用瞬间飙升
    sandideas
        33
    sandideas  
    OP
       2015-07-21 11:03:36 +08:00
    @icedx 那就没解决办法了么。。一般爬虫是怎么写的,都会内存占用很多么。
    knightlhs
        34
    knightlhs  
       2015-07-21 11:09:17 +08:00   1
    @sandideas
    我对python不熟悉 我说一下我在go上写爬虫的思路
    首先 你的解析器不需要每个线程上都new一个
    采集线程上只要抓取到页面的信息就OK了 降低负载
    采集回来的信息放进 队列里面 等待解析器统一处理(单例)因为这个玩意大多是单线程的
    解析结果 出来以后 分析是否是列表 还是正文
    如果是列表 那么返回采集队列 继续抓取
    如果是正文 就可以保存了

    一般系统开销都不在 采集这块 我一般可以开到 30-50个并发
    解析器可以多实现几个 分布式 处理 通过 队列随机分配
    这样就可以有效的降低 负载
    供你参考
    sandideas
        35
    sandideas  
    OP
       2015-07-21 11:16:05 +08:00
    @knightlhs 多谢。。我这个最早是单线程的,后来觉得速度慢按照样例改成多线程的。
    的确是没想过解析器不需要多线程。
    待会有空改一下试试。。
    knightlhs
        36
    knightlhs  
       2015-07-21 11:24:48 +08:00   1
    @sandideas
    速度慢的问题 一般都不在采集跟解析 回头你自己写一个分析下
    写入这块你分离出来 用一个单例实现 看看采集完成的时间 (不记写入时间)
    我觉得你速度慢的原因可能在写入 磁盘效率不高 导致队列阻塞了
    如果是这也原因的话 换保存方式 比如 mysql
    sandideas
        37
    sandideas  
    OP
       2015-07-21 12:06:22 +08:00
    @knightlhs 好的。非常感谢
    sandideas
        38
    sandideas  
    OP
       2015-07-21 12:09:52 +08:00
    @knightlhs 那cpu占用很高会有哪些原因。。我在I7下都会达到20%。。。没有多少循环嵌套啊。
    正则匹配的时候会占用很多CPU么。
    knightlhs
        39
    knightlhs  
       2015-07-21 15:32:44 +08:00
    @sandideas 正则的效率确实不高 你需要使用一些基于DOM的解析引擎
    icedx
        40
    icedx  
       2015-07-21 19:55:19 +08:00
    @sandideas 你要吧bs4 处理的过程放在独立的函数里 不要返回bs4 对象
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1335 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 17:13 PVG 01:13 LAX 10:13 JFK 13:13
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86