Як повідомляється про використання пам'яті в Linux?


17

Використовуючи ps, я бачу розмір, vsize (такий же, як VIRT? Top) та rss (такий же, як RES RES top?). (Ще одне, що я бачу вгорі - SHR.)

Чи може хтось підсумувати для мене, що означають ці різні поля?


Я скоріше побачу приємний підсумок на цій сторінці, ніж посилання, яке може зникнути, щоб ця сторінка могла жити як посилання.
Джим Ханзікер

Відповіді:


34

Коротко:

  • Віртуальний розмір: це кількість адресного простору, яким керує процес. Віртуальний простір адрес містить усе, до чого процес може отримати доступ через покажчики (посилання на адресу пам'яті). Наприклад, якщо ваша програма отримує доступ до фреймбуфера вашої відеокарти, ця пам'ять відображається у віртуальний простір процесу та отримує адресу, яка зберігається в покажчику. Файли з картографічною пам'яттю та анонімні відображення також враховуються у розмірі віртуального адресного простору. Досить багато все у віртуальному розмірі. Якщо ви підсумуєте розмір усіх діапазонів адрес, перелічених у /proc/<pid>/maps, він повинен повернути вам приблизно однакове значення віртуального розміру.

  • Розмір резидента: це об'єм пам'яті, який належить конкретно тому процесу, який наразі є резидентом пам'яті. Це означає, що об'єм пам'яті, який не знаходиться в свопі. Зауважте, що частини процесу можуть перебувати в обмінній пам’яті, навіть коли процес працює. Операційна система витягне ці регіони зі свопу, коли процес намагається отримати доступ до нього. Сюди слід віднести купу, стеки всіх потоків та інші приватні відображення. Якщо ви подивіться /proc/<pid>/maps, то [stack], [heap]і інші анонімні відображення (ті без шляхів до файлів), або замінені або враховуються в резидентном.

  • Спільний розмір: це об'єм пам'яті, який може належати до декількох процесів. Наприклад, якщо у вас в пам’яті завантажено чотири екземпляри одного додатка, у вас буде чотири екземпляри купи та принаймні чотири стеки, по одному для кожного процесу (це пам'ять резидента), але у вас буде лише один екземпляр двійковий код програми та її бібліотек. Це спільний простір. Він включає не лише програмний бінарний код та його бібліотеки, але також файли локалізації, сегменти пам'яті лише для читання, сегменти пам'яті спільного використання SysV та POSIX, семафори тощо. Якщо ви подивитесь /proc/<pid>/maps, більшість відображень, прив’язаних до бібліотечних та програмних файлів, спільний.

Зауважте, що VIRT містить об'єднання RSS і SHR і завжди буде більше, ніж будь-який з них. Можуть бути регіони, які обліковуються як RSS, так і SHR.


2
Між іншим, на останніх версіях linux можна побачити дуже детальний розподіл використання пам'яті в / proc / <pid> / smaps
bdonlan

1
Загальний розмір пам'яті , який може бути загальним. Якщо програма є єдиним користувачем бібліотеки, бібліотека зберігатиметься в пам'яті за допомогою одного процесу. Таким чином, навіть спільна пам'ять може бути "обробленою" пам'яттю.
Хуберт Каріо

6

У відповіді Джуліано:

Зауважте, що RSS + SHR <= VIRT, завжди.

Це просто помилково. SHR містить всю віртуальну пам'ять, яку можна було б поділити з іншими процесами, а RSS містить всю пам'ять фізично в оперативній пам'яті, яка використовується процесом.

Таким чином, вся спільна пам'ять, що знаходиться в даний момент в оперативній пам'яті, зараховується як в SHR, так і в RSS, тому SHR + RSS не має значення, оскільки вона може містити кількість дублікатів.

Щоб побудувати процес за допомогою RSS + SHR> VIRT, просто mmap великий файл (1 Гб), а потім прочитайте його повністю: файл mmaped буде завантажений в оперативну пам'ять, а VIRT, SHR і RSS будуть трохи більшими за 1 Гб, тому SHR + RSS> VIRT.


Так, це було більше твердження про VIRT, ніж інші два. Я мав на увазі більше про об'єднання RSS і SHR, ніж їх суму, тобто VIRT містить і RSS, і SHR. Погане математичне подання.
Джуліано
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.