当我看到有足够的内存可用时,我无法理解为什么内核会发出这个恶意杀手?
我说足够的内存后可以看看
正常
DMA
正常的免费线路
这是一款基于256MB RAM的embedded式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
好吧,让我们一一浏览一下。
活动内存是被扔到LRU堆栈顶部的内存区域(基本上被调用了很多)。
不活跃的内存是没有被使用很多的东西,是内存需要交换的交换提名。
免费是真正的免费记忆约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
这东西表示内存碎片。 这基本上显示了多less内存连续可用。 这是你的问题。
免费的普通内存,你有不超过32kb的可用连续内存。 你的记忆是可怕的碎片。 这意味着如果任何应用程序需要分配超过32K的空间,那么就没有内存 – 所以凶手到达的地方就是为了给内存做这件事。
所以,你可以做什么。
线索是这样的:
Free swap = 0kB Total swap = 0kB
噢亲爱的! 没有交换! 所以,承诺的记忆 – 就呆在那里。 现在新的内核实际上是对内存进行“碎片整理”,以使内存区域连续化,而老的内存则不这样做。
你有70Mb的内存可以交换! 再加上这一切都不会一发不可收拾,但是渐渐地不会对你造成打击。 但没有交换,所以没有运气。 对于页面caching来说,你的内存也很less,对于你的系统来说也是不好的。 这可能会给予更多的免费连续空间,这将是很好的你。
我的build议给你。 让自己768Mb的掉期。 老实说,你真的不通过启用你的内核来破坏它。
交换对于释放未使用的内存非常重要(在你的情况下是四分之一),也可以避免因为内存可能被换出并释放更多连续空间而遇到的令人讨厌的碎片问题。 即使它被换回,也可能被放回到一个给你更大的连续空白的记忆区域。