Неполадка в отчетах по памяти Linux
Я получаю несоответствие использования памяти между meminfo и ps. Free сообщает гораздо меньше свободной памяти, чем то, что процессы, по-видимому, используют в соответствии с ps.
Согласно бесплатному, у меня есть только 3188mb бесплатно:
free -m
total used free shared buffers cached
Mem: 15360 13273 2086 0 79 1022
-/+ buffers/cache: 12171 3188
Swap: 0 0 0
Я пытаюсь отследить, где происходит память, используя ps (снимок ниже значений не 0 RSS):
ps -A --sort -rss -o comm,pmem,rss
COMMAND %MEM RSS
mysqld 13.1 2062272
java 6.2 978072
ruby 0.7 114248
ruby 0.7 114144
squid 0.1 30716
ruby 0.0 11868
apache2 0.0 10132
apache2 0.0 9092
apache2 0.0 8504
PassengerHelper 0.0 5784
sshd 0.0 3008
apache2 0.0 2420
apache2 0.0 2228
bash 0.0 2120
sshd 0.0 1708
rsyslogd 0.0 1164
PassengerLoggin 0.0 880
ps 0.0 844
dbus-daemon 0.0 736
sshd 0.0 736
ntpd 0.0 664
squid 0.0 584
cron 0.0 532
ntpd 0.0 512
exim4 0.0 504
nrpe 0.0 496
PassengerWatchd 0.0 416
dhclient3 0.0 344
mysqld_safe 0.0 316
unlinkd 0.0 284
logger 0.0 252
init 0.0 200
getty 0.0 120
Однако это не имеет смысла, поскольку добавление столбца RSS приводит к общему использованию памяти только вокруг 3287mb, который должен оставить почти 12gb бесплатно!
Я использую ядро 2.6.16.33-xenU # 2 SMP x86_64 на Amazon AWS.
Где моя память? Может ли кто-нибудь пролить свет на то, как отслеживать это?
Ответы
Ответ 1
Проверьте использование кеша Slab (Slab:
, SReclaimable:
и SUnreclaim:
в /proc/meminfo
). Это кеш-структура в ядре данных и отдельно от кэша страниц, сообщенного free
.
Если кеш-память сбрасывается для большой части вашей "пропавшей памяти", проверьте /proc/slabinfo
, чтобы увидеть, куда она исчезла. Если это зубцы или inodes, вы можете использовать sync ; echo 2 > /proc/sys/vm/drop_caches
, чтобы избавиться от них.
Вы также можете использовать инструмент slabtop
, чтобы показать текущее использование кэша Slab в дружественном формате. c
сортирует список по текущему размеру кеша.
Ответ 2
Вы не можете просто добавить столбцы RSS или VSZ, чтобы получить объем используемой памяти. К сожалению, использование памяти в Linux намного сложнее. Для более подробного описания см. Общие сведения об использовании памяти в Linux, в котором объясняется, как разделяемые библиотеки распределяются между процессами, но с двойным подсчетом такими инструментами, как ps
.
Я не знаю, как бесплатно вычисляет числа, которые он отображает, но если вам нужна дополнительная информация, вы всегда можете выкопать исходный код.
Ответ 3
Я считаю, что вам не хватает значений разделяемой памяти. Я не думаю, что ps
сообщает об общей ОЗУ как часть поля RSS. Сравните с полем top
RES, чтобы увидеть.
Конечно, если вы добавляете в общую RAM, сколько вы добавляете? Поскольку он используется совместно, то одна и та же оперативная память может отображаться на многих разных процессах.
Вы можете попытаться решить эту проблему путем творческого разбора файлов /proc/ [pid]/smaps.
Но все же, это только поможет вам в этом. Некоторые страницы памяти совместно используются, но учитываются как резидентные. Эти страницы становятся доступными после вызова fork()
. Они могут стать неразделенными в любое время, но до тех пор, пока они не будут учитываться в общей используемой системной ОЗУ. Файл proc smaps также не показывает их.