linux oom机制


linux oom机制(out of memory)
linux内核根据应用程序的需求来分配内存,但通常来说应用程序使用不完,为了提高性能,会把没用完的这部分留作他用,每个进程都能够使用。
但是内核直接回收会比较麻烦,所以选择了一种过度分配机制,间接利用这部分没用完的内存。但是如果大多数应用程序都把自己的内存消耗完了,会导致所有内存使用数加起来超过了本来有的内存,包括swap。这是就必须杀掉一些进程来腾出内存空间,保证系统正常运行。

杀掉进程的过程可以参考linux/mm/oom_kill.c 大致为给每一个进程打分,得分最高的被oom-killer杀掉

可以通过修改 /proc/sys/vm/panic_on_oom 文件来调整oom-killer的行为,禁止杀掉进程,但这会触发kernal panic(重要!!!如果遇到panic 也可以考虑往这方面排错查看)
当该文件为1时,直接panic;为0时,将通过oom-killer杀掉部分进程(默认值为0)
也可使用此命令,效果相同 sysctl -w vm.panic_on_oom=1 sysctl -p

也可以通过修改一些内核参数来避免系统一直不停的杀进程。

也可以不允许过度分配内存,这样也就不会出现oom的问题(非常不推荐,内存浪费严重)

sysctl -w vm.overcommit_memory=2 三个取值 0 1 2 默认值为0
0表示当用户请求更多内存时,内核尝试估算剩余的可用内存,计算方式为sqp总量加slab中可释放的总量+NR_FILE_PAGES总量 如果申请的内存超过这个数值,再进行一次计算(这里不懂),还是超过就分配失败
1表示允许超量使用内存,直到用完为止,主要用于科学计算
2表示绝不过量使用内存,即整个系统内存地址空间不能超过sqp分区+50%的ram值

查看进程的oom_score

/proc/PID/oom_score中 当得分为0时禁止杀掉该进程
另外两个文件 oom_score_adj 惩罚机制,计算得分时会额外计算这个文件中的数值,越大计算出来的得分就越大 取值范围正副1000 默认值0
oom_adj 取值范围-17-15 -17表示永不杀死这个进程 默认值0

posted @   你我都是孤独的鬼  阅读(776)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示