Фактичне використання пам'яті процесу


20

Нижче наведено використання пам'яті 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=....

Тепер ці значення, безумовно, не є поточним використанням пам’яті цих двох процесів, оскільки якби це було, то воно перевищило б 512М ramу моїй системі, і я розумію той факт, що це розмір сторінок, призначених цим двом процесам, а не насправді розмір активно використовуваної ними пам'яті. Тепер, коли ми використовуємо pmap -x, я бачу додатковий стовпчик, Dirtyякий показує набагато менше використання пам'яті для цього процесу. Як видно з прикладу, показаного нижче, Dirtyколона показує 15 М на відміну від 379 М у першій колоні. Моє запитання: Чи є значення під стовпцем 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 ~]#

Відповіді:


18

Не існує команди, яка дає "фактичне використання пам'яті процесу", оскільки немає такого поняття, як власне використання пам'яті процесу .

Кожна сторінка пам'яті процесу може бути (серед інших відмінностей):

  • Тимчасове сховище, що використовується лише цим процесом.
  • Ділиться з іншими процесами за допомогою різноманітних механізмів.
  • Резервне копіювання файлу диска.
  • У фізичній пам'яті або свопі.

Я думаю, що «брудна» цифра додає все, що є в оперативній пам’яті (не підміняється) і не підтримується файлом. Сюди входить як спільна, так і неподілена пам'ять (хоча в більшості випадків, крім роздрібної роботи серверів, спільна пам'ять складається лише з файлів, відображених на пам'ять).

Інформація, що відображається, pmapнадходить із та . Це справжнє використання пам'яті процесу - він не може бути зведений одним числом./proc/PID/maps/proc/PID/smaps


6

Я нагадаю щось, що я написав на сторінці man для програми, яка робить аналіз, подібний до верхнього та черпає інформацію з тих же джерел, що і pmap(наприклад /proc/[N]/maps):

ВІРТУАЛЬНА АДРЕСНА ПРОСТОРА VS. ФІЗИЧНА ПАМ’ЯТА

Важливо розуміти різницю між віртуальним адресним простором та фізичною пам'яттю при інтерпретації деяких вищевказаних статистичних даних. Як випливає з назви, віртуальний адресний простір не є реальним; це в основному карта всієї пам'яті, яка в даний час виділена процесу. Обмеження розміру цієї карти однакове для кожного процесу (як правило, 2-4 Гб), і воно не накопичується (тобто у вас може бути десятки чи сотні процесів, кожен з яких має свою віртуальну адресу 2-4 Гб простору, у системі, яка фактично має лише 512 Мб фізичної пам'яті ).

Дані фактично не можна зберігати або отримувати з віртуального адресного простору; реальні дані потребують реальної фізичної пам'яті. Завдання ядра - керувати одним по відношенню до іншого. Статистика віртуального простору (VirtualSz, Data + Stack та Priv & Write) корисна для розгляду структури процесу та відношення до використання фізичної пам’яті, але щодо кількості реально використаної оперативної пам’яті, статистики фізичної пам’яті (ResidentSz, Share та Пропорція) - це те, що враховується.

pmapздебільшого повідомляє вам інформацію про віртуальний адресний простір . Ваше зауваження про те, що "значення майже відповідають" у topвиході, імовірно, відноситься до показника VIRT, який дуже відрізняється від показника ВДЕ. Вони точно відповідають тому, що я вище позначав "VirtualSz" та "ResidentSz" (VIRT призначений для віртуального, RES - для резидента).

Тепер, коли ми використовуємо pmap -x, я бачу додаткову колонку Dirty, яка демонструє набагато менше використання пам'яті для цього процесу. Як видно з прикладу, показаного нижче, Брудна колона показує 15 М на відміну від 379 М у першій колоні. Моє запитання: чи значення під колоною "Брудні" - це "реальний" об'єм пам'яті, який активно використовується цим процесом?

Ні, але такий собі. "Брудна" пам'ять стосується даних, завантажених з диска та згодом модифікованих; оскільки він був змінений, він повинен бути частиною пам'яті резидента, оскільки ці зміни наразі зберігаються в оперативній пам'яті. Однак це не є синонімом цього.


Я згоден. Однак від 2 до 4 ГБ призначено для 32-бітних систем. Більшість систем сьогодні є, ймовірно, 64-бітовими.
ctrl-alt-delor

3

Віртуальна пам’ять - це як номери швидкого набору, за винятком приблизно 3 мільярдів або їх (для 32-бітної системи, 4 мільярди для 32-бітного додатка на 64-бітовому ядрі, набагато більше для 64-бітного додатка), і ви не можете набирати номери прямо, вони мають відобразити для швидкого набору.

Кілька процесів можуть мати різні відображення (номери швидкого набору) для однієї адреси (номери телефонів). Наприклад, вони можуть мати спільний доступ до декількох бібліотек, тому вони мають віртуальну адресу для всієї бібліотеки (це можна побачити в pmap). Вони можуть навіть використовувати один і той же виконуваний файл, наприклад, 2 екземпляри bash.

Поки що це пояснює, як підмітка всіх віртуальних адрес може вміщуватися, але є і більше. Один процес може мати стільки віртуальної пам'яті, що він не повинен вміщуватися, як? Деякі частини бібліотеки або виконуваного файлу можуть не використовуватися, вони не будуть скопійовані з диска в оперативну пам'ять, або оперативної пам'яті заповнюється, і біти, які завантажені з диска, скидаються, тому що вони можуть бути перезабрані з диска, якщо потрібно, або пам'ять, яка не підтримується, мій диск відображається для заміни, копіюється для заміни, а потім скидається. Потім він може бути прочитаний з swap, якщо і коли це необхідно. Якщо будь-яка з цих останніх стратегій використовується занадто багато, то система стає повільною.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.