V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
oldcai
V2EX  ›  问与答

IO,CPU都没到顶,处理速度上不去,请问瓶颈可能在哪里

  •  
  •   oldcai · 2013-08-18 17:15:30 +08:00 · 3008 次点击
    这是一个创建于 4115 天前的主题,其中的信息可能已经有所发展或是发生改变。
    用python写了个处理数据的程序,程序不是直接操作文件的,直接与硬盘打交道的是mongodb。
    在每处理一条信息,就向mongodb读写一次数据的情况下,IO不到硬盘最大IO的十分之一,CPU总是在70-80%(进程数和CPU线程数相等的情况下)
    在每次预读一定条数的信息来处理的话,CPU就可以基本上满起来了,IO也可以歇一会然后蹦到最大IO,然后歇一会,这样循环下来。

    我猜想的是,硬盘读写导致运算中断,所以在进程数和CPU线程数一样的时候,相当于每个CPU线程都是在运算中间等待硬盘读写中断,所以导致这样的结果。

    可惜内存不够了,开不了多几个进程来验证这个想法,如果是这样的话,我就考虑加个内存。

    谢谢了。
    4 条回复    1970-01-01 08:00:00 +08:00
    timonwong
        1
    timonwong  
       2013-08-18 18:08:54 +08:00   ❤️ 1
    如果只有一个主线程处理,那瓶颈就差不多如你猜测。

    >如果你使用CPython实现<

    若开了多个处理线程(CPU密集),还有GIL这个因素(相当坑爹:http://blip.tv/carlfk/mindblowing-python-gil-2243379),多核下情况更糟。
    wwwjfy
        2
    wwwjfy  
       2013-08-18 20:29:23 +08:00   ❤️ 1
    cpu操作和io异步操作就好,线程或者coroutine,可以试试不同情况,多累积几条一起做io也不会让cpu更轻松,感觉没什么意义
    oldcai
        3
    oldcai  
    OP
       2013-08-18 20:33:49 +08:00
    @wwwjfy C python(官方版)不管是携程还是线程,都会吃一堆内存。
    暂时没有那么多内存来吃~,所以没有这么做。
    wwwjfy
        4
    wwwjfy  
       2013-08-18 21:15:36 +08:00
    @oldcai 不知道你的程序是否适用,我的环境是gunicorn的web server,隔一段时间就reload下,就是会把所有fork的子进程都退出然后起同样多的子进程,来减少内存消耗
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1001 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 23:06 · PVG 07:06 · LAX 15:06 · JFK 18:06
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.