Co to jest “load average”
Zauważyłem że bardzo dużo ludzi ma mylną opinię nt. tego co pokazuje linuksowy “load average” ( cat /proc/loadavg ). Niektórzy zakładają że loadavg = 1 to 100% obciążenie procka, inni że 100% obciążenie procesora to loadavg równy 1 * liczba rdzeni. Nic bardziej błędnego ;].
Load average mówi o jednej rzeczy, ile procesów jest w stanie “running” (czyli robi coś lub “chce” coś robić), nieważne czy korzystają właśnie z procka czy czekają na dane z dysku. Na przykład, po odpaleniu
dd if=/dev/sda of=/dev/null bs=1M
loadavg skoczy o około 1 (więcej jezeli inne procesy chcą dane z dysku) podczas gdy dd
będzie obciązał jakieś 10% procka (test na zwykłych dyskach, na SSD z racji szybkości raczej więcej). Czyli w skrócie loadavg generuje aplikacja która obciąża procek lub przetwarza/czeka na I/O, więc może dojść do sytuacji że loadavg skacze do 20 mimo że procek obciążony jest ledwo w połowie (np. serwer www czytający dane z dysku w paru wątkach).
Jaki z tego wniosek ? Loadavg jest bezużyteczne jeżeli nie jest powiązane z innymi wskaźnikami obciążenia jak obciążenie CPU, czy ilość ops/sek dysku, ale w porównaniu z nimi można szybko wywnioskować gdzie jest bottleneck, np. “duże loadavg – małe obciążenie CPU = I/O zapchane”, “loadavg = liczbie rdzeni, procesor zapchany na maksa = i/o daje rade, aplikacja jest CPU-bound” (lub obciążenie jest równe między IO i CPU).