/proc/stat: расчёт долей CPU по двум снимкам
Разберите накопленное время CPU в proc/stat. Рассчитайте долю за интервал, исключите повторный учёт guest и явно укажите трактовку idle и iowait.
Один счётчик не показывает текущий процент
Строка cpu содержит большие числа, которые растут во время работы системы. Это накопленное время в состояниях, а не проценты, готовые для диаграммы. Чтобы описать короткий интервал, нужны два сопоставимых снимка.
В этой странице мы выбираем конкретную метрику: долю учтённого времени вне idle и iowait. Название важно: другое решение о включении iowait даст другой результат, и оба графика нельзя сравнивать без пояснения формулы.
Какие колонки суммировать
Первые восемь состояний после cpu — user, nice, system, idle, iowait, irq, softirq и steal. Значения выражены в USER_HZ. guest уже включён в user, а guest_nice — в nice; добавление их ещё раз даёт двойной учёт.
Для выбранной метрики берут прирост суммы первых восьми полей и вычитают прирост idle и iowait. Полученную разницу делят на общий прирост. iowait имеет ограничения достоверности и может уменьшаться; подозрительное окно нельзя молча превращать в красивый процент.
Получите строки для сравнения
Команды печатают только агрегированную строку cpu. Не смешивайте её со строками cpu0 и cpu1: они описывают другой масштаб.
grep -E "^cpu " /proc/stat
sleep 2
grep -E "^cpu " /proc/stat
getconf CLK_TCKПроверьте формулу на собственных числах
Учебные приросты первых восьми полей: 120, 0, 40, 600, 30, 0, 10, 0. Сумма равна 800, вне idle и iowait остаётся 170. Результат выбранной формулы: 170 / 800 × 100 = 21.25%. Эти числа заданы для проверки арифметики, а не сняты с вашей машины.
Если общий прирост нулевой или появились несопоставимые значения, не делите и не подставляйте нулевой процент. Проверьте перезагрузку, источник и длительность окна. При переводе тиков в секунды используйте установленное CLK_TCK; в отношении одинаковых единиц оно сокращается.
Проверьте своё рассуждение
Задача: к сумме первых восьми приростов добавили guest. Почему график мог измениться даже без новой нагрузки?
Время гостя посчитали повторно. Для этой формулы guest и guest_nice не добавляются отдельно: они уже входят в более ранние категории. Определение общей суммы должно быть зафиксировано до расчёта.
Процент всей машины не равен бюджету cgroup
Агрегированное время CPU нельзя напрямую считать долей разрешённой квоты конкретного контейнера. Для него исследуйте cpu.max и cpu.stat. Изменение доступных CPU, виртуализация и особенности учёта ядра требуют отдельного пояснения при сравнении длительных периодов.
Технические источники
Использованы для проверки поведения. Объяснения и учебные сценарии созданы для проекта.
- Linux man-pages — proc_stat(5)
Проверка текста: 2026-09-11. Нативное исполнение на всей матрице дистрибутивов ещё не подтверждено.
Нужны собственная Linux-система, смонтированный procfs и Bash. Доступность полей зависит от ядра, его конфигурации, прав и пространств имён. Примеры только читают диагностические интерфейсы; браузерный симулятор их не реализует.
От материала к практике
Выберите следующую тему в каталоге Linux или проверьте знакомые команды в учебном терминале.