Как ограничить потребление I / O процессов Python (возможно, используя ионизацию)?

Я хотел бы, чтобы определенный набор подпроцессов Python был как можно более низким. Я уже использую красиво, чтобы помочь ограничить потребление ЦП. Но в идеале ввод-вывод также будет ограничен. (Если скептически, пожалуйста, юмористируйте меня и предположите, что есть ценность в этом, неважно, сколько времени они будут выполнять, их может быть много, и есть более высокоприоритетные вещи (обычно), происходящие на такой же машины и т. д.)

Одна из возможностей представляется ionice . Существуют ли какие-либо существующие пакеты Python для вызова ionice (Google ничего не обнаружил)? Нетрудно написать код, чтобы просто запустить команду ionice ; но я бы предпочел не писать код, который кто-то еще написал / протестировал; иногда есть тонкие краевые случаи и т. д. И есть ли лучший способ ограничить потребление ввода-вывода?

Страница руководства для ионики предполагает, что на значение ionice может влиять nice значение, но выполнение этого сценария Python 2.6, по-видимому, опровергает это, даже для дочерних процессов, где наследуемое значение наследуется:

 #!/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
 **** нарезанный до: Нет ****
 *** родительский ***
 хорошо: 0
 ионика: нет: prio 4
 *** ребенок ***
 хорошо: 0
 ионика: нет: prio 4
 **** на питание: 19 ****
 *** родительский ***
 хорошо: 19
 ионика: нет: prio 4
 *** ребенок ***
 хорошо: 19
 ионика: нет: prio 4

3 Solutions collect form web for “Как ограничить потребление I / O процессов Python (возможно, используя ионизацию)?”

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

Гектометр

В качестве указателя начала вы должны найти, какой номер ioprio_set ioprio_get системные вызовы ioprio_set и ioprio_get в вашем ядре. Я предлагаю вам проверить /usr/include/asm/unistd_32.h или /usr/include/asm/unistd_64.h , в зависимости от вашей арки ядра; если нет, начните с предложения syscall(2) страницы 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 

Вот и все, более или менее. Повеселись 🙂

Почему бы не запустить какие-либо процессы на ионизацию на них (т. Е. Запустить их с помощью ионитов), а не самим ионитом? Кажется, это намного чище.

  • В сценарии Python, как установить PYTHONPATH?
  • Как выполнить автозаполнение командной строки python, но не только в начале строки
  • BrokenPipeError в Python
  • Означает ли datetime.fromtimestamp (os.path.getctime ()) в Python значение, соответствующее часовому поясу?
  • Время ожидания докера для контейнера?
  • Извлечение столбцов из текстового файла с использованием однострочного Perl: похожее на Unix cut
  • Могу ли я использовать псевдоним для выполнения программы из сценария python
  • Нет модуля с именем MySQLdb, даже если MySQL-python установлен?
  • Python - лучший язык программирования в мире.