Почему я вижу большие различия в использовании памяти с pmap для одного и того же процесса в 32-битной и 64-битной Linux? - PullRequest
3 голосов
/ 15 февраля 2012

Я настраивал новый сервер (64-битный Debian) и, пытаясь сделать процесс apache как можно более маленьким, отключил все ненужные мне модули.Затем я сравнил вывод pmap с apache на 32-битной коробке Debian с большим количеством модулейЯ был очень удивлен, увидев, что «оптимизированный» на 64-битной машине, похоже, потребляет гораздо больше памяти.

pmap -d (только итоговая строка) показывает:

64bit: mapped: 188584K    writeable/private: 14680K    shared: 72K

32bit: mapped: 33824K    writeable/private: 7304K    shared: 888K

Присмотритесь к выходу.Я вижу различия в распределении памяти для .so libs.Взяв в качестве примера libc ...

64bit:

00007f9988e8d000    1380 r-x-- 0000000000000000 008:00001 libc-2.11.3.so

00007f9988fe6000    2044 ----- 0000000000159000 008:00001 libc-2.11.3.so

00007f99891e5000      16 r---- 0000000000158000 008:00001 libc-2.11.3.so

00007f99891e9000       4 rw--- 000000000015c000 008:00001 libc-2.11.3.so

32bit:

b7501000    1364 r-x-- 0000000000000000 008:00001 libc-2.7.so

b7656000       4 r---- 0000000000155000 008:00001 libc-2.7.so

b7657000       8 rw--- 0000000000156000 008:00001 libc-2.7.so

Так чтоРазница - вторая строка в 64-битном выходе.Я не могу найти какое-либо объяснение для этих распределений с Mode = "-----", и каждый .so, кажется, имеет один, и размер всегда 2044 или 2048.

Это как-то связано с памятьюраспределение на 64-разрядных машинах, и я действительно получу значительно меньше процедур на ГБ ОЗУ, чем на 32-разрядной машине?

1 Ответ

3 голосов
/ 16 февраля 2012

После дальнейших исследований я наконец нашел эту статью , в которой говорится, что эти строки "-----" 2 МБ в выводе pmap не указывают на фактическое использование памяти, а представляют собой причуду того, как адресное пространствоиспользуется на 64-битной по соображениям производительности.Ниже приводится краткая сводка:

"Заявления о том, что приложения с большим количеством общих библиотек в 64-разрядной системе Linux используют на 2 МБ больше общей библиотеки, чем они фактически занимают. Это не требует затрат ОЗУ или пространства подкачки,просто адресное пространство внутри каждого процесса, которого в изобилии имеется на 64-битных платформах. Основная причина заключается в том, чтобы поддерживать эффективное распределение библиотек, но реализация немного странная. "

Я все еще нахожутрудно поверить, что было так сложно найти информацию об этой фундаментальной ошибке / функции в том, как сообщается об использовании памяти процесса в 64-битной Linux!

...