sys_getloadavg()
Aprende sobre la función PHP sys_getloadavg(): qué hace, cómo funciona y ejemplos de uso práctico.
Este artículo cubre la función PHP sys_getloadavg(), incluyendo una descripción general, cómo funciona y ejemplos de uso.
Introducción a la función sys_getloadavg()
La función sys_getloadavg() es una función PHP integrada que recupera el promedio de carga del sistema. Ten en cuenta que solo está disponible en sistemas similares a Unix (Linux, macOS) y no funcionará en Windows, donde devuelve false. Se puede usar para monitorear el rendimiento del sistema y optimizar la asignación de recursos.
La función no toma argumentos y devuelve un array que contiene tres números de punto flotante — los promedios de carga del sistema en 1, 5 y 15 minutos:
sys_getloadavg(): arrayQué significa realmente "promedio de carga"
El promedio de carga es el número promedio de procesos que se están ejecutando en la CPU o esperando por ella (o por E/S de disco) durante una ventana de tiempo determinada. Los tres valores permiten ver una tendencia:
$load[0]— carga durante el último 1 minuto (más reciente, más volátil).$load[1]— carga durante los últimos 5 minutos.$load[2]— carga durante los últimos 15 minutos (más suavizada, mejor para tendencias).
Una regla general aproximada: divide la carga por el número de núcleos de CPU. Una carga de 1 minuto de 4.0 en una máquina de 4 núcleos significa que la CPU está aproximadamente completamente utilizada; el mismo valor en una máquina de 1 núcleo significa que está seriamente sobrecargada. Por eso casi siempre se normaliza la carga contra el recuento de núcleos antes de actuar sobre ella.
Cómo usar la función sys_getloadavg()
Usar la función sys_getloadavg() es sencillo. Devuelve un array de promedios de carga, que se debe verificar en cuanto a su longitud antes de acceder a índices específicos. Aquí tienes un ejemplo:
Cómo usar la función sys_getloadavg()
En este ejemplo, llamamos a sys_getloadavg() y asignamos el array devuelto a $load. Verificamos que el array contenga al menos tres elementos antes de mostrar los promedios de carga de 1, 5 y 15 minutos.
Normalización de la carga respecto a los núcleos de CPU
Dado que un número de carga en bruto no tiene significado sin saber cuántos núcleos tiene la máquina, una verificación práctica de salud divide la carga por el recuento de núcleos y la compara con un umbral. Puedes leer el recuento de núcleos desde /proc/cpuinfo en Linux (o nproc):
<?php
function cpuCoreCount(): int
{
// Linux: count processor entries in /proc/cpuinfo
if (is_readable('/proc/cpuinfo')) {
$cpuinfo = file_get_contents('/proc/cpuinfo');
return max(1, substr_count($cpuinfo, 'processor'));
}
// Fallback for other systems
return (int) (shell_exec('nproc') ?: 1);
}
$load = sys_getloadavg();
$cores = cpuCoreCount();
$perCore = $load[0] / $cores;
if ($perCore > 1.0) {
echo "WARNING: system is overloaded (" . round($perCore, 2) . " per core)\n";
} else {
echo "OK: load per core is " . round($perCore, 2) . "\n";
}
?>Aquí $load[0] / $cores convierte la carga absoluta en una cifra por núcleo: un valor superior a 1.0 significa que hay más procesos ejecutables que núcleos, por lo que el trabajo se está acumulando en cola.
Consideraciones de rendimiento
La función sys_getloadavg() es una herramienta útil para monitorear el rendimiento del sistema. Sin embargo, lee directamente del kernel del sistema operativo y no es computacionalmente costosa. En aplicaciones web de alto tráfico, sigue siendo una buena práctica evitar llamarla en cada solicitud para minimizar la sobrecarga innecesaria. Úsala para monitoreo periódico o verificaciones de diagnóstico en lugar de en bucles ajustados o secciones críticas de rendimiento.
Conclusión
En conclusión, sys_getloadavg() proporciona una forma rápida de recuperar los promedios de carga del sistema en sistemas similares a Unix. Al normalizar el resultado contra el número de núcleos de CPU y verificar el array devuelto, puedes monitorear eficazmente el rendimiento del sistema.
Para otras herramientas de diagnóstico y temporización, consulta microtime() para temporización de alta resolución, time() para la marca de tiempo Unix actual, y syslog() para enviar las alertas resultantes al registrador del sistema. Para inspeccionar el array devuelto en sí, count() se usa en los ejemplos anteriores.