После обсуждения ВОТ о том как 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 ГБ памяти?
Ваш сервер находится внутри какого-то виртуозного / openvz /Virtualization-du-jour контейнер. Попытки разобраться в использовании памяти - дело ветряных мельниц.
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
=================================