Yan*_*ang 5 linux cgroups docker
我目前的配置是:
> cat /proc/sys/vm/panic_on_oom
0
> cat /proc/sys/vm/oom_kill_allocating_task
0
> cat /proc/sys/vm/overcommit_memory
1
Run Code Online (Sandbox Code Playgroud)
但是当我执行任务时,无论如何都会被杀死.
> ./test/mem.sh
Killed
> dmesg | tail -2
[24281.788131] Memory cgroup out of memory: Kill process 10565 (bash) score 1001 or sacrifice child
[24281.788133] Killed process 10565 (bash) total-vm:12601088kB, anon-rss:5242544kB, file-rss:64kB
Run Code Online (Sandbox Code Playgroud)
我的任务习惯于科学计算,这需要花费很多回忆,似乎overcommit_memory=1
可能是最好的选择.
实际上,我正在研究一个数据分析项目,它花费的内存超过了16G
,但我被要求限制它们5G
.可能无法通过优化程序本身来实现此要求,因为项目使用了许多子命令,并且大多数子命令不包含类似Java Xms
或Xmx
Java 中的选项.
我的项目应该是一个过度的系统.正如a3f所言,似乎我的应用程序更喜欢xmalloc
在mem分配失败时崩溃.
> cat /proc/sys/vm/overcommit_memory
2
> ./test/mem.sh
./test/mem.sh: xmalloc: .././subst.c:3542: cannot allocate 1073741825 bytes (4295237632 bytes allocated)
Run Code Online (Sandbox Code Playgroud)
我不想投降,虽然这么多令人厌烦的测试让我筋疲力尽.那么请告诉我一个通向光明的道路; )
a3f*_*a3f 10
OOM杀手不会消失.如果没有记忆,有人必须付钱.您可以做的是设置一个限制,在该限制之后内存分配失败.这正是vm.overcommit_memory
要2
实现的设置.
来自文档:
Linux内核支持以下过度使用处理模式
2 - 不要过度使用.系统的总地址空间提交不允许超过交换+物理RAM的可配置量(默认为50%).根据您使用的数量,在大多数情况下,这意味着访问页面时不会终止进程,但会在适当时收到内存分配错误.
通常,内核会很乐意分发虚拟内存(overcommit).只有在引用页面时,内核才必须将页面映射到真实的物理帧.如果它无法为该请求提供服务,则需要OOM杀手杀死进程以腾出空间.
禁用overcommit意味着如果内核无法提交所请求的内存量,malloc(3)
则会返回NULL
.这使得事情变得更加可预测,尽管有限(许多应用程序分配的内容超出了他们的需求).
归档时间: |
|
查看次数: |
13042 次 |
最近记录: |