Використовуючи ps, я бачу розмір, vsize (такий же, як VIRT? Top) та rss (такий же, як RES RES top?). (Ще одне, що я бачу вгорі - SHR.)
Чи може хтось підсумувати для мене, що означають ці різні поля?
Використовуючи ps, я бачу розмір, vsize (такий же, як VIRT? Top) та rss (такий же, як RES RES top?). (Ще одне, що я бачу вгорі - SHR.)
Чи може хтось підсумувати для мене, що означають ці різні поля?
Відповіді:
Коротко:
Віртуальний розмір: це кількість адресного простору, яким керує процес. Віртуальний простір адрес містить усе, до чого процес може отримати доступ через покажчики (посилання на адресу пам'яті). Наприклад, якщо ваша програма отримує доступ до фреймбуфера вашої відеокарти, ця пам'ять відображається у віртуальний простір процесу та отримує адресу, яка зберігається в покажчику. Файли з картографічною пам'яттю та анонімні відображення також враховуються у розмірі віртуального адресного простору. Досить багато все у віртуальному розмірі. Якщо ви підсумуєте розмір усіх діапазонів адрес, перелічених у /proc/<pid>/maps
, він повинен повернути вам приблизно однакове значення віртуального розміру.
Розмір резидента: це об'єм пам'яті, який належить конкретно тому процесу, який наразі є резидентом пам'яті. Це означає, що об'єм пам'яті, який не знаходиться в свопі. Зауважте, що частини процесу можуть перебувати в обмінній пам’яті, навіть коли процес працює. Операційна система витягне ці регіони зі свопу, коли процес намагається отримати доступ до нього. Сюди слід віднести купу, стеки всіх потоків та інші приватні відображення. Якщо ви подивіться /proc/<pid>/maps
, то [stack]
, [heap]
і інші анонімні відображення (ті без шляхів до файлів), або замінені або враховуються в резидентном.
Спільний розмір: це об'єм пам'яті, який може належати до декількох процесів. Наприклад, якщо у вас в пам’яті завантажено чотири екземпляри одного додатка, у вас буде чотири екземпляри купи та принаймні чотири стеки, по одному для кожного процесу (це пам'ять резидента), але у вас буде лише один екземпляр двійковий код програми та її бібліотек. Це спільний простір. Він включає не лише програмний бінарний код та його бібліотеки, але також файли локалізації, сегменти пам'яті лише для читання, сегменти пам'яті спільного використання SysV та POSIX, семафори тощо. Якщо ви подивитесь /proc/<pid>/maps
, більшість відображень, прив’язаних до бібліотечних та програмних файлів, спільний.
Зауважте, що VIRT містить об'єднання RSS і SHR і завжди буде більше, ніж будь-який з них. Можуть бути регіони, які обліковуються як RSS, так і SHR.
У відповіді Джуліано:
Зауважте, що RSS + SHR <= VIRT, завжди.
Це просто помилково. SHR містить всю віртуальну пам'ять, яку можна було б поділити з іншими процесами, а RSS містить всю пам'ять фізично в оперативній пам'яті, яка використовується процесом.
Таким чином, вся спільна пам'ять, що знаходиться в даний момент в оперативній пам'яті, зараховується як в SHR, так і в RSS, тому SHR + RSS не має значення, оскільки вона може містити кількість дублікатів.
Щоб побудувати процес за допомогою RSS + SHR> VIRT, просто mmap великий файл (1 Гб), а потім прочитайте його повністю: файл mmaped буде завантажений в оперативну пам'ять, а VIRT, SHR і RSS будуть трохи більшими за 1 Гб, тому SHR + RSS> VIRT.