linux – 为什么在内存有限的LXC容器中的应用程序将大文件写入磁盘被OOM杀死?

前端之家收集整理的这篇文章主要介绍了linux – 为什么在内存有限的LXC容器中的应用程序将大文件写入磁盘被OOM杀死?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
编辑2:这个问题似乎也存在于3.8.0-25-generic#37-Ubuntu SMP下

编辑:我修改了原始标题“为什么通过写入带有dd的文件触发Linux内存管理器?”的问题.为了更好地反映我担心​​下面描述的一般问题:

我遇到了麻烦的情况,OOM杀手很难
当我写一个大小超过的文件时,在我的LXC容器中查杀进程
内存限制(设置为300MB).当我在一个实际上只有512 MB RAM的Xen虚拟机(EC2 t1.micro)上运行应用程序时,不会出现此问题,因此文件缓冲似乎存在一些与容器内存限制有关的问题.

举个简单的例子,我可以演示dd编写的大文件如何导致问题.同样,这个问题困扰着所有应用程序.我想解决应用程序缓存过大的一般问题;我明白如何使“dd”工作.

场景:

我有一个LXC容器,其中memory.limit_in_bytes设置为300 MB.

我试图写一个~500 MB的文件,如下所示:

dd if=/dev/zero of=test2 bs=100k count=5010

大约20%的时间,Linux OOM管理器由此命令触发
并且一个进程被杀死.不用说,这是非常无意的
行为; dd用于模拟由a写的实际“有用”文件
程序在容器内运行.

细节:
虽然文件缓存变大(260 MB),但RSS文件映射似乎保持不变
低.以下是在写入期间memory.stat可能看起来像的示例:

cache 278667264
RSS 20971520
mapped_file 24576
pgpgin 138147
pgpgout 64993
swap 0
pgfault 55054
pgmajfault 2
inactive_anon 10637312
active_anon 10342400
inactive_file 278339584
active_file 319488
unevictable 0
hierarchical_memory_limit 300003328
hierarchical_memsw_limit 300003328
total_cache 278667264
total_RSS 20971520
total_mapped_file 24576
total_pgpgin 138147
total_pgpgout 64993
total_swap 0
total_pgfault 55054
total_pgmajfault 2
total_inactive_anon 10637312
total_active_anon 10342400
total_inactive_file 278339584
total_active_file 319488
total_unevictable 0

这是来自dmesg的粘贴,其中OOM触发了杀戮.我也不是
熟悉记忆类型之间的区别;有一件事
突出的是,虽然“节点0正常”非常低,但有很多
节点0 DMA32内存空闲.任何人都可以解释文件写入导致的原因
OOM?我该如何防止这种情况发生?

日志:

[1801523.686755] Task in /lxc/c-7 killed as a result of limit of /lxc/c-7
[1801523.686758] memory: usage 292972kB,limit 292972kB,failcnt 39580
[1801523.686760] memory+swap: usage 292972kB,failcnt 0
[1801523.686762] Mem-Info:
[1801523.686764] Node 0 DMA per-cpu:
[1801523.686767] cpu    0: hi:    0,btch:   1 usd:   0
[1801523.686769] cpu    1: hi:    0,btch:   1 usd:   0
[1801523.686771] cpu    2: hi:    0,btch:   1 usd:   0
[1801523.686773] cpu    3: hi:    0,btch:   1 usd:   0
[1801523.686775] cpu    4: hi:    0,btch:   1 usd:   0
[1801523.686778] cpu    5: hi:    0,btch:   1 usd:   0
[1801523.686780] cpu    6: hi:    0,btch:   1 usd:   0
[1801523.686782] cpu    7: hi:    0,btch:   1 usd:   0
[1801523.686783] Node 0 DMA32 per-cpu:
[1801523.686786] cpu    0: hi:  186,btch:  31 usd: 158
[1801523.686788] cpu    1: hi:  186,btch:  31 usd: 114
[1801523.686790] cpu    2: hi:  186,btch:  31 usd: 133
[1801523.686792] cpu    3: hi:  186,btch:  31 usd:  69
[1801523.686794] cpu    4: hi:  186,btch:  31 usd:  70
[1801523.686796] cpu    5: hi:  186,btch:  31 usd: 131
[1801523.686798] cpu    6: hi:  186,btch:  31 usd: 169
[1801523.686800] cpu    7: hi:  186,btch:  31 usd:  30
[1801523.686802] Node 0 Normal per-cpu:
[1801523.686804] cpu    0: hi:  186,btch:  31 usd: 162
[1801523.686806] cpu    1: hi:  186,btch:  31 usd: 184
[1801523.686809] cpu    2: hi:  186,btch:  31 usd:  99
[1801523.686811] cpu    3: hi:  186,btch:  31 usd:  82
[1801523.686813] cpu    4: hi:  186,btch:  31 usd:  90
[1801523.686815] cpu    5: hi:  186,btch:  31 usd:  99
[1801523.686817] cpu    6: hi:  186,btch:  31 usd: 157
[1801523.686819] cpu    7: hi:  186,btch:  31 usd: 138
[1801523.686824] active_anon:60439 inactive_anon:28841 isolated_anon:0
[1801523.686825]  active_file:110417 inactive_file:907078 isolated_file:64
[1801523.686827]  unevictable:0 dirty:164722 writeback:1652 unstable:0
[1801523.686828]  free:445909 slab_reclaimable:176594
slab_unreclaimable:14754
[1801523.686829]  mapped:4753 shmem:66 pagetables:3600 bounce:0
[1801523.686831] Node 0 DMA free:7904kB min:8kB low:8kB high:12kB
active_anon:0kB inactive_anon:0kB active_file:0kB inactive_file:0kB
unevictable:0kB isolated(anon):0kB isolated(file):0kB present:7648kB
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? no
[1801523.686841] lowmem_reserve[]: 0 4016 7048 7048
[1801523.686845] Node 0 DMA32 free:1770072kB min:6116kB low:7644kB
high:9172kB active_anon:22312kB inactive_anon:12128kB active_file:4988kB
inactive_file:2190136kB unevictable:0kB isolated(anon):0kB
isolated(file):256kB present:4112640kB mlocked:0kB dirty:535072kB
writeback:6452kB mapped:4kB shmem:4kB slab_reclaimable:72888kB
slab_unreclaimable:1100kB kernel_stack:120kB pagetables:832kB unstable:0kB
bounce:0kB writeback_tmp:0kB pages_scanned:0 all_unreclaimable? no
[1801523.686855] lowmem_reserve[]: 0 0 3031 3031
[1801523.686859] Node 0 Normal free:5660kB min:4616kB low:5768kB
high:6924kB active_anon:219444kB inactive_anon:103236kB
active_file:436680kB inactive_file:1438176kB unevictable:0kB
isolated(anon):0kB isolated(file):0kB present:3104640kB mlocked:0kB
dirty:123816kB writeback:156kB mapped:19008kB shmem:260kB
slab_reclaimable:633488kB slab_unreclaimable:57916kB kernel_stack:2800kB
pagetables:13568kB unstable:0kB bounce:0kB writeback_tmp:0kB
pages_scanned:0 all_unreclaimable? no
[1801523.686869] lowmem_reserve[]: 0 0 0 0
[1801523.686873] Node 0 DMA: 2*4kB 3*8kB 0*16kB 2*32kB 4*64kB 3*128kB
2*256kB 1*512kB 2*1024kB 2*2048kB 0*4096kB = 7904kB
[1801523.686883] Node 0 DMA32: 129*4kB 87*8kB 86*16kB 89*32kB 87*64kB
65*128kB 12*256kB 5*512kB 2*1024kB 13*2048kB 419*4096kB = 1769852kB
[1801523.686893] Node 0 Normal: 477*4kB 23*8kB 1*16kB 5*32kB 0*64kB 3*128kB
3*256kB 1*512kB 0*1024kB 1*2048kB 0*4096kB = 5980kB
[1801523.686903] 1017542 total pagecache pages
[1801523.686905] 0 pages in swap cache
[1801523.686907] Swap cache stats: add 0,delete 0,find 0/0
[1801523.686908] Free swap  = 1048572kB
[1801523.686910] Total swap = 1048572kB
[1801523.722319] 1837040 pages RAM
[1801523.722322] 58337 pages reserved
[1801523.722323] 972948 pages shared
[1801523.722324] 406948 pages non-shared
[1801523.722326] [ pid ]   uid  tgid total_vm      RSS cpu oom_adj
oom_score_adj name
[1801523.722396] [31266]     0 31266     6404      511   6       0
    0 init
[1801523.722445] [32489]     0 32489    12370      688   7     -17
-1000 sshd
[1801523.722460] [32511]   101 32511    10513      325   0       0
    0 rsyslogd
[1801523.722495] [32625]     0 32625    17706      838   2       0
    0 sshd
[1801523.722522] [32652]   103 32652     5900      176   0       0
    0 dbus-daemon
[1801523.722583] [  526]     0   526     1553      168   5       0
    0 getty
[1801523.722587] [  530]     0   530     1553      168   1       0
    0 getty
[1801523.722593] [  537]  2007   537    17706      423   5       0
    0 sshd
[1801523.722629] [  538]  2007   538    16974     5191   1       0
    0 python
[1801523.722650] [  877]  2007   877     2106      157   7       0
    0 dd
[1801523.722657] Memory cgroup out of memory: Kill process 538 (python)
score 71 or sacrifice child
[1801523.722674] Killed process 538 (python) total-vm:67896kB,anon-RSS:17464kB,file-RSS:3300kB

我在Linux上运行ip-10-8-139-98 3.2.0-29-virtual#46-Ubuntu SMP Fri Jul
27 17:23:50 UTC 2012 x86_64 x86_64 x86_64 Amazon EC2上的GNU / Linux.

解决方法

编辑:我将保留下面的原始答案,但我会尝试解释这里发生的事情并为您提供一般解决方案.

编辑2:提供了另一个选项.

你在这里遇到的问题与内核管理I / O的方式有关.当您对文件系统进行写入时,该写入不会立即提交到磁盘;这将是非常低效的.相反,写入被缓存在称为页面缓存的内存区域中,并且周期性地以块的形式写入磁盘.日志的“脏”部分描述了尚未写入磁盘的此页面缓存的大小:

dirty:123816kB

那么这个脏缓存是什么呢?为什么不做它的工作?

Linux上的’Flush’负责将脏页写入磁盘.它是一个定期唤醒的守护进程,用于确定是否需要写入磁盘,如果需要,则执行它们.如果你是C型人,请从here开始.冲洗是非常有效的;它可以在需要时将内容刷新到磁盘上.它正是按照预期的方式工作的.

Flush在LXC容器之外运行,因为您的LXC容器没有自己的内核. LXC容器在cgroups左右作为构造存在,这是Linux内核的一个特性,它允许更好地限制和隔离进程组,但不能使用自己的内核或刷新守护进程.

由于你的LXC的内存限制低于内核可用的内存,因此会发生奇怪的事情. Flush假设它有主机的完整内存来缓存写入.LXC中的程序开始写一个大文件,缓冲…缓冲区…并最终达到它的硬限制,并开始调用OOM管理器.这不是任何特定组件的失败;这是预期的行为.的种类.这种事情应该由cgroups来处理,但它看起来并不像.

这完全解释了您在实例大小之间看到的行为.您将在微型实例(512MB RAM)上与大型实例上的磁盘更快地刷新到磁盘

好的,这是有道理的.但它没用.我仍然需要给我写一个大屁股文件.

好吧,flush不知道你的LXC限制.因此,您可以尝试调整以下内容,而不是修补内核,这里有一些选项:

/proc/sys/vm/dirty_expire_centiseconds

这可以控制页面在脏缓存中保存多长时间并写入磁盘.默认情况下是30秒;尝试将其设置得更低,以便更快地将其推出.

/proc/sys/vm/dirty_background_ratio

这可以控制在开始强制写入之前允许填充的活动内存刷新百分比.在这里整理exact total有一些小问题,但最简单的解释是只看你的总内存.默认情况下它是10%(在某些发行版上它是5%).把它设置得更低;它会更快地强制写入磁盘,并可能使您的LXC不会超出其限制.

我不能只是搞砸一下文件系统吗?

嗯,是的但请确保您对此进行测试..您可能会影响性能.在您将要编写此文件的/ etc / fstab中的安装上,添加sync”安装选项.

原始答案:

Try reducing the blocksize used by DD:

06003

You can only write one sector at a time (512 bytes on older HDDs,4096 on newer). If DD is pushing writes to disk faster than the disk can accept them,it will start caching the writes in memory. That’s why your file cache is growing.

猜你在找的Linux相关文章