Ниже приведены данные об использовании памяти mysql
и apache
соответственно на моем сервере. Согласно выводу, pmap
скажем, mysql
использует около 379M и apache
использует 277M.
[root@server ~]# pmap 10436 | grep total
total 379564K
[root@server ~]# pmap 10515 | grep total
total 277588K
Сравнивая это с выводом top
, я вижу, что значения почти совпадают.
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
10515 apache 20 0 271m 32m 3132 S 0.0 6.6 0:00.73 /usr/sbin/httpd
10436 mysql 20 0 370m 21m 6188 S 0.0 4.3 0:06.07 /usr/libexec/mysqld --basedir=....
Теперь эти значения определенно не являются текущим использованием памяти этими двумя процессами, поскольку, если бы это было так, это превысило бы 512M ram
в моей системе, и я понимаю тот факт, что это размер страниц, назначенных этим двум процессам, а не Размер памяти активно используется ими. Теперь, когда мы используем pmap -x
, я вижу дополнительную колонку, Dirty
которая показывает гораздо меньшее использование памяти для процесса. Как видно из приведенного ниже примера, Dirty
столбец показывает 15M, а не 379M в первом столбце. Мой вопрос: является ли значение в столбце Dirty
«реальным» объемом памяти, активно используемым этим процессом? Если это не так, то как мы можем узнать реальное использование памяти процессом? Нет ps
и top
по тем же причинам, что и выше. У нас есть что-нибудь под/proc
что даст эту информацию?
[root@server ~]# pmap -x 10436 | grep total
total kB 379564 21528 15340
[root@server ~]#
[root@server ~]# free -m
total used free shared buffers cached
Mem: 489 447 41 0 52 214
-/+ buffers/cache: 180 308
Swap: 1023 0 1023
[root@server ~]#
источник
Ответы:
Там нет команды, которая дает «фактическое использование памяти процесса», потому что нет такой вещи, как фактическое использование памяти процесса .
Каждая страница памяти процесса может быть (среди других различий):
Я думаю, что «грязная» фигура складывает все, что находится в оперативной памяти (не подкачки) и не поддерживается файлом. Это включает как разделяемую, так и не разделяемую память (хотя в большинстве случаев, кроме разветвления серверов, разделяемая память состоит только из отображенных в память файлов).
Отображаемая информация
pmap
поступает от и . Это реальное использование памяти процессом - его нельзя суммировать одним числом./proc/PID/maps
/proc/PID/smaps
источник
Я приведу кое-что, что я написал на странице руководства для приложения, которое выполняет анализ, аналогичный top, и извлекает информацию из тех же источников, что и
pmap
(например/proc/[N]/maps
):pmap
в основном сообщает вам информацию о виртуальном адресном пространстве . Ваше наблюдение о том, что «значения практически совпадают» вtop
выходных данных, по-видимому, относится к значению VIRT, которое сильно отличается от показателя RES. Это в точности соответствует тому, что я назвал «VirtualSz» и «ResidentSz» (VIRT для виртуальных, RES для резидентов).Нет, но вроде. «Грязная» память относится к данным, которые были загружены с диска и впоследствии изменены; поскольку он был изменен, он должен быть частью резидентной памяти, поскольку эти изменения в настоящее время хранятся в оперативной памяти. Однако это не является синонимом этого.
источник
Виртуальная память похожа на номера быстрого набора, за исключением того, что их около 3 миллиардов (для 32-битной системы, 4 миллиарда для 32-битного приложения на 64-битном ядре, и многое другое для 64-битного приложения), и вы не можете набирать номера напрямую, быть сопоставленным с быстрым набором.
Несколько процессов могут иметь разные сопоставления (номера быстрого набора) для одного и того же адреса (номера телефонов). Например, они могут совместно использовать несколько библиотек, поэтому имейте виртуальные адреса для всей библиотеки (вы можете увидеть это в pmap). Они могут даже использовать один и тот же исполняемый файл, например, 2 экземпляра bash.
Пока что это объясняет, как может подходить подпункт всех виртуальных адресов, но это еще не все. У одного процесса может быть столько виртуальной памяти, что он не должен умещаться, как? Некоторые части библиотеки или исполняемый файл могут не использоваться, они не будут скопированы с диска в оперативную память, или оперативная память заполняется, и биты, загруженные с диска, сбрасываются, поскольку при необходимости их можно извлечь с диска, или память, для которой нет резервных копий, мой диск сопоставлен для замены, скопирован для замены и затем удален. Затем он может быть прочитан из свопа, если и когда это необходимо. Если какой-либо из этих последних стратегий используется слишком много, то система становится медленной.
источник