web-dev-qa-db-ja.com

説明できないoomkiller

十分なメモリが利用可能であることがわかったときに、カーネルがこのoomkillerを発行する理由を理解できません。

見てみると十分なメモリがあると思います

正常

DMA

通常のフリーライン

これは、256MBのRAMを搭載した組み込みNANDフラッシュベースのデバイスです。

カーネル:2.6.31

 myshellscript invoked oom-killer: gfp_mask=0xd0, order=2, oomkilladj=0 
 Backtrace: 
 [<c0106494>] (dump_backtrace+0x0/0x110) from [<c03641a0>] (dump_stack+0x18/0x1c) 
 r6:000000d0 r5:c9040c60 r4:00000002 r3:c0448690 
 [<c0364188>] (dump_stack+0x0/0x1c) from [<c015a314>] (oom_kill_process.clone.11+0x60/0x1b4) 
 [<c015a2b4>] (oom_kill_process.clone.11+0x0/0x1b4) from [<c015a738>] (__out_of_memory+0x154/0x178) 
 r8:c21e86e0 r7:001fb000 r6:00000002 r5:000000d0 r4:c9b6e000 
 [<c015a5e4>] (__out_of_memory+0x0/0x178) from [<c015a980>] (out_of_memory+0x68/0xa0) 
 [<c015a918>] (out_of_memory+0x0/0xa0) from [<c015d230>] (__alloc_pages_nodemask+0x42c/0x520) 
 r5:00000002 r4:000000d0 
 [<c015ce04>] (__alloc_pages_nodemask+0x0/0x520) from [<c015d388>] (__get_free_pages+0x18/0x44) 
 [<c015d370>] (__get_free_pages+0x0/0x44) from [<c0109418>] (get_pgd_slow+0x1c/0xe0) 
 [<c01093fc>] (get_pgd_slow+0x0/0xe0) from [<c0129ab0>] (mm_init.clone.43+0xb0/0xf0) 
 r7:c90858c0 r6:00000000 r5:c90858c0 r4:ce1a6680 
 [<c0129a00>] (mm_init.clone.43+0x0/0xf0) from [<c0129c40>] (mm_alloc+0x34/0x44) 
 r6:0009230c r5:c90858c0 r4:ce1a6680 r3:00000000 
 [<c0129c0c>] (mm_alloc+0x0/0x44) from [<c0180f70>] (bprm_mm_init+0x14/0x148) 
 r4:c5154000 r3:cd472564 
 [<c0180f5c>] (bprm_mm_init+0x0/0x148) from [<c01812d0>] (do_execve+0xa8/0x254) 
 [<c0181228>] (do_execve+0x0/0x254) from [<c0106000>] (sys_execve+0x3c/0x5c) 
 [<c0105fc4>] (sys_execve+0x0/0x5c) from [<c0102e80>] (ret_fast_syscall+0x0/0x2c) 
 r7:0000000b r6:0009230c r5:0009237c r4:000922fc 
 Mem-info: 
 DMA per-cpu: 
 CPU 0: hi: 18, btch: 3 usd: 0 
 Normal per-cpu: 
 CPU 0: hi: 42, btch: 7 usd: 0 
 Active_anon:28162 active_file:16 inactive_anon:18037 
 inactive_file:13 unevictable:0 dirty:0 writeback:0 unstable:0 
 free:9998 slab:2447 mapped:164 pagetables:701 bounce:0 
 DMA free:17128kB min:1560kB low:1948kB high:2340kB active_anon:51068kB inactive_anon:10320kB active_file:24kB inactive_file:0kB unevictable:0kB present:97536kB pages_scanned:0 all_unreclaimable? no 
 lowmem_reserve[]: 0 158 158 
 Normal free:22864kB min:2600kB low:3248kB high:3900kB active_anon:61580kB inactive_anon:61828kB active_file:40kB inactive_file:52kB unevictable:0kB present:162560kB pages_scanned:0 all_unreclaimable? no 
 lowmem_reserve[]: 0 0 0 
 DMA: 2358*4kB 912*8kB 25*16kB 0*32kB 0*64kB 0*128kB 0*256kB 0*512kB 0*1024kB 0*2048kB 0*4096kB 0*8192kB 0*16384kB = 17128kB 
 Normal: 4266*4kB 657*8kB 32*16kB 1*32kB 0*64kB 0*128kB 0*256kB 0*512kB 0*1024kB 0*2048kB 0*4096kB 0*8192kB 0*16384kB = 22864kB 
 26591 total pagecache pages 
 0 pages in swap cache 
 Swap cache stats: add 0, delete 0, find 0/0 
 Free swap = 0kB 
 Total swap = 0kB 
 65536 pages of RAM 
 10471 free pages 
 3967 reserved pages 
 2447 slab pages 
 892 shared page count 
 389 shared pages
 620 mapped shared page count
 177 mapped shared pages
 0 pages swap cached
 2481 dma reserved pages
 19892 total user pages
 20512 RSS sum by tasks
 20512 RSS sum by page stats
 164 user cache pages
 26427 kernel cache pages
2
Ankur Agarwal

では、各ビットを見ていきましょう。

アクティブメモリは、LRUスタックの最上位にスローされるメモリの領域です(基本的には頻繁に呼び出されます)。

非アクティブメモリは、あまり使用されていないものであり、メモリを交換する必要がある場合のスワップの指名です。

Freeは、約40Mbの真の空きメモリです。何が得られますか?

手がかりはこれらの行にあります:

 DMA: 2358*4kB 912*8kB 25*16kB 0*32kB 0*64kB 0*128kB 
      0*256kB 0*512kB 0*1024kB 0*2048kB 0*4096kB 0*8192kB 
      0*16384kB = 17128kB 
 Normal: 4266*4kB 657*8kB 32*16kB 1*32kB 0*64kB 0*128kB 
      0*256kB 0*512kB 0*1024kB 0*2048kB 0*4096kB 0*8192kB
      0*16384kB = 22864kB 

これはメモリの断片化を示します。これは基本的に、連続して使用可能なメモリの量を示します。そして、ここにあなたの問題があります。

空きの通常のメモリのうち、使用可能な連続メモリは32kb以下です。あなたの記憶はひどく断片化されています。これは、アプリケーションが32kを超えるスペースを割り当てる必要がある場合、メモリがないことを意味します。そのため、oom killerが到着して、これを行うためのメモリを提供するために何かをキックアウトします。

だから、あなたは何ができますか。

thatの手がかりはこれです:

Free swap = 0kB 
Total swap = 0kB 

まあ!スワップなし!だから、コミットされたメモリ-ただそこにとどまります。最近の新しいカーネルは、実際にはメモリの領域を隣接させるためにメモリを「デフラグ」しますが、古いカーネルはそれを行いません。

couldがスワップされた70Mbのメモリがありました!さらに、これは一度にすべて発生するわけではありませんが、徐々に発生するため、ヒットすることはありませんでした。しかし、スワップはないので、運はありません。また、ページキャッシュ用のメモリがほとんどないため、システムにとっても悪く、低速です。これにより、より多くの空き連続スペースが提供される可能性があります。これは、あなたにとって素晴らしいことです。

あなたへの私のアドバイス。 768Mbのスワップを入手してください。正直なところ、カーネルを有効にしないことで、カーネルに悪影響を及ぼします。

スワップは、未使用のメモリ(あなたの場合はその4分の1)を解放するために非常に重要であり、メモリとして経験した厄介な断片化の問題を回避することもできますcouldスワップアウトされ、より連続したスペースが解放されました。そして、それがスワップインされたとしても、それはcouldメモリの領域に戻され、より大きな連続したギャップを与えます。

10
Matthew Ife