Me gustaría que un conjunto particular de subprocesos de Python tenga el menor impacto posible. Ya estoy usando nice para ayudar a limitar el consumo de CPU. Pero, idealmente, la E/S también sería limitada. (Si es escéptico, por favor, cuénteme y suponga que hay valor en hacer esto, no importa cuánto tarden en correr, puede haber muchos, y hay cosas de mayor prioridad (por lo general) en el misma máquina, etc.)Cómo limitar el consumo de E/S de los procesos de Python (posiblemente usando ionice)?
Una posibilidad parece ser ionice
. ¿Hay algún paquete de Python existente para invocar ionice
(Google no apareció nada)? No sería difícil escribir código para simplemente ejecutar el comando ionice
; pero preferiría evitar escribir código que alguien más ha escrito/probado; a veces hay casos de bordes sutiles, etc. Y, ¿existe una mejor manera de limitar el consumo de E/S?
El man page for ionice sugiere que el valor ionice
puede verse afectada por el valor nice
, pero la ejecución de este 2.6 script Python parece desmentir que, incluso para los procesos secundarios, donde se hereda el valor 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()
Que tiene el siguiente resultado:
$ 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
Arreglo fresco, desearía que estuviera disponible para OSX. –
sí ... lamentablemente OSX simplemente no lo expone de forma nativa. –
Asegúrate de que tu dispositivo de bloque tenga programador CFQ. De lo contrario, no funcionará. – Zorg