Как пользоваться программой top в Linux
Что проверяют
Умеете ли вы по top быстро понять, во что упирается сервис на сервере: в CPU, в память или в диск. Следом для Go-разработчика обычно спрашивают, почему у сервиса огромный VIRT и почему RES не падает после сборки мусора.
Как отвечать
Шапка top:
- load average: средняя длина очереди за 1, 5 и 15 минут. В Linux сюда входят и процессы в состоянии
D, ждущие диск, поэтому высокий load не всегда означает нехватку CPU; - строка
%Cpu(s):usпользовательский код,syядро,waожидание ввода-вывода,stвремя, отнятое гипервизором у виртуалки; - память: смотрите на
avail Mem, а не наfree, страничный кэш ядро отдаст по первому требованию.
В таблице процессов важны RES (занятая физическая память), VIRT, %CPU и состояние: R, S, D, Z. Клавиши: P и M сортируют по CPU и памяти, 1 раскрывает ядра, c показывает полную команду, H переключает на потоки, k посылает сигнал. Для одного процесса top -p <pid>, для логов и скриптов пакетный режим top -b -n 1.
Теперь привязка к Go:
%CPUбольше 100: норма для многопоточного процесса, процент считается от одного ядра;- огромный
VIRT: рантайм заранее резервирует адресное пространство, это не расход памяти; RESне падает сразу: память после GC возвращается ОС постепенно, в фоне. Верхнюю границу для кучи задают черезGOMEMLIMIT;- потоков больше, чем
GOMAXPROCS: блокирующие системные вызовы и cgo занимают отдельные потоки ОС, это видно поH.
top отвечает на вопрос «кто ест ресурсы», а на вопрос «где в коде» отвечает pprof.
Где спотыкаются
Пугаются VIRT в гигабайтах и называют это утечкой. Смотреть нужно на RES в динамике и на метрики рантайма.
Запускают top внутри контейнера и верят цифрам памяти и ядер. Он показывает ресурсы хоста, а не лимиты cgroup. Сам Go начиная с 1.25 учитывает CPU-лимит cgroup при выборе GOMAXPROCS, а top нет.
Путают load average с процентом загрузки CPU. Load 8 на машине с 16 ядрами и с 2 ядрами означает совершенно разное.