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 напрямую

Другие вопросы по тегам