Regarding ionice - on linux the impact of the ionice -c3 class is similar to that of nice, because the CPU "niceness" is taken into account when calculating the io niceness.
proc_nice
(PHP 5)
proc_nice — Modificar la prioridad del proceso actual
Descripción
proc_nice() modifica la prioridad del proceso actual por la cantidad especificada en increment. Un increment positivo reducirá la prioridad del proceso actual, mientras que un increment negativo la incrementará.
proc_nice() no está relacionada con proc_open() y sus funciones asociadas en ninguna forma.
Parámetros
- increment
-
El valor de incremento del cambio de prioridad.
Valores devueltos
Devuelve TRUE en caso de éxito o FALSE en caso de error. Si ocurre un error, como que el usuario carezca de permisos para modificar la prioridad, un error de nivel E_WARNING es generado también.
Notas
Note: Disponibilidad
proc_nice() existirá únicamente si su sistema tiene soporte para 'nice'. 'nice' está definido de acuerdo a los estándares: SVr4, SVID EXT, AT&T, X/OPEN, BSD 4.3. Esto quiere decir que proc_nice() no está disponible en Windows.
If a process is reniced, then all its children inherit that niceness. So a PHP script can call proc_nice on itself, then invoke system(), and the command executed via system() will also be niced.
Also worth making a note of ionice. There's no PHP function for this, but it's important. A nice'd program will happily try to chew up all i/o bandwidth with very little CPU usage, it can therefore make the entire computer non-responsive despite the programmer's intention. Use "ionice -c3" or see "man ionice"
Simple function for check process nice, by default returns nice of current process:
<?php
public static function getProcessNice ($pid = null) {
if (!$pid) {
$pid = getmypid ();
}
$res = `ps -p $pid -o "%p %n"`;
preg_match ('/^\s*\w+\s+\w+\s*(\d+)\s+(\d+)/m', $res, $matches);
return array ('pid' => (isset ($matches[1]) ? $matches[1] : null), 'nice' => (isset ($matches[2]) ? $matches[2] : null));
}
?>
Just an addition to the previous note re: exec('renice...'). The exit_func() will not set the priority back to normal (0) (at least on linux), unless the user that the webserver is running as is a super user (bad idea). You can decrease the priority of the running task, but not increase it again. See man page for renice.
To prevent subsequent requests running at the lower priority I called apache_child_terminate() on shutdown.
If you don't have PHP5 and needs to nice your process this works good.
<?php
function proc_nice($priority) {
exec("renice +$priority ".getmypid());
}
//You also need a shutdown function if you don't want to leave your http deamons with a modified priority
function exit_func(){
// Restore priority
proc_nice(0);
}
register_shutdown_function('exit_func');
?>
