sys_getloadavg()
Scopri la funzione PHP sys_getloadavg(): panoramica, funzionamento ed esempi pratici per monitorare le prestazioni del sistema.
Questo articolo tratta la funzione PHP sys_getloadavg(), inclusa una panoramica, il suo funzionamento ed esempi di utilizzo.
Introduzione alla funzione sys_getloadavg()
La funzione sys_getloadavg() è una funzione PHP integrata che recupera il carico medio del sistema. È disponibile solo su sistemi Unix-like (Linux, macOS) e non funziona su Windows, dove restituisce false. Può essere utilizzata per monitorare le prestazioni del sistema e ottimizzare l'allocazione delle risorse.
La funzione non accetta argomenti e restituisce un array contenente tre numeri in virgola mobile — le medie del carico del sistema nell'ultimo 1, 5 e 15 minuti:
sys_getloadavg(): arrayCosa significa effettivamente "load average"
Il load average è il numero medio di processi in esecuzione sulla CPU o in attesa di essa (o di I/O su disco) in un determinato intervallo di tempo. I tre valori permettono di osservare un andamento:
$load[0]— carico nell'ultimo 1 minuto (più recente, più volatile).$load[1]— carico negli ultimi 5 minuti.$load[2]— carico negli ultimi 15 minuti (più stabile, utile per i trend).
Una regola pratica: dividere il carico per il numero di core della CPU. Un carico a 1 minuto di 4.0 su una macchina con 4 core significa che la CPU è sostanzialmente al massimo della sua capacità; lo stesso valore su una macchina con un solo core indica un grave sovraccarico. Ecco perché è quasi sempre necessario normalizzare il carico rispetto al numero di core prima di intervenire.
Come utilizzare la funzione sys_getloadavg()
L'utilizzo della funzione sys_getloadavg() è semplice. Restituisce un array di medie del carico, il cui numero di elementi dovrebbe essere verificato prima di accedere agli indici specifici. Ecco un esempio:
Come utilizzare la funzione sys_getloadavg()
In questo esempio, chiamiamo sys_getloadavg() e assegniamo l'array restituito a $load. Verifichiamo che l'array contenga almeno tre elementi prima di visualizzare le medie del carico a 1, 5 e 15 minuti.
Normalizzazione del carico rispetto ai core della CPU
Poiché un valore di carico grezzo è privo di significato senza sapere quanti core ha la macchina, un controllo pratico dello stato di salute divide il carico per il numero di core e lo confronta con una soglia. Il numero di core può essere letto da /proc/cpuinfo su Linux (oppure tramite 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";
}
?>Qui $load[0] / $cores converte il carico assoluto in un valore per core: un valore superiore a 1.0 indica che ci sono più processi eseguibili che core, quindi il lavoro si sta accodando.
Considerazioni sulle prestazioni
La funzione sys_getloadavg() è uno strumento utile per monitorare le prestazioni del sistema. Tuttavia, legge direttamente dal kernel del sistema operativo e non è computazionalmente costosa. Nelle applicazioni web ad alto traffico, è comunque buona pratica evitare di chiamarla ad ogni richiesta per ridurre al minimo il sovraccarico non necessario. Utilizzarla per monitoraggi periodici o controlli diagnostici, piuttosto che in cicli stretti o sezioni critiche per le prestazioni.
Conclusione
In conclusione, sys_getloadavg() fornisce un modo rapido per recuperare le medie del carico di sistema su sistemi Unix-like. Normalizzando il risultato rispetto al numero di core della CPU e verificando l'array restituito, è possibile monitorare efficacemente le prestazioni del sistema.
Per altri strumenti diagnostici e di temporizzazione, vedere microtime() per la temporizzazione ad alta risoluzione, time() per il timestamp Unix corrente e syslog() per inviare gli avvisi risultanti al logger di sistema. Per ispezionare l'array restituito, negli esempi precedenti viene utilizzata count().