Linux `top` команда: сколько памяти процесса физически хранится в пространстве подкачки?
Допустим, я запускаю свою программу на 64-битной машине Linux с 64 ГБ ОЗУ. В моей очень маленькой C-программе сразу после запуска я делаю
void *p = sbrk(1024ull * 1024 * 1024 * 120);
это продвигает мой сегмент данных на 120 Гб.
После того, как выше sbrk
вызов top
запись для моего процесса показывает RES
при некотором низком значении, VIRT
в 120g
, а также SWAP
в 120g
,
После этой операции я что-то записываю в первые 90 Гб вышеупомянутого региона
memset(p, 0xAB, 1024ull * 1024 * 1024 * 90);
Это вызывает некоторые изменения в top
запись для моего процесса: VIRT
как ожидается, остается на 120g
, RES
становится почти 64g
, SWAP
падает около 56g
,
Общее Swap
статистика в заголовке top
Вывод показывает, что использование файла подкачки увеличивается, что ожидается, так как моей программе придется вставить около 26 ГБ страниц памяти в файл подкачки.
Итак, согласно приведенным выше наблюдениям, SWAP
столбец просто сообщает, что мой процесс неRES
адресное пространство независимо от того, материализовано ли это адресное пространство, т.е. независимо от того, записал ли я что-либо в эту область виртуальной памяти.
Но есть ли способ выяснить, сколько из этого SWAP
размер на самом деле был "материализован" и зарезервирован чем-то, хранящимся в файле подкачки? Т.е. есть ли способ сделать top
отобразить это значение 26 Гб для моего процесса?
1 ответ
Поведение зависит от версии procps, которую вы используете. Например, в версии 3.0.5 значение SWAP равно:
task->size - task->resident
и это именно то, с чем вы сталкиваетесь. Человек топ.1 говорит:
VIRT = SWAP + RES
Procps-ng, однако, читает / proc / pid / status и правильно устанавливает SWAP
https://gitlab.com/procps-ng/procps/blob/master/proc/readproc.c#L383
Таким образом, вы можете обновить procps или посмотреть на / proc / pid / status напрямую