メモリの断片化
Linux システムがしばらく実行されていると、実行されているアプリケーションの性質に大きく依存するメモリの断片化が増加する可能性があります。メモリを割り当てて解放するプロセスが増えるほど、メモリの断片化が速くなります。また、カーネルは、要求されたサイズに対して十分なメモリを時間どおりに最適化できない場合があります。これが発生すると、使用可能な空きメモリが十分にある場合でも、アプリケーションはより大きな連続したメモリ チャンクを割り当てることができない場合があります。RHEL4 や SLES9 などの 2.6 カーネル以降では、メモリ管理が大幅に改善され、メモリの断片化の問題が少なくなりました。
メモリの断片化を確認するには、魔法の SysRq キーを使用できます。次のコマンドを実行するだけです。
# echo m > /proc/sysrq-trigger
このコマンドは、現在のメモリ情報を /var/log/messages にダンプします。RHEL3 32 ビット システムの例を次に示します。
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 メモリの断片化を示しています。2 行目は低メモリの断片化を示し、3 行目は高メモリの断片化を示しています。出力には、低メモリ領域でのメモリの断片化が示されています。ただし、High Memory 領域には、28 4MB などの大きなメモリ チャンクが多数あります。
メモリ情報が /var/log/messages にダンプされていない場合、SysRq は有効になっていません。sysrq を 1 に設定すると、SysRq を有効にできます。
# echo 1 > /proc/sys/kernel/sysrq
2.6 カーネル (RHEL4 および SLES9) 以降では、メモリ情報をダンプするために SysRq は必要ありません。/proc/buddyinfo でメモリの断片化を簡単に確認できます。
2.6 カーネルを実行している 64 ビット サーバーの出力を次に示します。
# 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/