ビュー:

現象

Deep Security Agent Linux版を使用している環境で、syslog(/var/log/messagesなど)に次のようなメッセージが記録されます。コールトレースに[dsa_filter]を含む行が表示されます。

Sep 4 11:37:45 server01 kernel: httpd: page allocation failure. order:2, mode:0x20
Sep 4 11:37:45 server01 kernel: Pid: 14364, comm: httpd Tainted: P --------------- 2.6.32-220.el6.x86_64 #1
Sep 4 11:37:45 server01 kernel: Call Trace:
Sep 4 11:37:45 server01 kernel: [<ffffffff8112c257>] ? __alloc_pages_nodemask+0x757/0x8d0
Sep 4 11:37:45 server01 kernel: [<ffffffffa02b7fb4>] ? upd_sched+0x24/0x570 [dsa_filter]
Sep 4 11:37:45 server01 kernel: [<ffffffff81166d92>] ? kmem_getpages+0x62/0x170
Sep 4 11:37:45 server01 kernel: [<ffffffff811679aa>] ? fallback_alloc+0x1ba/0x270
Sep 4 11:37:45 server01 kernel: [<ffffffff811673ff>] ? cache_grow+0x2cf/0x320
Sep 4 11:37:45 server01 kernel: [<ffffffff81167729>] ? ____cache_alloc_node+0x99/0x160
Sep 4 11:37:45 server01 kernel: [<ffffffffa02ce81d>] ? __tb_alloc+0xed/0x360 [dsa_filter]
Sep 4 11:37:45 server01 kernel: [<ffffffff811684f9>] ? __kmalloc+0x189/0x220
Sep 4 11:37:45 server01 kernel: [<ffffffffa02ce81d>] ? __tb_alloc+0xed/0x360 [dsa_filter]
...

また、次のようなメッセージが記録される場合があります。

Sep 4 16:40:32 server02 kernel: tb_dom_init:150 mod:conntrack init failed, rc=-10001
Sep 4 16:40:32 server02 kernel: dsa_init:93 core init failed, rc=-10001
Sep 4 16:40:32 server02 kernel: dsa: filter load failed, rc=-10001
...

 

この現象は次のようなタイミングで発生します。

  • Deep Security Agentがパケットを処理している際
  • Deep Security ManagerからAgentへポリシーを送信した際

原因

このメッセージはDeep Security Agentのカーネルモジュールが、連続したメモリ領域の割り当てに失敗した際に表示されます。

メモリの割り当てに失敗する要因は主に次の2つが考えられます。

  • システムの空きメモリが不足している
  • システムの空きメモリはあるが、断片化のために連続したメモリ領域が確保できない

現象発生時のDeep Securityの動作

このメッセージが表示されてメモリ割り当てが失敗した場合でも、メモリ確保を再試行します。次のようなイベントが発生していない限り、再試行によりメモリは確保されてパケットの処理や設定のアップデートは正常に行われています。

ファイアウォールイベント

  • 内部エンジンエラー (ID:120)

侵入防御イベント

  • メモリ割り当ての失敗 (ID:201)
  • メモリの割り当てエラー (ID:305)

システムイベント

  • 設定のアップデートの失敗 (ID:721)

なお、メモリを確保するためにシステムのスワップ領域が使用される場合があります。搭載物理メモリに対してスワップ領域の容量が少ない場合、効率的に連続したメモリ領域を確保できないために、スワップ処理によるシステム全体のパフォーマンス劣化が長時間継続することがあります。

対処方法

システムの空きメモリが不足している場合は、メモリを追加してください。

システムに空きメモリがあるにも関わらず現象が発生する場合は、メモリが断片化している可能性があります。 OSを再起動する事でメモリの断片化は解消されます。 また、適用しているルールの数を必要最小限に抑える事によって、Deep Securityが必要とするカーネルメモリの量が削減された結果として、メモリ断片化の進行を緩和できます。それ以外のメモリ断片化の解消や軽減の方法については、OSベンダーにお問い合わせください。

Deep Security Agentのカーネルモジュールは、ネットワーク上のトラフィックが発生する都度カーネルメモリの割り当ておよび解放を繰り返します。

また、単一のパケットを診断するために必要となるカーネルメモリの量は、適用されているルールの数に比例します。

そのため、Deep Security Agentの稼働中には、停止時と比較してカーネルメモリの使用量が増加し、カーネルメモリが断片化しやすくなるのは必然となります。

メモリ断片化の根本原因の追求や断片化を根底から防ぐような対処と言った観点で調査を依頼されても、解決不可能な事実をご認識頂いた上で、OSベンダーにはシステムの再起動を伴わないメモリ断片化の解消・緩和策についてご相談ください。

参考

メモリ断片化の状況は /proc/buddyinfo で確認できます。次の例のように「DMA32」の行の数値が左側の値が大きく、右側の値が小さいほどメモリが断片化しています。

顕著に断片化している例

# cat /proc/buddyinfo
Node 0, zone DMA 2 1 1 1 0 2 1 0 1 1 1
Node 0, zone DMA32 10794 629 22 0 0 0 0 0 0 1 0
Node 0, zone Normal 1273 12 7 4 5 2 2 2 1 0 0

断片化が軽度な例

# cat /proc/buddyinfo
Node 0, zone DMA 1 4 2 2 3 0 0 0 1 1 3
Node 0, zone DMA32 5 6 3 7 9 9 9 10 8 6 691
Node 0, zone Normal 133 472 219 116 44 7 3 1 4 4 37