Как посмотреть нагрузку на машину через консоль
Что проверяют
Умеете ли вы быстро понять на сервере, во что упёрлась система: процессор, память, диск или сеть. Python-разработчику часто добавляют вопрос, почему процесс с потоками грузит только одно ядро.
Как отвечать
Идите от общей картины к конкретному процессу:
uptimeилиcat /proc/loadavg: load average за 1, 5 и 15 минут. Сравнивать его надо с числом ядер изnproc: 4 на четырёхъядерной машине это полная загрузка, на шестнадцатиядерной пустяк;topиhtop: процессы по CPU и памяти, строка%Cpu(s)с разбивкойus,sy,wa,st. Высокийwaозначает ожидание диска, высокийstговорит, что гипервизор отдаёт ваше процессорное время соседям;vmstat 1: очередь процессовr, свопsiиso, ожидание ввода-вывода, обновление раз в секунду;free -h: смотреть на колонкуavailable, а неfree, память подbuff/cacheядро отдаст по требованию;iostat -x 1из пакета sysstat: загрузка дисков,%utilи задержкиawait;pidstatиss -s: нагрузка по процессам во времени и сводка по сокетам.
Для Python добавьте инструменты уровня процесса. py-spy top --pid 1234 показывает, в каких функциях сидит работающий интерпретатор, без перезапуска и правки кода. В самом коде ту же картину даёт psutil, а os.getloadavg() возвращает load average.
Про GIL: CPU-bound код в потоках обычного CPython упирается в одно ядро, и top покажет около 100% на процесс при простаивающих остальных ядрах. Выход: multiprocessing, ProcessPoolExecutor или сборка без GIL, которая с Python 3.13 доступна как отдельный вариант интерпретатора.
Где спотыкаются
Читают load average как проценты. Это средняя длина очереди, и на Linux в неё входят процессы, ждущие диска в состоянии D, поэтому высокая нагрузка бывает при почти свободном процессоре.
Паникуют, увидев мало свободной памяти. Кэш страниц это нормально, тревожный признак это активный своп в vmstat.
Смотрят top внутри контейнера и видят ресурсы всего хоста. Реальные лимиты задаёт cgroup, их показывают docker stats или kubectl top pod.