Situación de Linux oom


15

Tengo una continua situación de pánico y omisión sin resolver. No estoy seguro de que el sistema llene toda la memoria RAM (36 GB). ¿Por qué este sistema desencadenó esta situación? Sospecho que está relacionado con la zona lowmem en sistemas Linux de 32 bits. ¿Cómo puedo analizar los registros de kernel panic y oom-killer?

Atentamente,

Kernel 3.10.24

Dec 27 09:19:05 2013 kernel: : [277622.359064] squid invoked oom-killer: gfp_mask=0x42d0, order=3, oom_score_adj=0
Dec 27 09:19:05 2013 kernel: : [277622.359069] squid cpuset=/ mems_allowed=0
Dec 27 09:19:05 2013 kernel: : [277622.359074] CPU: 9 PID: 15533 Comm: squid Not tainted 3.10.24-1.lsg #1
Dec 27 09:19:05 2013 kernel: : [277622.359076] Hardware name: Intel Thurley/Greencity, BIOS 080016  10/05/2011
Dec 27 09:19:05 2013 kernel: : [277622.359078]  00000003 e377b280 e03c3c38 c06472d6 e03c3c98 c04d2d96 c0a68f84 e377b580
Dec 27 09:19:05 2013 kernel: : [277622.359089]  000042d0 00000003 00000000 e03c3c64 c04abbda e42bd318 00000000 e03c3cf4
Dec 27 09:19:05 2013 kernel: : [277622.359096]  000042d0 00000001 00000247 00000000 e03c3c94 c04d3d5f 00000001 00000042
Dec 27 09:19:05 2013 kernel: : [277622.359105] Call Trace:
Dec 27 09:19:05 2013 kernel: : [277622.359116]  [<c06472d6>] dump_stack+0x16/0x20
Dec 27 09:19:05 2013 kernel: : [277622.359121]  [<c04d2d96>] dump_header+0x66/0x1c0
Dec 27 09:19:05 2013 kernel: : [277622.359127]  [<c04abbda>] ? __delayacct_freepages_end+0x3a/0x40
Dec 27 09:19:05 2013 kernel: : [277622.359131]  [<c04d3d5f>] ? zone_watermark_ok+0x2f/0x40
Dec 27 09:19:05 2013 kernel: : [277622.359135]  [<c04d2f27>] check_panic_on_oom+0x37/0x60
Dec 27 09:19:05 2013 kernel: : [277622.359138]  [<c04d36d2>] out_of_memory+0x92/0x250
Dec 27 09:19:05 2013 kernel: : [277622.359144]  [<c04dd1fa>] ? wakeup_kswapd+0xda/0x120
Dec 27 09:19:05 2013 kernel: : [277622.359148]  [<c04d6cee>] __alloc_pages_nodemask+0x68e/0x6a0
Dec 27 09:19:05 2013 kernel: : [277622.359155]  [<c0801c1e>] sk_page_frag_refill+0x7e/0x120
Dec 27 09:19:05 2013 kernel: : [277622.359160]  [<c084b8c7>] tcp_sendmsg+0x387/0xbf0
Dec 27 09:19:05 2013 kernel: : [277622.359166]  [<c0469a2f>] ? put_prev_task_fair+0x1f/0x350
Dec 27 09:19:05 2013 kernel: : [277622.359173]  [<c0ba7d8b>] ? longrun_init+0x2b/0x30
Dec 27 09:19:05 2013 kernel: : [277622.359177]  [<c084b540>] ? tcp_tso_segment+0x380/0x380
Dec 27 09:19:05 2013 kernel: : [277622.359182]  [<c086d0da>] inet_sendmsg+0x4a/0xa0
Dec 27 09:19:05 2013 kernel: : [277622.359186]  [<c07ff3a6>] sock_aio_write+0x116/0x130
Dec 27 09:19:05 2013 kernel: : [277622.359191]  [<c0457acc>] ? hrtimer_try_to_cancel+0x3c/0xb0
Dec 27 09:19:05 2013 kernel: : [277622.359197]  [<c050b208>] do_sync_write+0x68/0xa0
Dec 27 09:19:05 2013 kernel: : [277622.359202]  [<c050caa0>] vfs_write+0x190/0x1b0
Dec 27 09:19:05 2013 kernel: : [277622.359206]  [<c050cbb3>] SyS_write+0x53/0x80
Dec 27 09:19:05 2013 kernel: : [277622.359211]  [<c08f72ba>] sysenter_do_call+0x12/0x22
Dec 27 09:19:05 2013 kernel: : [277622.359213] Mem-Info:
Dec 27 09:19:05 2013 kernel: : [277622.359215] DMA per-cpu:
Dec 27 09:19:05 2013 kernel: : [277622.359218] CPU    0: hi:    0, btch:   1 usd:   0
Dec 27 09:19:05 2013 kernel: : [277622.359220] CPU    1: hi:    0, btch:   1 usd:   0
Dec 27 09:19:05 2013 kernel: : [277622.359222] CPU    2: hi:    0, btch:   1 usd:   0
Dec 27 09:19:05 2013 kernel: : [277622.359224] CPU    3: hi:    0, btch:   1 usd:   0
Dec 27 09:19:05 2013 kernel: : [277622.359226] CPU    4: hi:    0, btch:   1 usd:   0
Dec 27 09:19:05 2013 kernel: : [277622.359228] CPU    5: hi:    0, btch:   1 usd:   0
Dec 27 09:19:05 2013 kernel: : [277622.359230] CPU    6: hi:    0, btch:   1 usd:   0
Dec 27 09:19:05 2013 kernel: : [277622.359232] CPU    7: hi:    0, btch:   1 usd:   0
Dec 27 09:19:05 2013 kernel: : [277622.359234] CPU    8: hi:    0, btch:   1 usd:   0
Dec 27 09:19:05 2013 kernel: : [277622.359236] CPU    9: hi:    0, btch:   1 usd:   0
Dec 27 09:19:05 2013 kernel: : [277622.359238] CPU   10: hi:    0, btch:   1 usd:   0
Dec 27 09:19:05 2013 kernel: : [277622.359240] CPU   11: hi:    0, btch:   1 usd:   0
Dec 27 09:19:05 2013 kernel: : [277622.359242] CPU   12: hi:    0, btch:   1 usd:   0
Dec 27 09:19:05 2013 kernel: : [277622.359244] CPU   13: hi:    0, btch:   1 usd:   0
Dec 27 09:19:05 2013 kernel: : [277622.359246] CPU   14: hi:    0, btch:   1 usd:   0
Dec 27 09:19:05 2013 kernel: : [277622.359248] CPU   15: hi:    0, btch:   1 usd:   0
Dec 27 09:19:05 2013 kernel: : [277622.359250] CPU   16: hi:    0, btch:   1 usd:   0
Dec 27 09:19:05 2013 kernel: : [277622.359253] CPU   17: hi:    0, btch:   1 usd:   0
Dec 27 09:19:05 2013 kernel: : [277622.359255] CPU   18: hi:    0, btch:   1 usd:   0
Dec 27 09:19:05 2013 kernel: : [277622.359258] CPU   19: hi:    0, btch:   1 usd:   0
Dec 27 09:19:05 2013 kernel: : [277622.359260] CPU   20: hi:    0, btch:   1 usd:   0
Dec 27 09:19:05 2013 kernel: : [277622.359262] CPU   21: hi:    0, btch:   1 usd:   0
Dec 27 09:19:05 2013 kernel: : [277622.359264] CPU   22: hi:    0, btch:   1 usd:   0
Dec 27 09:19:05 2013 kernel: : [277622.359266] CPU   23: hi:    0, btch:   1 usd:   0
Dec 27 09:19:05 2013 kernel: : [277622.359268] Normal per-cpu:
Dec 27 09:19:05 2013 kernel: : [277622.359270] CPU    0: hi:  186, btch:  31 usd:  34
Dec 27 09:19:05 2013 kernel: : [277622.359272] CPU    1: hi:  186, btch:  31 usd:  72
Dec 27 09:19:05 2013 kernel: : [277622.359274] CPU    2: hi:  186, btch:  31 usd:  40
Dec 27 09:19:05 2013 kernel: : [277622.359276] CPU    3: hi:  186, btch:  31 usd:   0
Dec 27 09:19:05 2013 kernel: : [277622.359279] CPU    4: hi:  186, btch:  31 usd:  39
Dec 27 09:19:05 2013 kernel: : [277622.359281] CPU    5: hi:  186, btch:  31 usd:  49
Dec 27 09:19:05 2013 kernel: : [277622.359283] CPU    6: hi:  186, btch:  31 usd:  50
Dec 27 09:19:05 2013 kernel: : [277622.359285] CPU    7: hi:  186, btch:  31 usd:  25
Dec 27 09:19:05 2013 kernel: : [277622.359286] CPU    8: hi:  186, btch:  31 usd:  42
Dec 27 09:19:05 2013 kernel: : [277622.359289] CPU    9: hi:  186, btch:  31 usd:  39
Dec 27 09:19:05 2013 kernel: : [277622.359290] CPU   10: hi:  186, btch:  31 usd: 155
Dec 27 09:19:05 2013 kernel: : [277622.359293] CPU   11: hi:  186, btch:  31 usd:  56
Dec 27 09:19:05 2013 kernel: : [277622.359295] CPU   12: hi:  186, btch:  31 usd:   2
Dec 27 09:19:05 2013 kernel: : [277622.359297] CPU   13: hi:  186, btch:  31 usd: 162
Dec 27 09:19:05 2013 kernel: : [277622.359299] CPU   14: hi:  186, btch:  31 usd:  67
Dec 27 09:19:05 2013 kernel: : [277622.359301] CPU   15: hi:  186, btch:  31 usd:   0
Dec 27 09:19:05 2013 kernel: : [277622.359303] CPU   16: hi:  186, btch:  31 usd:  68
Dec 27 09:19:05 2013 kernel: : [277622.359305] CPU   17: hi:  186, btch:  31 usd:  38
Dec 27 09:19:05 2013 kernel: : [277622.359307] CPU   18: hi:  186, btch:  31 usd:  56
Dec 27 09:19:05 2013 kernel: : [277622.359308] CPU   19: hi:  186, btch:  31 usd:   0
Dec 27 09:19:05 2013 kernel: : [277622.359310] CPU   20: hi:  186, btch:  31 usd:  54
Dec 27 09:19:05 2013 kernel: : [277622.359312] CPU   21: hi:  186, btch:  31 usd:  35
Dec 27 09:19:05 2013 kernel: : [277622.359314] CPU   22: hi:  186, btch:  31 usd:   2
Dec 27 09:19:05 2013 kernel: : [277622.359316] CPU   23: hi:  186, btch:  31 usd:  60
Dec 27 09:19:05 2013 kernel: : [277622.359318] HighMem per-cpu:
Dec 27 09:19:05 2013 kernel: : [277622.359320] CPU    0: hi:  186, btch:  31 usd:  32
Dec 27 09:19:05 2013 kernel: : [277622.359322] CPU    1: hi:  186, btch:  31 usd:  52
Dec 27 09:19:05 2013 kernel: : [277622.359324] CPU    2: hi:  186, btch:  31 usd:   9
Dec 27 09:19:05 2013 kernel: : [277622.359326] CPU    3: hi:  186, btch:  31 usd:   0
Dec 27 09:19:05 2013 kernel: : [277622.359328] CPU    4: hi:  186, btch:  31 usd: 125
Dec 27 09:19:05 2013 kernel: : [277622.359330] CPU    5: hi:  186, btch:  31 usd: 116
Dec 27 09:19:05 2013 kernel: : [277622.359332] CPU    6: hi:  186, btch:  31 usd: 126
Dec 27 09:19:05 2013 kernel: : [277622.359333] CPU    7: hi:  186, btch:  31 usd:   0
Dec 27 09:19:05 2013 kernel: : [277622.359336] CPU    8: hi:  186, btch:  31 usd:  79
Dec 27 09:19:05 2013 kernel: : [277622.359338] CPU    9: hi:  186, btch:  31 usd:  34
Dec 27 09:19:05 2013 kernel: : [277622.359340] CPU   10: hi:  186, btch:  31 usd: 111
Dec 27 09:19:05 2013 kernel: : [277622.359341] CPU   11: hi:  186, btch:  31 usd: 144
Dec 27 09:19:05 2013 kernel: : [277622.359343] CPU   12: hi:  186, btch:  31 usd:  15
Dec 27 09:19:05 2013 kernel: : [277622.359345] CPU   13: hi:  186, btch:  31 usd: 166
Dec 27 09:19:05 2013 kernel: : [277622.359347] CPU   14: hi:  186, btch:  31 usd: 185
Dec 27 09:19:05 2013 kernel: : [277622.359349] CPU   15: hi:  186, btch:  31 usd:   0
Dec 27 09:19:05 2013 kernel: : [277622.359351] CPU   16: hi:  186, btch:  31 usd:  58
Dec 27 09:19:05 2013 kernel: : [277622.359353] CPU   17: hi:  186, btch:  31 usd: 122
Dec 27 09:19:05 2013 kernel: : [277622.359356] CPU   18: hi:  186, btch:  31 usd: 170
Dec 27 09:19:05 2013 kernel: : [277622.359358] CPU   19: hi:  186, btch:  31 usd:   0
Dec 27 09:19:05 2013 kernel: : [277622.359360] CPU   20: hi:  186, btch:  31 usd:  30
Dec 27 09:19:05 2013 kernel: : [277622.359362] CPU   21: hi:  186, btch:  31 usd:  33
Dec 27 09:19:05 2013 kernel: : [277622.359364] CPU   22: hi:  186, btch:  31 usd:  28
Dec 27 09:19:05 2013 kernel: : [277622.359366] CPU   23: hi:  186, btch:  31 usd:  44
Dec 27 09:19:05 2013 kernel: : [277622.359371] active_anon:658515 inactive_anon:54399 isolated_anon:0
Dec 27 09:19:05 2013 kernel: : [277622.359371]  active_file:1172176 inactive_file:323606 isolated_file:0
Dec 27 09:19:05 2013 kernel: : [277622.359371]  unevictable:0 dirty:0 writeback:0 unstable:0
Dec 27 09:19:05 2013 kernel: : [277622.359371]  free:6911872 slab_reclaimable:29430 slab_unreclaimable:34726
Dec 27 09:19:05 2013 kernel: : [277622.359371]  mapped:45784 shmem:9850 pagetables:107714 bounce:0
Dec 27 09:19:05 2013 kernel: : [277622.359371]  free_cma:0
Dec 27 09:19:05 2013 kernel: : [277622.359382] DMA free:2332kB min:36kB low:44kB high:52kB active_anon:0kB inactive_anon:0kB active_file:0kB inactive_file:0kB unevictable:0kB isolated(anon):0kB isolated(file):0kB present:15968kB managed:6960kB mlocked:0kB dirty:0kB writeback:0kB mapped:0kB shmem:0kB slab_reclaimable:8kB slab_unreclaimable:288kB kernel_stack:0kB pagetables:0kB unstable:0kB bounce:0kB free_cma:0kB writeback_tmp:0kB pages_scanned:0 all_unreclaimable? yes
Dec 27 09:19:05 2013 kernel: : [277622.359384] lowmem_reserve[]: 0 573 36539 36539
Dec 27 09:19:05 2013 kernel: : [277622.359393] Normal free:114488kB min:3044kB low:3804kB high:4564kB active_anon:0kB inactive_anon:0kB active_file:252kB inactive_file:256kB unevictable:0kB isolated(anon):0kB isolated(file):0kB present:894968kB managed:587540kB mlocked:0kB dirty:0kB writeback:0kB mapped:4kB shmem:0kB slab_reclaimable:117712kB slab_unreclaimable:138616kB kernel_stack:11976kB pagetables:0kB unstable:0kB bounce:0kB free_cma:0kB writeback_tmp:0kB pages_scanned:982 all_unreclaimable? yes
Dec 27 09:19:05 2013 kernel: : [277622.359395] lowmem_reserve[]: 0 0 287725 287725
Dec 27 09:19:05 2013 kernel: : [277622.359404] HighMem free:27530668kB min:512kB low:48272kB high:96036kB active_anon:2634060kB inactive_anon:217596kB active_file:4688452kB inactive_file:1294168kB unevictable:0kB isolated(anon):0kB isolated(file):0kB present:36828872kB managed:36828872kB mlocked:0kB dirty:0kB writeback:0kB mapped:183132kB shmem:39400kB slab_reclaimable:0kB slab_unreclaimable:0kB kernel_stack:0kB pagetables:430856kB unstable:0kB bounce:367564104kB free_cma:0kB writeback_tmp:0kB pages_scanned:0 all_unreclaimable? no
Dec 27 09:19:05 2013 kernel: : [277622.359406] lowmem_reserve[]: 0 0 0 0
Dec 27 09:19:05 2013 kernel: : [277622.359410] DMA: 3*4kB (U) 2*8kB (U) 4*16kB (U) 5*32kB (U) 2*64kB (U) 0*128kB 0*256kB 0*512kB 0*1024kB 1*2048kB (R) 0*4096kB = 2428kB
Dec 27 09:19:05 2013 kernel: : [277622.359422] Normal: 5360*4kB (UEM) 3667*8kB (UEM) 3964*16kB (UEMR) 13*32kB (MR) 0*64kB 1*128kB (R) 1*256kB (R) 0*512kB 0*1024kB 0*2048kB 0*4096kB = 115000kB
Dec 27 09:19:05 2013 kernel: : [277622.359435] HighMem: 6672*4kB (M) 74585*8kB (UM) 40828*16kB (UM) 17275*32kB (UM) 3314*64kB (UM) 1126*128kB (UM) 992*256kB (UM) 585*512kB (UM) 225*1024kB (UM) 78*2048kB (UMR) 5957*4096kB (UM) = 27529128kB
Dec 27 09:19:05 2013 kernel: : [277622.359452] Node 0 hugepages_total=0 hugepages_free=0 hugepages_surp=0 hugepages_size=2048kB
Dec 27 09:19:05 2013 kernel: : [277622.359454] 1505509 total pagecache pages
Dec 27 09:19:05 2013 kernel: : [277622.359457] 4 pages in swap cache
Dec 27 09:19:05 2013 kernel: : [277622.359459] Swap cache stats: add 13, delete 9, find 0/0
Dec 27 09:19:05 2013 kernel: : [277622.359460] Free swap  = 35318812kB
Dec 27 09:19:05 2013 kernel: : [277622.359462] Total swap = 35318864kB
Dec 27 09:19:05 2013 kernel: : [277622.450529] 9699327 pages RAM
Dec 27 09:19:05 2013 kernel: : [277622.450532] 9471490 pages HighMem
Dec 27 09:19:05 2013 kernel: : [277622.450533] 342749 pages reserved
Dec 27 09:19:05 2013 kernel: : [277622.450534] 2864256 pages shared
Dec 27 09:19:05 2013 kernel: : [277622.450535] 1501243 pages non-shared
Dec 27 09:19:05 2013 kernel: : [277622.450538] Kernel panic - not syncing: Out of memory: system-wide panic_on_oom is enabled

Dec 27 09:19:05 2013 kernel: : [277622.450538]

y

# cat /proc/meminfo
MemTotal:       37426312 kB
MemFree:        28328992 kB
Buffers:           94728 kB
Cached:          6216068 kB
SwapCached:            0 kB
Active:          6958572 kB
Inactive:        1815380 kB
Active(anon):    2329152 kB
Inactive(anon):   170252 kB
Active(file):    4629420 kB
Inactive(file):  1645128 kB
Unevictable:           0 kB
Mlocked:               0 kB
HighTotal:      36828872 kB
HighFree:       28076144 kB
LowTotal:         597440 kB
LowFree:          252848 kB
SwapTotal:      35318864 kB
SwapFree:       35318860 kB
Dirty:                 0 kB
Writeback:             8 kB
AnonPages:       2463512 kB
Mapped:           162296 kB
Shmem:             36332 kB
Slab:             208676 kB
SReclaimable:     120872 kB
SUnreclaim:        87804 kB
KernelStack:        6320 kB
PageTables:        42280 kB
NFS_Unstable:          0 kB
Bounce:              124 kB
WritebackTmp:          0 kB
CommitLimit:    54032020 kB
Committed_AS:    3191916 kB
VmallocTotal:     122880 kB
VmallocUsed:       27088 kB
VmallocChunk:      29312 kB
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
DirectMap4k:       10232 kB
DirectMap2M:      901120 kB

sysctl:

vm.oom_dump_tasks = 0
vm.oom_kill_allocating_task = 1
vm.panic_on_oom = 1

vm.admin_reserve_kbytes = 8192
vm.block_dump = 0
vm.dirty_background_bytes = 0
vm.dirty_background_ratio = 10
vm.dirty_bytes = 0
vm.dirty_expire_centisecs = 3000
vm.dirty_ratio = 20
vm.dirty_writeback_centisecs = 500
vm.drop_caches = 0
vm.highmem_is_dirtyable = 0
vm.hugepages_treat_as_movable = 0
vm.hugetlb_shm_group = 0
vm.laptop_mode = 0
vm.legacy_va_layout = 0
vm.lowmem_reserve_ratio = 256   32      32
vm.max_map_count = 65530
vm.min_free_kbytes = 3084
vm.mmap_min_addr = 4096
vm.nr_hugepages = 0
vm.nr_overcommit_hugepages = 0
vm.nr_pdflush_threads = 0
vm.overcommit_memory = 0
vm.overcommit_ratio = 50
vm.page-cluster = 3
vm.percpu_pagelist_fraction = 0
vm.scan_unevictable_pages = 0
vm.stat_interval = 1
vm.swappiness = 30
vm.user_reserve_kbytes = 131072
vm.vdso_enabled = 1
vm.vfs_cache_pressure = 100

y

# ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 292370
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 36728
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 292370
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

66
Hola amigos, no veo ninguna razón para cerrar esta pregunta. Este es un problema OOM interesante.
Nils

1
He reformulado la pregunta para abrirla nuevamente.
Seaquest

Para la siguiente línea "CPU 0: hi: 0, btch: 1 usd: 0", ¿alguien sabe qué significa "hola", "btch" y "usd" y cuáles son sus unidades?
waffleman

Respuestas:


53

Sin embargo, un enfoque de 'mazo' sería actualizar a un O / S de 64 bits (esto es 32 bits) porque el diseño de las zonas se realiza de manera diferente.

Bien, aquí intentaré responder por qué has experimentado un OOM aquí. Hay una serie de factores en juego aquí.

  • El tamaño del pedido de la solicitud y cómo el núcleo trata ciertos tamaños de pedido.
  • La zona seleccionada.
  • Las marcas de agua que usa esta zona.
  • Fragmentación en la zona.

Si nos fijamos en el OOM en sí, claramente hay una gran cantidad de memoria libre disponible, pero se invocó a OOM-killer. ¿Por qué?


El tamaño del pedido de la solicitud y cómo el núcleo trata ciertos tamaños de pedido

El núcleo asigna memoria por orden. Un 'pedido' es una región de RAM contigua que debe cumplirse para que la solicitud funcione. Las órdenes se ordenan por órdenes de magnitud (por lo tanto, el orden de los nombres) usando el algoritmo 2^(ORDER + 12). Entonces, el orden 0 es 4096, el orden 1 es 8192, el orden 2 es 16384 y así sucesivamente.

El núcleo tiene un valor codificado de lo que se considera un "orden superior" (> PAGE_ALLOC_COSTLY_ORDER). Este es el orden 4 y superior (64kb o superior es un orden superior).

Los pedidos altos se satisfacen para las asignaciones de páginas de manera diferente a los pedidos bajos. Una asignación de alto orden si no puede tomar la memoria, en los núcleos modernos lo hará.

  • Intente ejecutar la memoria de la rutina de compactación para desfragmentar la memoria.
  • Nunca llame a OOM-killer para satisfacer la solicitud.

El tamaño de su pedido aparece aquí

Dec 27 09:19:05 2013 kernel: : [277622.359064] squid invoked oom-killer: gfp_mask=0x42d0, order=3, oom_score_adj=0

La orden 3 es la más alta de las solicitudes de orden inferior y (como puede ver) invoca a OOM-killer en un intento de satisfacerla.

Tenga en cuenta que la mayoría de las asignaciones de espacio de usuario no utilizan solicitudes de orden superior. Típicamente es el núcleo que requiere regiones contiguas de memoria. Una excepción a esto puede ser cuando el espacio de usuario está usando páginas enormes, pero ese no es el caso aquí.

En su caso, el núcleo llama a la asignación de orden 3 que desea poner en cola un paquete en la pila de red, lo que requiere una asignación de 32 kb para hacerlo.

La zona seleccionada.

El núcleo divide sus regiones de memoria en zonas. Este corte se realiza porque en x86 ciertas regiones de memoria solo son direccionables por cierto hardware. El hardware más antiguo solo puede direccionar la memoria en la zona 'DMA', por ejemplo. Cuando deseamos asignar algo de memoria, primero se elige una zona y solo se tiene en cuenta la memoria libre de esta zona al tomar una decisión de asignación.

Si bien no estoy completamente informado sobre el algoritmo de selección de zona, el caso de uso típico nunca es asignar desde DMA, sino generalmente seleccionar la zona direccionable más baja que pueda satisfacer la solicitud.

Durante la OOM se esparce mucha información de zona que también se puede obtener /proc/zoneinfo.

Dec 27 09:19:05 2013 kernel: : [277622.359382] DMA free:2332kB min:36kB low:44kB high:52kB active_anon:0kB inactive_anon:0kB active_file:0kB inactive_file:0kB unevictable:0kB isolated(anon):0kB isolated(file):0kB present:15968kB managed:6960kB mlocked:0kB dirty:0kB writeback:0kB mapped:0kB shmem:0kB slab_reclaimable:8kB slab_unreclaimable:288kB kernel_stack:0kB pagetables:0kB unstable:0kB bounce:0kB free_cma:0kB writeback_tmp:0kB pages_scanned:0 all_unreclaimable? yes
Dec 27 09:19:05 2013 kernel: : [277622.359393] Normal free:114488kB min:3044kB low:3804kB high:4564kB active_anon:0kB inactive_anon:0kB active_file:252kB inactive_file:256kB unevictable:0kB isolated(anon):0kB isolated(file):0kB present:894968kB managed:587540kB mlocked:0kB dirty:0kB writeback:0kB mapped:4kB shmem:0kB slab_reclaimable:117712kB slab_unreclaimable:138616kB kernel_stack:11976kB pagetables:0kB unstable:0kB bounce:0kB free_cma:0kB writeback_tmp:0kB pages_scanned:982 all_unreclaimable? yes
Dec 27 09:19:05 2013 kernel: : [277622.359404] HighMem free:27530668kB min:512kB low:48272kB high:96036kB active_anon:2634060kB inactive_anon:217596kB active_file:4688452kB inactive_file:1294168kB unevictable:0kB isolated(anon):0kB isolated(file):0kB present:36828872kB managed:36828872kB mlocked:0kB dirty:0kB writeback:0kB mapped:183132kB shmem:39400kB slab_reclaimable:0kB slab_unreclaimable:0kB kernel_stack:0kB pagetables:430856kB unstable:0kB bounce:367564104kB free_cma:0kB writeback_tmp:0kB pages_scanned:0 all_unreclaimable? no

Las zonas que tiene, DMA, Normal y HighMem indican una plataforma de 32 bits, porque la zona HighMem no existe en 64 bits. También en sistemas de 64 bits Normal se asigna a 4 GB y más, mientras que en 32 bits asigna hasta 896 Mb (aunque, en su caso, el núcleo informa que solo administra una porción más pequeña que esta: - managed:587540kB.)

Es posible saber de dónde provino esta asignación mirando de nuevo la primera línea, gfp_mask=0x42d0nos dice qué tipo de asignación se realizó. El último byte (0) nos dice que esta es una asignación de la zona normal. Los significados de GFP se encuentran en incluyen / Linux / gfp.h .

Las marcas de agua que usa esta zona.

Cuando la memoria es baja, la marca de agua especifica las acciones para recuperarla. Se presentan aquí: min:3044kB low:3804kB high:4564kB. Si la memoria libre alcanza el nivel "bajo", se producirá un intercambio hasta que pasemos el umbral "alto". Si la memoria llega a 'min', necesitamos matar cosas para liberar memoria a través del asesino OOM.

Fragmentación en la zona.

Para ver si se puede satisfacer una solicitud de un pedido específico de memoria, el kernel representa cuántas páginas libres y disponibles de cada pedido. Esto es legible en /proc/buddyinfo. Los informes de OOM-killer también escupen la información de amigos como se ve aquí:

Normal: 5360*4kB (UEM) 3667*8kB (UEM) 3964*16kB (UEMR) 13*32kB (MR) 0*64kB 1*128kB (R) 1*256kB (R) 0*512kB 0*1024kB 0*2048kB 0*4096kB = 115000kB

Para que se satisfaga una asignación de memoria, debe haber memoria libre disponible en el tamaño de pedido solicitado o una asignación más alta. Tener muchos y muchos datos libres en los pedidos bajos y ninguno en los pedidos superiores significa que su memoria está fragmentada. Si obtiene una asignación de orden muy alta, es posible (incluso con mucha memoria libre) que no se cumpla debido a que no hay páginas de orden alta disponibles. El kernel puede desfragmentar la memoria (esto se llama compactación de memoria) al mover muchas páginas de bajo orden para que no dejen espacios en el espacio RAM direccionable.

OOM-killer fue invocado? ¿Por qué?

Entonces, si tomamos estas cosas en cuenta, podemos decir lo siguiente;

  • Se intentó una asignación contigua de 32 kB. De la zona normal.
  • Había suficiente memoria libre en la zona seleccionada.
  • Había orden 3, 5 y 6 de memoria disponible 13*32kB (MR) 1*128kB (R) 1*256kB (R)

Por lo tanto, si no era memoria libre, otros órdenes podrían satisfacer la solicitud. ¿que pasó?

Bueno, hay más para asignar desde un pedido que simplemente verificar la cantidad de memoria libre disponible para ese pedido o superior. El kernel resta efectivamente la memoria de todos los pedidos inferiores de la línea libre total y luego realiza la verificación mínima de la marca de agua de lo que queda.

Lo que sucede en su caso es verificar nuestra memoria libre para esa zona que debemos hacer.

115000 - (5360*4) - (3667*8) - (3964*16) = 800

Esta cantidad de memoria libre minse compara con la marca de agua, que es 3044. Por lo tanto, técnicamente hablando, no le queda memoria libre para hacer la asignación que solicitó. Y es por eso que invocaste a OOM-killer.


Fijación

Hay dos arreglos. La actualización a 64 bits cambia la partición de su zona de modo que 'Normal' es de 4 GB a 36 GB, por lo que no terminará 'predeterminando' su asignación de memoria en una zona que puede fragmentarse tanto. No es que tenga más memoria direccionable que solucione este problema (porque ya está usando PAE), simplemente que la zona que selecciona tiene más memoria direccionable.

La segunda forma (que nunca he probado) es intentar que el núcleo compacte de forma más agresiva su memoria.

Si cambia el valor de vm.extfrag_threshold500 a 100, es más probable que compacte la memoria en un intento de cumplir con una asignación de alto orden. Sin embargo, nunca me he metido con este valor antes, también dependerá de cuál sea su índice de fragmentación disponible /sys/kernel/debug/extfrag/extfrag_index. No tengo una caja en este momento con un núcleo lo suficientemente nuevo como para ver lo que eso ofrece para ofrecer más que esto.

Alternativamente, podría ejecutar algún tipo de trabajo cron (esto es horrible, horriblemente feo) para compactar manualmente la memoria usted mismo escribiendo /proc/sys/vm/compact_memory.

Sin embargo, honestamente, no creo que realmente haya una forma de ajustar el sistema para evitar este problema: es la naturaleza del asignador de memoria trabajar de esta manera. Cambiar la arquitectura de la plataforma que usa es probablemente la única solución fundamentalmente resoluble.


Entrar en 64 bits es imposible por el momento. Tengo que ajustar el sistema para no obtener el error.
Seaquest

44
Esta es una respuesta asombrosa. Tener un
voto a favor

Hola Mlfe, excelente respuesta. Tengo curiosidad por esta parte de tu publicación. "El kernel resta efectivamente la memoria de todos los pedidos inferiores de la línea libre total y luego realiza la verificación mínima de la marca de agua de lo que queda". - ¿Tiene el código fuente relevante que puedo pasar? Porque, bueno, he tratado muchos problemas de OOM pero no he visto esta lógica en la fuente. Tal vez, me perdí. ¿Dónde estás viendo de todos modos? oom_kill.c? ¿O algo más?
Soham Chakraborty

2
El código está en mm / page_alloc.c y se hace en la función __zone_watermark_ok
Matthew Ife

@SohamChakraborty Si está interesado en estas cosas, también debo señalar que puede averiguar qué causa una OOM en el núcleo siguiendo el seguimiento de la pila en la salida de OOM-killer suministrada, como es el caso aquí.
Matthew Ife

5

Desde el principio: realmente debería optar por un sistema operativo de 64 bits. ¿Tienes una buena razón para quedarte en 32 bits aquí?

Es difícil diagnosticar este problema sin echar un vistazo más de cerca al sistema, preferiblemente en el momento en que falla, por lo que mi publicación (rápida) está más o menos genéricamente dirigida a problemas de memoria en sistemas de 32 bits. ¿Mencioné que ir a 64 bits haría que todo esto desapareciera?

Tu problema es triple.

En primer lugar, incluso en un núcleo PAE, el espacio de direcciones por proceso está limitado a 4GiB [1]. Esto significa que su instancia de calamar nunca podrá comer más de 4GiB de RAM por proceso. No estoy tan familiarizado con los calamares, pero si este es su servidor proxy principal, eso podría no ser suficiente de todos modos.

Segundo, en un sistema de 32 bits con grandes cantidades de RAM, se usa mucha memoria en lo que se llama 'ZONE_NORMAL' para almacenar las estructuras de datos que se necesitan para usar la memoria en ZONE_HIGHMEM. Estas estructuras de datos no se pueden mover a ZONE_HIGHMEM por sí mismas, porque la memoria que el kernel usa para sus propios fines siempre debe estar en ZONE_NORMAL (es decir, en el primer 1GiB-ish). Cuanta más memoria tenga en ZONE_HIGHMEM (mucha, en su caso), más se convertirá en un problema, porque el núcleo necesita más y más memoria de ZONE_NORMAL para administrar ZONE_HIGHMEM. A medida que la cantidad de memoria libre en ZONE_NORMAL se agota, su sistema puede fallar en algunas tareas, porque ZONE_NORMAL es donde suceden muchas cosas en un sistema de 32 bits. Todas las operaciones de memoria relacionadas con el núcleo, por ejemplo;)

En tercer lugar, incluso si queda algo de memoria en ZONE_NORMAL (no he revisado sus registros en detalle), algunas operaciones de memoria requerirán memoria no fragmentada. Por ejemplo, si toda su memoria está fragmentada en partes realmente pequeñas, algunas operaciones que necesitan más que eso, fallarán. [3] Una breve mirada a sus registros muestra una cantidad bastante significativa de fragmentación en ZONE_DMA y ZONE_NORMAL.

Editar: la respuesta anterior de Mlfe tiene una excelente explicación de cómo funciona esto en detalle.

Nuevamente: en un sistema de 64 bits, toda la memoria está en ZONE_NORMAL. No hay zona HIGHMEM en sistemas de 64 bits. Problema resuelto.

Editar: Puedes echar un vistazo aquí [4] para ver si puedes decirle a Oom-Killer que deje en paz tus procesos importantes. Eso no resolverá todo (en todo caso), pero valdría la pena intentarlo.

[1] http://en.wikipedia.org/wiki/Physical_address_extension#Design

[2] http://www.redhat.com/archives/rhelv5-list/2008-September/msg00237.html y https://access.redhat.com/site/documentation/en-US/Red_Hat_Enterprise_Linux/5/html /Tuning_and_Optimizing_Red_Hat_Enterprise_Linux_for_Oracle_9i_and_10g_Databases/sect-Oracle_9i_and_10g_Tuning_Guide-Hardware_Architectures_and_Linux_Kernels-a32_bit_Architecture_bit_Architecture.

[3] http://bl0rg.krunch.be/oom-frag.html

[4] http://lwn.net/Articles/317814/


1
La memoria se está asignando desde la zona normal (ver gfp_mask), aunque a primera vista la zona normal tiene suficiente memoria libre para comprometerse con esta asignación. Tengo una explicación real para esto, pero requiere una edición bastante larga en mi publicación.
Matthew Ife

4

@MIfe ya proporcionó una excelente redacción sobre cómo se manejan las asignaciones de memoria en el kernel y también le proporcionó la solución adecuada, como cambiar a un sistema operativo de 64 bits y un truco desagradable como la compactación manual de memoria a través de /proc/sys/vm/compact_memoryin cron.

Mis 2 centavos serían otra solución que podría ayudarlo:
he notado que tiene tcp_tso_segmenten su traza inversa del kernel, al hacerlo:

# ethtool -K ethX tso off gso off lro off

puede disminuir la presión mmal obligarlo a usar órdenes más bajas.

PS . Se puede obtener una lista de todas las descargas a través de# ethtool -k ethX


2
Esta es una sugerencia brillante. Vota a ti.
Matthew Ife

Esta información es muy buena puntero. También inspeccionaré el efecto de tso.
Seaquest

3

El pánico se debe a que el sysctl "vm.panic_on_oom = 1" está configurado; la idea es que reiniciar el sistema lo devuelva a un estado sano. Puede cambiar esto en sysctl.conf.

Justo en la parte superior leemos calamar invocado asesino de Oom. Puede verificar la configuración de su calamar y su uso máximo de memoria (o simplemente pasar a un sistema operativo de 64 bits).

/ proc / meminfo muestra una zona de alta memoria en uso, por lo que está ejecutando un kernel de 32 bits con 36 GB de memoria. También puede ver que en la zona normal, para satisfacer la demanda de memoria de los calamares, el núcleo escaneó 982 páginas sin éxito:

pages_scanned:982 all_unreclaimable? yes
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.