V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
oldcai
0.01D
V2EX  ›  问与答

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

  •  
  •   oldcai ·
    PRO
    · Aug 18, 2013 · 3367 views
    This topic created in 4646 days ago, the information mentioned may be changed or developed.
    用python写了个处理数据的程序,程序不是直接操作文件的,直接与硬盘打交道的是mongodb。
    在每处理一条信息,就向mongodb读写一次数据的情况下,IO不到硬盘最大IO的十分之一,CPU总是在70-80%(进程数和CPU线程数相等的情况下)
    在每次预读一定条数的信息来处理的话,CPU就可以基本上满起来了,IO也可以歇一会然后蹦到最大IO,然后歇一会,这样循环下来。

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

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

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

    >如果你使用CPython实现<

    若开了多个处理线程(CPU密集),还有GIL这个因素(相当坑爹:http://blip.tv/carlfk/mindblowing-python-gil-2243379),多核下情况更糟。
    wwwjfy
        2
    wwwjfy  
       Aug 18, 2013   ❤️ 1
    cpu操作和io异步操作就好,线程或者coroutine,可以试试不同情况,多累积几条一起做io也不会让cpu更轻松,感觉没什么意义
    oldcai
        3
    oldcai  
    OP
    PRO
       Aug 18, 2013
    @wwwjfy C python(官方版)不管是携程还是线程,都会吃一堆内存。
    暂时没有那么多内存来吃~,所以没有这么做。
    wwwjfy
        4
    wwwjfy  
       Aug 18, 2013
    @oldcai 不知道你的程序是否适用,我的环境是gunicorn的web server,隔一段时间就reload下,就是会把所有fork的子进程都退出然后起同样多的子进程,来减少内存消耗
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   5354 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 39ms · UTC 08:20 · PVG 16:20 · LAX 01:20 · JFK 04:20
    ♥ Do have faith in what you're doing.