Как найти или рассчитать размер таблицы страниц процесса Linux и другой учет ядра?

Как я могу узнать, насколько велика таблица страниц процесса Linux, наряду с любым другим учетом процессов переменного размера?


person Reed Hedges    schedule 12.05.2009    source источник
comment
Я не уверен, что понял ваш вопрос: размер таблицы страниц, насколько мне известно, не зависит от процесса одной и той же платформы (ну, я могу ошибаться, я не гуру Linux ..). Кстати, интересно: вы действительно имеете в виду размер страницы table? Или вы имеете в виду размер страницы, так как он чаще нужен программистам ИМХО?   -  person yves Baumes    schedule 12.05.2009
comment
Я имею в виду объем памяти (ядра), который потребляет таблица (таблицы) страниц конкретного процесса.   -  person Reed Hedges    schedule 13.05.2009


Ответы (5)


Если вас действительно интересуют таблицы страниц, сделайте

$ cat /proc/meminfo | grep PageTables
PageTables:      24496 kB
person lothar    schedule 12.05.2009
comment
Это полезно, но мне нужно выяснить, не слишком ли велик этот размер. Если существует ограничение на этот размер, который вызовет отказ fork(), и насколько близко к этому пределу находится ядро. В идеале мне также нужно было бы выяснить, какая часть этого размера PageTables используется конкретным процессом, так что когда fork() попытается скопировать таблицы для этого процесса, предел будет превышен. - person Reed Hedges; 13.05.2009

Начиная с Linux 2.6.10, объем памяти, используемый таблицами страниц одного процесса, отображается через поле VmPTE /proc/<pid>/status.

person toojays    schedule 13.12.2012
comment
Кажется, это работает хорошо, за исключением случаев, когда я выделяю огромные страницы с помощью mmap: сообщаемый размер является небольшой константой, независимо от размера выделения (ядро 4.4.0-77). - person Tom Cornebize; 04.05.2017
comment
Значение, сообщаемое полем VmPMD, кажется нормальным, оно растет линейно с размером выделения, даже с огромными страницами. Но я не думаю, что это объясняет всю таблицу страниц (человек говорит Размер таблиц страниц второго уровня). При экспериментировании с классическими страницами это значение примерно в 500 раз ниже, чем у VmPTE. - person Tom Cornebize; 04.05.2017

Не уверен насчет Linux, но в большинстве вариантов UNIX для эта цель. Существует также утилита командной строки sysctl(8).

person D.Shawley    schedule 12.05.2009
comment
Какой Unix позволяет вам читать размер таблицы страниц (в отличие от размера страницы) через sysctl? - person eckes; 26.07.2009

Хммм, еще в Ye Olden Tymes мы вызывали nlist(3), чтобы получить системный адрес интересующих нас данных, затем открывали /dev/kmem, искали адрес, затем считывали данные. Не уверен, что это работает в Linux, но, возможно, стоит набрать «man 3 nlist» и посмотреть, что вернется.

person TMN    schedule 12.05.2009

Вы должны описать свою проблему, а не спрашивать о деталях. Если вы разветвляете слишком много (особенно с процессом, который имеет большое адресное пространство), есть все, что идет не так (включая нехватку памяти), достижение максимального размера таблицы страниц - ИМХО, не реальная проблема.

Тад сказал, что мне также было бы интересно прочитать общий ресурс таблицы страниц процесса в Linux.

Однако в качестве простого эмпирического правила вы можете предположить, что каждый процесс занимает долю в таблице страниц, которая равна его виртуальному размеру, например, 6 байт для каждой страницы. Так, например, если у вас есть база данных Oracle с 8 ГБ SGA и 500 процессов, совместно использующих ее, каждый из процессов будет использовать 14 МБ таблицы страниц, что приводит к 7 ГБ таблиц страниц + 8 ГБ SGA. (примеры номеров из http://kevinclosson.wordpress.com/2009/07/25/little-things-doth-crabby-make-%E2%80%93-part-ix-sometimes-you-должны-действительно-действительно-хотеть-ваши-огромные-страницы/)

person eckes    schedule 25.07.2009
comment
О, кстати, некоторые цифры с огромными страницами теперь: kevinclosson.wordpress.com/2009/07/28/ - person eckes; 29.07.2009