Назад | Перейти на главную страницу

Как интерпретировать вывод команды Linux «top»?

После обсуждения ВОТ о том как PHP-FPM потребляя память, я только что обнаружил проблему с чтением памяти в top команда. Вот скриншот моего top сразу после перезапуска PHP-FPM. Все нормально: около 20 PHP-FPM процессы, каждый из которых потребляет 5,5 МБ памяти (0,3% от общего объема).

Вот старый сервер прямо перед перезапуском PHP-FPM (через сутки после предыдущего перезапуска). Здесь у нас еще около 25 PHP-FPM с двойным использованием памяти (10 МБ, что составляет 0,5% от общего объема). Таким образом, общий объем используемой памяти должен составлять 600-700 МБ. Тогда почему было использовано 1,6 ГБ памяти?

TL; DR 1

Ваш сервер находится внутри какого-то виртуозного / openvz /Virtualization-du-jour контейнер. Попытки разобраться в использовании памяти - дело ветряных мельниц.

TL; DR 2

Linux съел вашу оперативную память! Но ничего страшного, это касается всех.


Длинная история

Давайте разберемся!

в Mem: раздел у нас есть:

  • $n total: объем физической оперативной памяти на вашем компьютере
  • $n used: сколько памяти потребляет Linux, а не только сумма процессов.
  • $n free: Сколько оперативной памяти не потребляет Linux. При этом не учитывается, что кэшированная и буферизованная память, по сути, «свободна».
  • $n buffers: буферное пространство - это место, где хранятся блоки дискового ввода-вывода, которые были прочитаны или ожидают записи. Буфер - это представление в ОЗУ одного блока диска.

в Swap: раздел у нас есть:

  • $n total: Понятно. Объем дискового пространства, доступного для подкачки страниц.
  • $n used: Понятно. Сколько места на диске используется для подкачки.
  • $n free: Herp Derp.
  • $n cache: Близко к описанным выше буферам. На самом деле это часть кеша страницы, и у него нет места на физическом диске. Не беспокойтесь о деталях этого разговора.

Самое интересное происходит, когда вы бежите free -m. Вы увидите три строки, и все числа будут соответствовать верхнему. В качестве примера приведу свой компьютер:

             total       used       free     shared    buffers     cached
Mem:          8070       7747        323          0        253       5713
-/+ buffers/cache:       1780       6290
Swap:         5055          0       5055

Строка Mem показывает общий объем ОЗУ в мегабайтах ($n total вверху), сколько используется ($n usedвверху), сколько бесплатно ($n free вверху), сколько разделено (не обращайте на это внимания), и теперь наступает самое интересное! В buffers и cached столбцы в free -m коррелируют с предсказуемо $n buffers и $n cache. Но взгляните на вторую строку free -m что начинается с -/+ buffers/cache:. Математика показывает, что использованное количество действительно (всего) - ((used-buffers) -cached). Бесплатно (всего) - (theNewUsed).

Что все это значит? Это означает, что Linux съел вашу оперативную память! Вкратце, ядро ​​Linux поглощает оперативную память, поскольку ее можно использовать для кэширования диска. Вы ничего не можете с этим поделать, если только не захотите скомпилировать собственное ядро. Совет профессионала: Не надо.

ОЗУ действительно есть, и процессы могут использовать ее по своему усмотрению. Вот что имеется в виду под -/+ buffers/cache: ряд в free -m. Однако вы находитесь внутри контейнера виртуализации без гипервизора, что делает вещи немного скучными. На данном этапе вы просто не можете оценить свою память с точностью до байта. Однако вы не видите ужасно необычного поведения.

Сохраняйте спокойствие и продолжайте. Кроме того, приобретите физический сервер (если вам не нравится статистика памяти, которая выглядит так, как будто Крескин - ваш системный администратор).

Top - не лучший способ проверить использование памяти. Однако, поскольку мой вопрос был отмечен как дубликат этого вопроса, я размещу здесь свое решение.

Я читал на Форум этот ps_mem.py проверит использование памяти за вас.

Репозиторий: https://github.com/pixelb/ps_mem/

Скачать:

pip install ps_mem

Использование:

ps_mem

Вывод:

# ps_mem
 Private  +   Shared  =  RAM used   Program

  4.0 KiB +  15.5 KiB =  19.5 KiB   udevd
  4.0 KiB +  16.0 KiB =  20.0 KiB   mysqld_safe
  4.0 KiB +  25.5 KiB =  29.5 KiB   dbus-daemon
  4.0 KiB +  27.5 KiB =  31.5 KiB   xinetd
 60.0 KiB +  14.5 KiB =  74.5 KiB   epmd
108.0 KiB +  23.0 KiB = 131.0 KiB   init
  8.0 KiB + 135.0 KiB = 143.0 KiB   saslauthd (2)
180.0 KiB +  34.0 KiB = 214.0 KiB   check_scripts.s
796.0 KiB +  41.0 KiB = 837.0 KiB   bash
528.0 KiB + 359.0 KiB = 887.0 KiB   crond (7)
  1.2 MiB + 218.0 KiB =   1.4 MiB   sshd (2)
  1.6 MiB +  45.0 KiB =   1.6 MiB   rsyslogd
  2.0 MiB + 133.0 KiB =   2.1 MiB   beam.smp
  1.3 MiB +   2.3 MiB =   3.6 MiB   httpd (8)
 12.8 MiB + 956.0 KiB =  13.8 MiB   sendmail.sendmail (7)
 53.5 MiB + 114.0 KiB =  53.7 MiB   mysqld
317.6 MiB +   2.3 MiB = 320.0 MiB   python (6)
---------------------------------
                        398.5 MiB
=================================