Автор популярной заметки разобрался, что на самом деле означают циферки в утилите htop. Оказывается, load average 1.0 на двухъядерной машине — это не 50% загрузки CPU, а чуть сложнее.
Числа в строке load average (за 1, 5 и 15 минут) берутся из файла /proc/loadavg. Это не просто среднее арифметическое за последнюю минуту, а экспоненциально затухающее скользящее среднее. Грубо говоря, в 1-минутном показателе 63% веса приходится на последнюю минуту, а 37% — на всю историю системы с момента запуска. Подсчёт ведётся по числу процессов в состоянии running (на CPU или в очереди на него) и uninterruptible sleep (ждущих диска или сети). Поэтому по load average нельзя точно судить о загрузке CPU — высокий load может быть из-за процессов, которые висят на дисковом I/O.
Дальше разбираются состояния процессов (колонка S в htop). R — процесс работает или ждёт очереди на CPU. S — interruptible sleep, процесс ждёт какого-то события (например, сигнала), его можно прервать. D — uninterruptible sleep, «страшный» сон: процесс ждёт I/O (обычно диска или NFS) и не реагирует на сигналы, его нельзя убить через kill -9. Z — зомби: процесс завершился, но родительский процесс не прочитал его код возврата. Зомби не жрут память, только занимают PID. T — процесс остановлен сигналом (например, CTRL+Z). t — процесс под отладчиком (gdb).
Автор показывает, как заглянуть внутрь системы через strace и файлы в /proc/<PID>/. Например, откуда uptime берёт данные — из /proc/uptime. И как passwd может писать в защищённый /etc/shadow — из-за setuid-бита на файле /usr/bin/passwd: программа запускается от владельца root, а не от пользователя.