Linux内存限制方案_cgroup内存控制解析【指导】
发布时间 - 2026-01-02 00:00:00 点击率:次cgroup v1 的 memory.limit_in_bytes 不生效的根本原因是容器或进程未真正运行在指定 cgroup 下,或内核未启用 memory 子系统;需检查挂载、进程归属、路径创建及 systemd/cgroup 版本兼容性。
为什么 cgroup v1 的 memory.limit_in_bytes 有时不生效
根本原因常是容器或进程没真正运行在指定 cgroup 路径下,或者内核未启用对应控制组子系统。检查时先确认 /sys/fs/cgroup/memory 是否可挂载且非空;再看目标进程的 cgroup.procs 文件是否包含其 PID。
- 用
cat /proc/确认进程归属的 memory cgroup 路径/cgroup - 写入限制前必须确保该 cgroup 目录已创建,且
memory.limit_in_bytes文件存在(不是只读) - 若使用 systemd 启动服务,需通过
MemoryLimit=设置,而非手动操作/sys/fs/cgroup下文件——systemd 会接管并覆盖手动配置 - 某些发行版(如 RHEL 8+/CentOS 8+)默认启用
cgroup v2,此时memory.limit_in_bytes不可用,应改用memory.max
cgroup v2 中设置内存上限:用 memory.max 而非 memory.limit_in_bytes
cgroup v2 统一了接口,所有资源控制都通过单一层级实现。内存限制字段变为 memory.max,单位仍是字节,但支持特殊值:max 表示无限制,0 表示禁止分配新内存(等效于立即 OOM)。
- 创建 v2 cgroup:先挂载
mount -t cgroup2 none /sys/fs/cgroup,然后mkdir /sys/fs/cgroup/m
yapp - 设上限为 512MB:
echo 536870912 > /sys/fs/cgroup/myapp/memory.max
- 将进程加入:
echo
> /sys/fs/cgroup/myapp/cgroup.procs - 注意:v2 下
memory.usage_in_bytes已改为memory.current,监控时别用错路径
OOM 发生时为何进程没被杀,而是卡住或响应迟缓
这是因 memory.oom_control(v1)或 memory.oom(v2)默认开启“OOM killer”,但实际触发取决于当前内存压力与页面回收效率。若进程持续申请不可回收内存(如匿名 mmap + 锁页),或 cgroup 内有多个子组竞争,OOM killer 可能延迟响应甚至无法及时选中目标进程。
- v1 中可关闭自动 kill:
echo 1 > memory.oom_control,此时超限时直接阻塞内存分配(malloc返回 NULL,mmap失败) - v2 中等效机制是写
memory.oom为0,但更推荐配合memory.high做软性限流——它会在接近阈值时主动回收内存,避免突兀 OOM - 检查是否真触发 OOM:
dmesg -T | grep -i "killed process",若无输出,说明只是内存紧张而非被杀
和 Docker/Kubernetes 的内存限制冲突怎么办
Docker 默认使用 cgroup v2(1.21+),Kubernetes 则依赖 kubelet 配置的 cgroupDriver。若宿主机手动修改了某 cgroup 路径下的限制,而容器运行时又覆盖了同一路径,结果不可预测——通常以最后写入者为准,但可能引发状态不一致。
- 不要在 Docker 容器运行后手动改其 cgroup 目录(如
/sys/fs/cgroup/mycontainer/...),Docker 会定期同步配置 - Kubernetes 中应统一通过 Pod 的
resources.limits.memory控制,底层由 kubelet 转为memory.max或memory.limit_in_bytes - 调试时可查容器真实 cgroup 路径:
cat /proc/,再比对/cgroup memory.max值是否匹配预期
最易被忽略的是 cgroup 版本混用:同一个系统里 v1 和 v2 可能共存,但不能对同一进程同时生效。确认清楚当前环境用的是哪套接口,再选对应字段操作,否则所有设置都是徒劳。
# linux
# centos
# docker
# app
# 字节
# ai
# kubernetes
# 为什么
# echo
# NULL
# 接口
# kubelet
# 的是
# 而非
# 被杀
# 根本原因
# 都是
# 这是
# 会在
# 有多
# 仍是
# 所有资源
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
JavaScript数据类型有哪些_如何准确判断一个变量的类型
如何快速生成高效建站系统源代码?
独立制作一个网站多少钱,建立网站需要花多少钱?
php做exe能调用系统命令吗_执行cmd指令实现方式【详解】
Midjourney怎么调整光影效果_Midjourney光影调整方法【指南】
如何快速搭建高效可靠的建站解决方案?
如何快速生成凡客建站的专业级图册?
Laravel Asset编译怎么配置_Laravel Vite前端构建工具使用
如何在阿里云虚拟主机上快速搭建个人网站?
zabbix利用python脚本发送报警邮件的方法
Laravel如何设置定时任务(Cron Job)_Laravel调度器与任务计划配置
Laravel如何实现邮件验证激活账户_Laravel内置MustVerifyEmail接口配置【步骤】
edge浏览器无法安装扩展 edge浏览器插件安装失败【解决方法】
如何在建站之星网店版论坛获取技术支持?
在centOS 7安装mysql 5.7的详细教程
详解jQuery中基本的动画方法
免费视频制作网站,更新又快又好的免费电影网站?
Swift中循环语句中的转移语句 break 和 continue
Laravel如何实现本地化和多语言支持?(i18n教程)
如何利用DOS批处理实现定时关机操作详解
浅谈redis在项目中的应用
JavaScript中的标签模板是什么_它如何扩展字符串功能
如何正确下载安装西数主机建站助手?
php 三元运算符实例详细介绍
Android 常见的图片加载框架详细介绍
Python文件操作最佳实践_稳定性说明【指导】
Laravel如何处理和验证JSON类型的数据库字段
Laravel如何优雅地处理服务层_在Laravel中使用Service层和Repository层
详解CentOS6.5 安装 MySQL5.1.71的方法
android nfc常用标签读取总结
如何快速生成可下载的建站源码工具?
Laravel如何生成和使用数据填充?(Seeder和Factory示例)
如何在IIS中新建站点并配置端口与物理路径?
Laravel如何生成PDF或Excel文件_Laravel文档导出工具与使用教程
什么是JavaScript解构赋值_解构赋值有哪些实用技巧
JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)
Laravel如何使用Seeder填充数据_Laravel模型工厂Factory批量生成测试数据【方法】
JS实现鼠标移上去显示图片或微信二维码
JavaScript如何操作视频_媒体API怎么控制播放
利用JavaScript实现拖拽改变元素大小
Laravel Eloquent:优雅地将关联模型字段扁平化到主模型中
Laravel如何实现API版本控制_Laravel版本化API设计方案
Chrome浏览器标签页分组怎么用_谷歌浏览器整理标签页技巧【效率】
Laravel全局作用域是什么_Laravel Eloquent Global Scopes应用指南
如何快速查询网址的建站时间与历史轨迹?
进行网站优化必须要坚持的四大原则
jimdo怎样用html5做选项卡_jimdo选项卡html5实现与切换效果【指南】
Android中Textview和图片同行显示(文字超出用省略号,图片自动靠右边)
详解jQuery停止动画——stop()方法的使用
Laravel如何发送系统通知?(Notification渠道示例)
上一篇:猪易通app缓存清理方法
上一篇:猪易通app缓存清理方法


yapp