사용 가능한 메모리가 높을 때 OOM Killer가 트리거됩니다.

사용 가능한 메모리가 높을 때 OOM Killer가 트리거됩니다.

-100MB의 사용 가능한 RAM이 있어도 임의의 kswapd0 및 OOM 킬러가 나타납니다. 다른 유사한 문제를 많이 경험했지만 제 경우에는 왜 OOM 킬러가 실행되었는지 이해할 수 없습니다. 지식이 풍부한 사람들이 통찰력을 공유하고 내 연구의 방향을 지적할 수 있기를 바랍니다.

편집: 위에서부터 시작하여 OOM 킬러가 트리거될 때 이 출력을 얻습니다. 또한 kswap이 ~100MB를 사용할 수 있는 이유를 알고 싶습니다. 우리 애플리케이션에는 최대 90개만 필요하며 할당된 용량은 ~50MB입니다. 따라서 이런 일이 발생하면 약 40MB만 시도합니다.

top - 09:19:06 up 23:57,  0 users,  load average: 4.50, 2.61, 1.87
Tasks: 101 total,   2 running,  99 sleeping,   0 stopped,   0 zombie
%Cpu(s):  7.1 us, 62.5 sy,  0.0 ni,  0.0 id, 25.9 wa,  0.0 hi,  4.5 si,  0.0 st
KiB Mem :   507008 total,    99320 free,   355096 used,    52592 buff/cache
KiB Swap:        0 total,        0 free,        0 used.   102308 avail Mem 

top - 09:19:09 up 23:57,  0 users,  load average: 4.50, 2.61, 1.87
Tasks: 100 total,   1 running,  98 sleeping,   0 stopped,   1 zombie
%Cpu(s): 35.8 us, 45.4 sy,  0.0 ni,  0.0 id, 17.4 wa,  0.0 hi,  1.4 si,  0.0 st
KiB Mem :   507008 total,   162280 free,   288952 used,    55776 buff/cache
KiB Swap:        0 total,        0 free,        0 used.   168376 avail Mem

아래는 내 추적입니다.

2022-07-29T09:19:09.117931Z,BTL200072600123,3,0,kernel:,[86254.933997] Out of memory: Kill process 25402 (application) score 181 or sacrifice child
2022-07-29T09:19:09.117941Z,BTL200072600123,3,0,kernel:,[86254.934006] Killed process 25402 (application) total-vm:159852kB, anon-rss:75664kB, file-rss:16020kB
2022-07-29T09:19:09.095963Z,BTL200072600123,4,1,kernel:, [86254.932989] acquisition invoked oom-killer: gfp_mask=0x2084d0, order=0, oom_score_adj=0
2022-07-29T09:19:09.096076Z,BTL200072600123,4,1,kernel:, [86254.933012] CPU: 0 PID: 17939 Comm: acquisition Tainted: G           O    4.1.46 #5
2022-07-29T09:19:09.096142Z,BTL200072600123,4,1,kernel:, [86254.933019] Hardware name: Freescale i.MX6 Quad/DualLite (Device Tree)
2022-07-29T09:19:09.096206Z,BTL200072600123,4,1,kernel:, [86254.933025] Backtrace:
2022-07-29T09:19:09.096270Z,BTL200072600123,4,1,kernel:, [86254.933054] [<800132e4>] (dump_backtrace) from [<80013500>] (show_stack+0x18/0x1c)
2022-07-29T09:19:09.096334Z,BTL200072600123,4,1,kernel:, [86254.933060]  r7:00000000 r6:80a83c70 r5:600f0113 r4:00000000
202
2022-07-29T09:19:09.098354Z,BTL200072600123,4,1,kernel:, [86254.933467] Mem-Info:
2022-07-29T09:19:09.098411Z,BTL200072600123,4,1,kernel:, [86254.933485] active_anon:50599 inactive_anon:6859 isolated_anon:0
2022-07-29T09:19:09.098472Z,BTL200072600123,4,1,kernel:, [86254.933485]  active_file:136 inactive_file:159 isolated_file:0
2022-07-29T09:19:09.098530Z,BTL200072600123,4,1,kernel:, [86254.933485]  unevictable:16 dirty:0 writeback:0 unstable:0
2022-07-29T09:19:09.098589Z,BTL200072600123,4,1,kernel:, [86254.933485]  slab_reclaimable:1089 slab_unreclaimable:2343
2022-07-29T09:19:09.098648Z,BTL200072600123,4,1,kernel:, [86254.933485]  mapped:5971 shmem:8154 pagetables:534 bounce:0
2022-07-29T09:19:09.098704Z,BTL200072600123,4,1,kernel:, [86254.933485]  free:23627 free_pcp:0 free_cma:23127
2022-07-29T09:19:09.098765Z,BTL200072600123,4,1,kernel:, [86254.933518] Normal free:94380kB min:1972kB low:2464kB high:2956kB active_anon:201792kB inactive_anon:27364kB active_file:476kB inactive_file:560kB unevictable:64kB isolated(anon):0kB isolated(file):0kB present:522240kB managed:505984kB mlocked:64kB dirty:0kB writeback:0kB mapped:23728kB shmem:32540kB slab_reclaimable:4356kB slab_unreclaimable:9372kB kernel_stack:1032kB pagetables:2136kB unstable:0kB bounce:0kB free_pcp:0kB local_pcp:0kB free_cma:92508kB writeback_tmp:0kB pages_scanned:6648 all_unreclaimable? yes
2022-07-29T09:19:09.098829Z,BTL200072600123,4,1,kernel:, [86254.933523] lowmem_reserve[]: 0 8 8
2022-07-29T09:19:09.098890Z,BTL200072600123,4,1,kernel:, [86254.933549] HighMem free:128kB min:128kB low:128kB high:132kB active_anon:604kB inactive_anon:72kB active_file:68kB inactive_file:76kB unevictable:0kB isolated(anon):0kB isolated(file):0kB present:1024kB managed:1024kB mlocked:0kB dirty:0kB writeback:0kB mapped:156kB shmem:76kB slab_reclaimable:0kB slab_unreclaimable:0kB kernel_stack:0kB pagetables:0kB unstable:0kB bounce:0kB free_pcp:0kB local_pcp:0kB free_cma:0kB writeback_tmp:0kB pages_scanned:32 all_unreclaimable? no
2022-07-29T09:19:09.098950Z,BTL200072600123,4,1,kernel:, [86254.933555] lowmem_reserve[]: 0 0 0
2022-07-29T09:19:09.099011Z,BTL200072600123,4,1,kernel:, [86254.933564] Normal: 268*4kB (UEMRC) 128*8kB (UERC) 80*16kB (UERC) 8*32kB (RC) 0*64kB 1*128kB (C) 0*256kB 1*512kB (C) 0*1024kB 4*2048kB (C) 20*4096kB (C) = 94384kB
2022-07-29T09:19:09.099068Z,BTL200072600123,4,1,kernel:, [86254.933608] HighMem: 32*4kB (U) 0*8kB 0*16kB 0*32kB 0*64kB 0*128kB 0*256kB 0*512kB 0*1024kB 0*2048kB 0*4096kB = 128kB
2022-07-29T09:19:09.099126Z,BTL200072600123,4,1,kernel:, [86254.933638] 8449 total pagecache pages
2022-07-29T09:19:09.099183Z,BTL200072600123,4,1,kernel:, [86254.933646] 0 pages in swap cache
2022-07-29T09:19:09.099240Z,BTL200072600123,4,1,kernel:, [86254.933652] Swap cache stats: add 0, delete 0, find 0/0
2022-07-29T09:19:09.099297Z,BTL200072600123,4,1,kernel:, [86254.933656] Free swap  = 0kB
2022-07-29T09:19:09.099353Z,BTL200072600123,4,1,kernel:, [86254.933661] Total swap = 0kB
2022-07-29T09:19:09.099408Z,BTL200072600123,4,1,kernel:, [86254.933665] 130816 pages RAM
2022-07-29T09:19:09.099464Z,BTL200072600123,4,1,kernel:, [86254.933670] 256 pages HighMem/MovableOnly
2022-07-29T09:19:09.099521Z,BTL200072600123,4,1,kernel:, [86254.933675] 4294905824 pages reserved
2022-07-29T09:19:09.099578Z,BTL200072600123,4,1,kernel:, [86254.933680] 65536 pages cma reserved

답변1

숫자를 대략 더하면 모든 것이 제자리에 있는 것처럼 보입니다. RAM이 부족하고 OOM 킬러가 당신을 죽입니다.

2022-07-29T09:19:09.098704Z,BTL200072600123,4,1,kernel:, [86254.933485]  free:23627 free_pcp:0 free_cma:23127

이는 사용 가능한 RAM이 23627kB이고 systemd.resource-control이 MemoryLow24.6MB로 설정되어 있습니다.

… Normal free:94380kB min:1972kB low:2464kB

음, 응.

나는 무작위가 된다kswap0

음, 무료 교환이 0개 있습니다:

Free swap  = 0kB

답변2

Linux는 수행할 것으로 예상되는 작업을 위해 프로세스에 더 많은 RAM을 할당할 수 없는 경우를 제외하고는 OOM이 발생하는 프로세스를 무작위로 종료하지 않습니다.

숫자에서 (익명 RSS:75664kB), 특정 응용 프로그램이 많은 메모리를 사용하고 있어 해당 응용 프로그램이 종료되는 것 같습니다.

두 가지 추가 사항:

  1. 스왑 메모리가 없습니다(총 교환량 = 0kB)

    이는 메모리 부족 애플리케이션이 없는 빠른 서버에 적합합니다. 그렇지 않은 경우를 대비해 스왑을 추가하는 것이 좋습니다. 우리 회사 서버에는 99.9%의 시간 동안 충분한 메모리가 있습니다. 그러나 때때로 백그라운드에서 무언가가 실행되기 시작하고 짧은 시간 동안(프로세스가 종료될 때까지) 서버의 메모리가 부족해집니다. 이 경우 스와핑은 99.9%의 시간을 절약하고 일회성 이벤트이므로 미친 듯이 읽고 쓰지 않습니다.

  2. 어떤 프로세스가 종료되는지는 복잡한 경험적 방법입니다.

    자동으로 더 많은 메모리를 할당하려는 프로세스가 되지는 않습니다. 가장 많은 메모리를 할당하는 것일 가능성이 높습니다. 정확한 알고리즘은 모르지만 운영 체제는 다른 모든 프로세스가 원활하게 실행될 수 있도록 더 나은 기회를 제공하기 위해 프로세스를 시작합니다. 따라서 프로세스 A는 를 호출할 수 malloc()있고 프로세스 B는 OOM을 경험할 수 있습니다.


대규모 서버에 대한 또 다른 참고 사항: "파일"(별도의 "섹션")에서 메모리를 관리할 수 있습니다. 내 서버에는 512GB RAM이 두 개의 파일로 분할되어 있습니다. 프로세스가 200GB 이상의 RAM을 사용하려고 하면 메모리 부족 상태가 발생할 수 있습니다(자주 발생해서는 안 됨). 두 개의 파일도 있는 경우 프로세스 크기는 약 64GB로 제한될 수 있습니다.

관련 정보