systemd-run内存限制未在/proc/meminfo显示,如何获取受限可用内存?
获取systemd scope限制下的可用内存
当你用systemd-run --scope设置内存限制后,/proc/meminfo返回的是系统全局内存状态,自然看不到cgroup层面的限制。你可以通过以下几种方式获取当前进程受约束的可用内存:
直接读取cgroup内存控制器文件
systemd的内存限制是通过cgroup实现的,你可以直接读取对应cgroup下的内存统计文件:- 对于cgroup v2(现代Linux系统默认):
- 已用内存:
cat /sys/fs/cgroup/memory.current - 内存上限:
cat /sys/fs/cgroup/memory.max
可用内存即为memory.max减去memory.current的差值。
- 已用内存:
- 对于cgroup v1:
- 已用内存:
cat /sys/fs/cgroup/memory/memory.usage_in_bytes - 内存上限:
cat /sys/fs/cgroup/memory/memory.limit_in_bytes
如果你不确定当前进程的cgroup路径,可以读取/proc/self/cgroup文件,找到memory相关的条目,再对应到/sys/fs/cgroup下的路径。
- 已用内存:
- 对于cgroup v2(现代Linux系统默认):
通过systemctl查询scope单元属性
先找到你创建的scope单元名称(可以用systemctl list-units --type=scope查看),然后用systemctl show获取内存相关属性:systemctl show <scope-name> -p MemoryCurrent,MemoryMax输出会给出当前已用内存和设置的上限,计算两者差值就能得到可用内存。这种方式适合监控整个scope组的内存状态。
注意事项
- 确保你的进程确实运行在目标scope中,可以通过
systemctl status <scope-name>或者查看/proc/[pid]/cgroup确认。 - 如果是cgroup v2,部分老工具可能不兼容,优先使用
memory.current和memory.max这两个标准文件。
- 确保你的进程确实运行在目标scope中,可以通过
内容的提问来源于stack exchange,提问作者Oreborous
相关产品推荐
相关产品推荐

