W3docs

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(): array

Cosa 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()

php— editable, runs on the server

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().

Pratica

Pratica
Qual è lo scopo della funzione sys_getloadavg() in PHP?
Qual è lo scopo della funzione sys_getloadavg() in PHP?
Was this page helpful?