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

2013-08-18 17:15:30 +08:00
 oldcai
用python写了个处理数据的程序,程序不是直接操作文件的,直接与硬盘打交道的是mongodb。
在每处理一条信息,就向mongodb读写一次数据的情况下,IO不到硬盘最大IO的十分之一,CPU总是在70-80%(进程数和CPU线程数相等的情况下)
在每次预读一定条数的信息来处理的话,CPU就可以基本上满起来了,IO也可以歇一会然后蹦到最大IO,然后歇一会,这样循环下来。

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

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

谢谢了。
2937 次点击
所在节点    问与答
4 条回复
timonwong
2013-08-18 18:08:54 +08:00
如果只有一个主线程处理,那瓶颈就差不多如你猜测。

>如果你使用CPython实现<

若开了多个处理线程(CPU密集),还有GIL这个因素(相当坑爹:http://blip.tv/carlfk/mindblowing-python-gil-2243379),多核下情况更糟。
wwwjfy
2013-08-18 20:29:23 +08:00
cpu操作和io异步操作就好,线程或者coroutine,可以试试不同情况,多累积几条一起做io也不会让cpu更轻松,感觉没什么意义
oldcai
2013-08-18 20:33:49 +08:00
@wwwjfy C python(官方版)不管是携程还是线程,都会吃一堆内存。
暂时没有那么多内存来吃~,所以没有这么做。
wwwjfy
2013-08-18 21:15:36 +08:00
@oldcai 不知道你的程序是否适用,我的环境是gunicorn的web server,隔一段时间就reload下,就是会把所有fork的子进程都退出然后起同样多的子进程,来减少内存消耗

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/79447

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX