当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何限制Python进程的I/O消耗(可能使用ionice)?》经验,为你挑选了2个好方法。

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

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

ionice的手册页表明该ionice值可能会受到值的影响nice,但运行此Python 2.6脚本似乎反驳了这一点,即使对于nice继承了值的子进程:

#!/usr/bin/env python

import os
import multiprocessing

def print_ionice(name):
    print '*** ', name, ' ***'
    os.system("echo -n 'nice: '; nice")
    os.system("echo -n 'ionice: '; ionice -p%d" % os.getpid())

for niced in (None, 19):
    if niced: os.nice(niced)
    print '**** niced to: ', niced, ' ****'
    print_ionice('parent')
    subproc = multiprocessing.Process(target=print_ionice, args=['child'])
    subproc.start()
    subproc.join()

其中有以下输出:

$ 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

Giampaolo Ro.. 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> Giampaolo Ro..:

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



2> tzot..:

嗯.

作为开始指针,您应该找到内核中的syscall数字ioprio_setioprio_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

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

推荐阅读
重庆制造漫画社
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有