Situazione di Linux


15

Ho una situazione di oom e panico continua irrisolta. Non sono sicuro che il sistema riempia tutto il ram (36 GB). Perché questo sistema ha innescato questa situazione? Sospetto che sia correlato alla zona lowmem nei sistemi Linux a 32 bit. Come posso analizzare i log dal panico del kernel e oom-killer?

I migliori saluti,

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]

e

# 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

e

# 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

6
Ehi gente - non vedo alcun motivo per chiudere questa domanda. Questo è un problema OOM interessante.
Nils,

1
Ho riformulato la domanda per riaprirla.
Seaquest

Per la seguente riga "CPU 0: hi: 0, btch: 1 usd: 0", qualcuno sa cosa significano "hi", "btch" e "usd" e quali sono le loro unità?
Waffleman,

Risposte:


53

Un approccio "a mazza" sarebbe però quello di passare a un O / S a 64 bit (questo è a 32 bit) perché il layout delle zone è fatto diversamente.

OK, quindi qui tenterò di rispondere al motivo per cui hai sperimentato una OOM qui. Ci sono una serie di fattori in gioco qui.

  • La dimensione dell'ordine della richiesta e il modo in cui il kernel tratta determinate dimensioni dell'ordine.
  • La zona selezionata.
  • Le filigrane utilizzate da questa zona.
  • Frammentazione nella zona.

Se guardi lo stesso OOM, c'è chiaramente molta memoria libera disponibile ma OOM-killer è stato invocato? Perché?


La dimensione dell'ordine della richiesta e il modo in cui il kernel tratta determinate dimensioni dell'ordine

Il kernel alloca memoria per ordine. Un 'ordine' è una regione di RAM contigua che deve essere soddisfatta affinché la richiesta funzioni. Gli ordini sono organizzati per ordini di grandezza (quindi l'ordine dei nomi) usando l'algoritmo 2^(ORDER + 12). Quindi, l'ordine 0 è 4096, l'ordine 1 è 8192, l'ordine 2 è 16384 e così via.

Il kernel ha un valore codificato di ciò che viene considerato un "ordine elevato" (> PAGE_ALLOC_COSTLY_ORDER). Questo è l'ordine 4 e superiore (64kb o superiore è un ordine elevato).

Gli ordini elevati sono soddisfatti per le allocazioni di pagina in modo diverso dagli ordini bassi. Un'allocazione di ordine elevato se non riesce a catturare la memoria, lo farà sui kernel moderni.

  • Prova a eseguire memoria la routine di compattazione per deframmentare la memoria.
  • Non chiamare mai OOM-killer per soddisfare la richiesta.

Le dimensioni del tuo ordine sono elencate qui

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

L'ordine 3 è la più alta delle richieste di basso ordine e (come vedi) invoca OOM-killer nel tentativo di soddisfarlo.

Si noti che la maggior parte delle allocazioni dello spazio utente non utilizza richieste di ordine elevato. In genere è il kernel che richiede regioni contigue di memoria. Un'eccezione a ciò può essere quando userspace utilizza hugepages, ma non è questo il caso.

Nel tuo caso, l'allocazione dell'ordine 3 viene chiamata dal kernel che desidera mettere in coda un pacchetto nello stack di rete, per farlo richiede un'allocazione a 32kb.

La zona selezionata.

Il kernel divide le regioni di memoria in zone. Questo chipping è fatto perché su x86 alcune aree di memoria sono indirizzabili solo da determinati hardware. L'hardware precedente potrebbe essere in grado di indirizzare la memoria solo nella zona "DMA", ad esempio. Quando vogliamo allocare un po 'di memoria, prima viene scelta una zona e viene presa in considerazione solo la memoria libera di questa zona quando si prende una decisione di allocazione.

Anche se non sono completamente a conoscenza dell'algoritmo di selezione delle zone, il tipico caso d'uso non è mai quello di allocare dal DMA, ma di solito selezionare la zona indirizzabile più bassa in grado di soddisfare la richiesta.

Molte informazioni sulla zona vengono espulse durante OOM e possono anche essere raccolte /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

Le zone che hai, DMA, Normal e HighMem indicano una piattaforma a 32 bit, perché la zona HighMem è inesistente su 64 bit. Anche su sistemi a 64 bit, Normal è mappato a 4 GB e oltre, mentre a 32 bit è mappato fino a 896 Mb (sebbene, nel tuo caso, il kernel riferisca di gestire solo una porzione più piccola di questa: - managed:587540kB.)

È possibile dire da dove proviene questa allocazione guardando di nuovo la prima riga, gfp_mask=0x42d0ci dice che tipo di allocazione è stata fatta. L'ultimo byte (0) ci dice che questa è un'allocazione dalla zona normale. I significati GFP si trovano in include / linux / gfp.h .

Le filigrane utilizzate da questa zona.

Quando la memoria è insufficiente, le azioni per recuperarla sono specificate dalla filigrana. Essi mostrano qui: min:3044kB low:3804kB high:4564kB. Se la memoria libera raggiunge "bassa", si verificherà lo scambio fino al superamento della soglia "alta". Se la memoria raggiunge 'min', dobbiamo uccidere le cose per liberare memoria tramite il killer OOM.

Frammentazione nella zona.

Per vedere se una richiesta per un ordine specifico di memoria può essere soddisfatta, il kernel tiene conto di quante pagine libere e disponibili di ciascun ordine. Questo è leggibile in /proc/buddyinfo. OOM-killer riporta inoltre sputare anche buddyinfo come visto qui:

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

Affinché un'allocazione di memoria sia soddisfatta, deve essere disponibile memoria libera nella dimensione dell'ordine richiesta o un'allocazione superiore. Avere un sacco di dati gratuiti negli ordini bassi e nessuno negli ordini superiori significa che la tua memoria è frammentata. Se si ottiene un'allocazione dell'ordine molto elevata, è possibile (anche con molta memoria libera) per non essere soddisfatto a causa della mancanza di pagine di ordine elevato. Il kernel può deframmentare la memoria (questa si chiama compattazione della memoria) spostando molte pagine di basso ordine in modo da non lasciare spazi vuoti nello spazio di indirizzamento indirizzabile.

OOM-killer è stato invocato? Perché?

Quindi, se prendiamo in considerazione queste cose, possiamo dire quanto segue;

  • È stata tentata un'allocazione contigua di 32 KB. Dalla zona normale.
  • Memoria libera sufficiente nella zona selezionata.
  • C'erano 3, 5 e 6 di memoria disponibili 13*32kB (MR) 1*128kB (R) 1*256kB (R)

Quindi, se ci fosse la memoria libera, altri ordini potrebbero soddisfare la richiesta. quello che è successo?

Bene, c'è molto di più da allocare da un ordine oltre a controllare la quantità di memoria libera disponibile per quell'ordine o superiore. Il kernel sottrae efficacemente la memoria da tutti gli ordini inferiori dalla linea libera totale e quindi esegue il controllo minimo della filigrana su ciò che rimane.

Quello che succede nel tuo caso è controllare la nostra memoria libera per quella zona che dobbiamo fare.

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

Questa quantità di memoria libera viene verificata rispetto alla minfiligrana, che è 3044. Pertanto, tecnicamente parlando, non è rimasta memoria libera per eseguire l'allocazione richiesta. Ed è per questo che hai invocato OOM-killer.


Fissaggio

Ci sono due correzioni. L'aggiornamento a 64 bit modifica il partizionamento della tua zona in modo tale che 'Normale' sia da 4 GB a 36 GB, quindi non finirai per 'predefinire' l'allocazione della memoria in una zona che può essere così fortemente frammentata. Non è che hai più memoria indirizzabile che risolve questo problema (perché stai già utilizzando PAE), semplicemente che la zona selezionata ha più memoria indirizzabile.

Il secondo modo (che non ho mai testato) è quello di provare a convincere il kernel a compattare in modo più aggressivo la tua memoria.

Se si modifica il valore vm.extfrag_thresholdda 500 a 100, è più probabile comprimere la memoria nel tentativo di rispettare un'allocazione di ordine elevato. Anche se non ho mai fatto casini con questo valore prima d'ora - dipenderà anche dall'indice di frammentazione in cui è disponibile /sys/kernel/debug/extfrag/extfrag_index. Al momento non ho una scatola con un kernel abbastanza nuovo per vedere cosa dimostra di offrire di più.

In alternativa, potresti eseguire una sorta di cron job (questo è orribilmente, orribilmente brutto) per compattare manualmente la memoria scrivendo /proc/sys/vm/compact_memory.

In tutta onestà, però, non penso che ci sia davvero un modo per ottimizzare il sistema per evitare questo problema: è la natura dell'allocatore di memoria a funzionare in questo modo. Cambiare l'architettura della piattaforma che usi è probabilmente l'unica soluzione fondamentalmente risolvibile.


Andare in64 bit al momento impossibile. Devo ottimizzare il sistema per non ottenere l'errore.
Seaquest

4
Questa è una risposta fantastica. Avere un voto :)
wzzrd

Ciao Mlfe, ottima risposta. Sono curioso di sapere questa parte del tuo post. "Il kernel sottrae efficacemente la memoria da tutti gli ordini inferiori dalla linea libera totale e quindi esegue il controllo minimo della filigrana su ciò che resta." - Hai il codice sorgente pertinente che posso esaminare? Perché, beh, ho affrontato molti problemi di OOM ma non ho visto questa logica nella fonte. Forse mi sono perso. Dove vedi comunque? oom_kill.c? O qualsiasi altra cosa?
Soham Chakraborty,

2
Il codice è in mm / page_alloc.c e viene eseguito nella funzione __zone_watermark_ok
Matthew Ife,

@SohamChakraborty Se sei interessato a queste cose, dovrei anche sottolineare che puoi capire cosa causa una OOM nel kernel seguendo la traccia dello stack nell'output di OOM-killer fornito, come nel caso qui.
Matthew Ife,

5

All'inizio: dovresti davvero scegliere un sistema operativo a 64 bit. Hai una buona ragione per rimanere a 32 bit qui?

È difficile diagnosticare questo problema senza dare un'occhiata più da vicino al sistema, preferibilmente nel momento in cui fallisce, quindi il mio post (rapido) è più o meno genericamente mirato a problemi di memoria su sistemi a 32 bit. Ho già detto che andare a 64 bit farebbe sparire tutto questo?

Il tuo problema è triplice.

Innanzitutto, anche su un kernel PAE, lo spazio degli indirizzi per processo è limitato a 4GiB [1]. Ciò significa che l'istanza di calamari non sarà mai in grado di consumare più di 4 GB di RAM per processo. Non ho familiarità con i calamari, ma se questo è il tuo server proxy principale, potrebbe non essere comunque sufficiente.

In secondo luogo, su un sistema a 32 bit con grandi quantità di RAM, viene utilizzata molta memoria in quello che viene chiamato "ZONE_NORMAL" per archiviare le strutture di dati necessarie per utilizzare la memoria in ZONE_HIGHMEM. Questa struttura di dati non può essere spostata in ZONE_HIGHMEM, poiché la memoria utilizzata dal kernel per i propri scopi deve essere sempre in ZONE_NORMAL (ovvero nel primo 1GiB-ish). Più memoria hai in ZONE_HIGHMEM (molto, nel tuo caso), più questo diventa un problema, perché il kernel ha bisogno di sempre più memoria da ZONE_NORMAL per gestire ZONE_HIGHMEM. Poiché la quantità di memoria libera in ZONE_NORMAL si esaurisce, il sistema potrebbe non funzionare in alcune attività, poiché ZONE_NORMAL è il luogo in cui si verificano molte cose su un sistema a 32 bit. Tutte le operazioni di memoria relative al kernel, per esempio;)

In terzo luogo, anche se è rimasta della memoria in ZONE_NORMAL (non ho esaminato in dettaglio i tuoi registri), alcune operazioni di memoria richiederanno memoria non frammentata. Ad esempio, se tutta la tua memoria è frammentata in pezzi veramente piccoli, alcune operazioni che richiedono più di questo, falliranno. [3] Una breve occhiata ai tuoi registri mostra una quantità abbastanza significativa di frammentazione in ZONE_DMA e ZONE_NORMAL.

Modifica: la risposta di Mlfe sopra ha una spiegazione eccellente di come funziona in dettaglio.

Ancora: su un sistema a 64 bit, tutta la memoria è in ZONE_NORMAL. Non esiste alcuna zona HIGHMEM su sistemi a 64 bit. Problema risolto.

Modifica: puoi dare un'occhiata qui [4] per vedere se puoi dire a oom-killer di lasciare da solo i tuoi processi importanti. Ciò non risolverà tutto (se non del tutto), ma potrebbe valere la pena provarlo.

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

[2] http://www.redhat.com/archives/rhelv5-list/2008-September/msg00237.html e 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_and_the_hugemem_Kernel.html

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

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


1
La memoria viene allocata dalla zona normale (vedi gfp_mask), anche se a prima vista la zona normale ha memoria sufficiente per impegnarsi in questa allocazione. Ho una vera spiegazione per questo, ma richiede una modifica abbastanza lunga per il mio post.
Matthew Ife,

4

@MIfe ha già fornito un eccellente resoconto su come vengono gestite le allocazioni di memoria nel kernel e ti ha anche fornito una soluzione adeguata come il passaggio al sistema operativo a 64 bit e un brutto hack come la compattazione manuale della memoria tramite /proc/sys/vm/compact_memoryin cron.

I miei 2 centesimi potrebbero essere un'altra soluzione che potrebbe aiutarti:
ho notato che hai tcp_tso_segmentnel backtrace del kernel, quindi:

# ethtool -K ethX tso off gso off lro off

può ridurre la pressione mmforzandola a utilizzare ordini inferiori.

PS . l'elenco di tutti gli offload può essere ottenuto tramite# ethtool -k ethX


2
Questo è un suggerimento geniale. Grazie a te.
Matthew Ife,

Questa informazione è un ottimo puntatore. Ispezionerò anche l'effetto di tso.
Seaquest

3

Il panico è perché il sysctl "vm.panic_on_oom = 1" è impostato - l'idea è che il riavvio del sistema lo ritorni in uno stato sano. Puoi cambiarlo in sysctl.conf.

Proprio in cima leggiamo calamari invocati oom killer. È possibile verificare la configurazione di squid e il massimo utilizzo della memoria (o semplicemente passare a un sistema operativo a 64 bit).

/ proc / meminfo mostra una zona di memoria elevata in uso, quindi si esegue un kernel a 32 bit con memoria da 36 GB. Puoi anche vedere che nella zona normale, per soddisfare la richiesta di memoria di calamari, il kernel ha scansionato 982 pagine senza successo:

pages_scanned:982 all_unreclaimable? yes
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.