Ответ 1
Фрагментация памяти
Когда система Linux работает в течение некоторого времени, фрагментация памяти может увеличиться, что сильно зависит от характера приложений, которые на ней работают. Чем больше процессов выделяет и освобождает память, тем быстрее память становится фрагментированной. И ядро не всегда может дефрагментировать достаточное количество памяти для запрашиваемого размера во времени. Если это произойдет, приложениям не удастся выделить большие смежные фрагменты памяти, даже если имеется достаточно свободной памяти. Начиная с ядра 2.6, то есть RHEL4 и SLES9, управление памятью значительно улучшилось, а фрагментация памяти стала меньше проблемой.
Чтобы увидеть фрагментацию памяти, вы можете использовать магический ключ SysRq. Просто выполните следующую команду:
# echo m > /proc/sysrq-trigger
Эта команда будет выгружать текущую информацию о памяти в /var/log/messages. Ниже приведен пример 32-разрядной системы RHEL3:
Jul 23 20:19:30 localhost kernel: 0*4kB 0*8kB 0*16kB 1*32kB 0*64kB 1*128kB 1*256kB 1*512kB 1*1024kB 0*2048kB 0*4096kB = 1952kB)
Jul 23 20:19:30 localhost kernel: 1395*4kB 355*8kB 209*16kB 15*32kB 0*64kB 0*128kB 0*256kB 0*512kB 0*1024kB 0*2048kB 0*4096kB = 12244kB)
Jul 23 20:19:31 localhost kernel: 1479*4kB 673*8kB 205*16kB 73*32kB 21*64kB 847*128kB 473*256kB 92*512kB 164*1024kB 64*2048kB 28*4096kB = 708564kB)
В первой строке показана фрагментация памяти DMA. Во второй строке показана фрагментация с низкой памятью, а в третьей строке показана фрагментация высокой памяти. На выходе показана фрагментация памяти в области с низкой памятью. Но есть много больших блоков памяти, доступных в области высокой памяти, например. 28 4 МБ.
Если информация о памяти не была сброшена в /var/log/messages, тогда SysRq не был включен. Вы можете включить SysRq, установив sysrq в 1:
# echo 1 > /proc/sys/kernel/sysrq
Начиная с ядра 2.6, то есть RHEL4 и SLES9, вам не нужна SysRq для вывода информации о памяти. Вы можете просто проверить /proc/buddyinfo для фрагментации памяти.
Вот результат работы 64-битного сервера с ядром 2.6:
# cat /proc/buddyinfo
Node 0, zone DMA 5 4 3 4 3 2 1 0 1 1 2
Node 0, zone Normal 1046 527 128 36 17 5 26 40 13 16 94
# echo m > /proc/sysrq-trigger
# grep Normal /var/log/messages | tail -1
Jul 23 21:42:26 localhost kernel: Normal: 1046*4kB 529*8kB 129*16kB 36*32kB 17*64kB 5*128kB 26*256kB 40*512kB 13*1024kB 16*2048kB 94*4096kB = 471600kB
#
В этом примере я снова использовал SysRq, чтобы показать, к чему относится каждое число в /proc/buddyinfo.
Источник: http://www.puschitz.com/pblog/