如何限制Python进程的I / O消耗(可能使用ionice)?

时间:2009-03-31 18:23:07

标签: python linux performance unix

我希望一组特定的Python子进程尽可能低影响。我已经在使用nice来帮助限制CPU消耗。但理想情况下I / O也会受到限制。 (如果持怀疑态度,请幽默我,并假设这样做有价值;无论运行多长时间都没关系,可能会有很多,并且有更高优先级的东西(通常)继续同一台机器等。)

一种可能性似乎是ionice。是否有任何现有的Python包用于调用ionice(谷歌没有发现任何东西)?编写代码来简单地运行ionice命令并不困难;但我宁愿避免编写别人编写/测试的代码;有时会有微妙的边缘情况等等。而且,是否有更好的方法来限制I / O消耗?

man page for ionice表明ionice值可能受nice值的影响,但运行此Python 2.6脚本似乎反驳了这一点,即使对于{{1}的子进程也是如此值继承:

nice

具有以下输出:

$ uname -as
Linux x.fake.org 2.6.27-11-server #1 SMP Thu Jan 29 20:13:12 UTC 2009 x86_64 GNU/Linux
$ ./foo.py
**** niced to:  None  ****
***  parent  ***
nice: 0
ionice: none: prio 4
***  child  ***
nice: 0
ionice: none: prio 4
**** niced to:  19  ****
***  parent  ***
nice: 19
ionice: none: prio 4
***  child  ***
nice: 19
ionice: none: prio 4

3 个答案:

答案 0 :(得分:14)

psutil公开了这个功能(python 2.4 - > 3.2):

import psutil, os
p = psutil.Process(os.getpid())
p.ionice(psutil.IOPRIO_CLASS_IDLE)

此外,从Python 3.3开始,这也将在python stdlib中提供: http://bugs.python.org/issue10784

答案 1 :(得分:5)

Hm中

作为开始指针,您应该在内核中找到syscallioprio_set系统调用的ioprio_get个数字。我建议您签入/usr/include/asm/unistd_32.h/usr/include/asm/unistd_64.h,具体取决于您的内核拱;如果没有,请从syscall(2)手册页的建议开始,该手册应该是/usr/include/sys/syscall.h并按照您的方式工作。

鉴于此,您应该使用ctypes,àla:

def ioprio_set(which, who, ioprio):
    rc= ctypes.CDLL('libc.so.6').syscall(289, which, who, ioprio)
    # some error checking goes here, and possibly exception throwing

就是这样,或多或少。玩得开心:))

答案 2 :(得分:3)

为什么不让启动过程对它们进行电离(即用ionice运行它们)而不是让它们自身离子化?看起来好多了。