page allocation failure. order:1, mode:0x20 :: ZONE_DMA, ZONE_NORMAL, ZONE_HIGHMEM 관련 궁금합니다.
/var/log/messages에 'page allocation failure. order:1, mode:0x20' message가 여러번 찍힌 후 SYS에 의한 CPU Usage가 99%가 된 후 System이 reboot되었습니다.
그 아래에는 다음과 같은 message가 출력 됐습니다.
Jul 10 16:02:39 myserver07 kernel: active_anon:7849424 inactive_anon:246875 isolated_anon:324
Jul 10 16:02:39 myserver07 kernel: active_file:7894163 inactive_file:38023183 isolated_file:1338
Jul 10 16:02:39 myserver07 kernel: unevictable:82356 dirty:9387 writeback:114569 unstable:2680
Jul 10 16:02:39 myserver07 kernel: free:432756 slab_reclaimable:1019589 slab_unreclaimable:161392
Jul 10 16:02:39 myserver07 kernel: mapped:67411 shmem:103 pagetables:73467 bounce:0
Jul 10 16:02:39 myserver07 kernel: Node 0 DMA free:15892kB min:28kB low:32kB high:40kB active_anon:0kB inactive_anon:0kB active_file:0kB inactive_file:0kB unevictable:0kB isolated(anon):0kB isolated(file):0kB present:15668kB mlocked:0kB dirty:0kB writeback:0kB mapped:0kB shmem:0kB slab_reclaimable:0kB slab_unreclaimable:0kB kernel_stack:0kB pagetables:0kB unstable:0kB bounce:0kB writeback_tmp:0kB pages_scanned:0 all_unreclaimable? yes
Jul 10 16:02:39 myserver07 kernel: lowmem_reserve[]: 0 1918 258458 258458
Jul 10 16:02:39 myserver07 kernel: Node 0 DMA32 free:1027604kB min:3888kB low:4860kB high:5832kB active_anon:378440kB inactive_anon:53600kB active_file:9776kB inactive_file:11172kB unevictable:4832kB isolated(anon):0kB isolated(file):0kB present:1964744kB mlocked:4832kB dirty:1316kB writeback:940kB mapped:0kB shmem:0kB slab_reclaimable:7048kB slab_unreclaimable:8212kB kernel_stack:1032kB pagetables:988kB unstable:0kB bounce:0kB writeback_tmp:0kB pages_scanned:0 all_unreclaimable? no
Jul 10 16:02:39 myserver07 kernel: lowmem_reserve[]: 0 0 256540 256540
Jul 10 16:02:39 myserver07 kernel: Node 0 Normal free:687528kB min:520364kB low:650452kB high:780544kB active_anon:31019256kB inactive_anon:933900kB active_file:31566876kB inactive_file:152081560kB unevictable:324592kB isolated(anon):1296kB isolated(file):5352kB present:262696960kB mlocked:324592kB dirty:36232kB writeback:457336kB mapped:269644kB shmem:412kB slab_reclaimable:4071308kB slab_unreclaimable:637356kB kernel_stack:14096kB pagetables:292880kB unstable:10720kB bounce:0kB writeback_tmp:0kB pages_scanned:0 all_unreclaimable? no
Jul 10 16:02:39 myserver07 kernel: lowmem_reserve[]: 0 0 0 0
Jul 10 16:02:39 myserver07 kernel: Node 0 DMA: 1*4kB 0*8kB 1*16kB 0*32kB 2*64kB 1*128kB 1*256kB 0*512kB 1*1024kB 1*2048kB 3*4096kB = 15892kB
Jul 10 16:02:39 myserver07 kernel: Node 0 DMA32: 277*4kB 304*8kB 261*16kB 106*32kB 55*64kB 38*128kB 34*256kB 14*512kB 29*1024kB 10*2048kB 230*4096kB = 1027620kB
Jul 10 16:02:39 myserver07 kernel: Node 0 Normal: 166515*4kB 2193*8kB 46*16kB 17*32kB 6*64kB 1*128kB 0*256kB 0*512kB 0*1024kB 0*2048kB 1*4096kB = 689492kB
Jul 10 16:02:39 myserver07 kernel: 45951240 total pagecache pages
Jul 10 16:02:39 myserver07 kernel: 0 pages in swap cache
Jul 10 16:02:39 myserver07 kernel: Swap cache stats: add 0, delete 0, find 0/0
Jul 10 16:02:39 myserver07 kernel: Free swap = 25165820kB
Jul 10 16:02:39 myserver07 kernel: Total swap = 25165820kB
당시의 Memory 상황은 256G(Total) / 60G(Used) / 40G(Free) / 120(Cached)였습니다.
찾아보니 DMA / Normal / HighMem은 일반적으로 application에서 사용하는 메모리 영역이 아닌 Device / Kernel등에 의해 사용되는 영역으로 다르다고 하는데 잘 이해가 되지 않아서요.
상기 Log를 보면 DMA의 경우 8kb, 32kb가 0이고 Normal의 경우 256Kb, 512Kb, 1024kb가 0으로 표시되는데, 추측으로는 해당 memory chunk를 return해주기 위해 kernel에서 memory reclaim을 수행하면서 System이 Hang이 걸리면서 Clusterware에 의한 node reboot으로 생각이 드는데요..
vm.min_free_kbytes의 경우 512M로 늘린 상태입니다. 서론이 길었는데요..질문은 다음과 같습니다.
1. 해당 시점에 kernel process가 memory reclaim을 수행했다는 증거를 어떻게 찾을수 있을까요??
2. 특정 memory chunk가 부족해 보이는데 여유분 메모리를 추가로 할당 할수 있는 방법은 없을까요???
미리 답변 감사드립니다.
어떤 용도로 쓰이는지는 모르기 때문에 답변드리긴
어떤 용도로 쓰이는지는 모르기 때문에 답변드리긴 어렵습니다만
리눅스의 메모리 관리체계에서 커널이 잡은 물리메모리는 전부 swap 금지영역입니다.
Device Driver도 커널에 포함되기 때문에 올라가면 모두 swap 금지영역이 됩니다.
swap이 남아도는데도 메모리부족 증상이 나온다면 사제 커널모듈 있을경우 모듈의 메모리 누수라든가 아니면 다량의 물리메모리를 요구하는 모듈이나 시스템콜 조작이 있는가를 확인해 봐야 할 듯 합니다.
Written By the Black Knight of Destruction
order:1 은 page_size * 2^1 을
order:1 은 page_size * 2^1 을 요청했다는 것이고,
mode:0x20 은 GFP_ATOMIC 이니 reclaim 을 시도하지 않습니다.
메모리 단편화가 심하게 진행됐을 수 있습니다.
defragmentation 에 대해 여러 사람들이 논의하고는 있지만, GFP_ATOMIC 상황은 아마도 예외가 되겠죠.
댓글 달기