在银河麒麟v10中限制进程内存需按启动方式选择方法:systemd服务用memorylimit配置永久生效;普通进程可用systemd-run临时托管或cgroup v2接口实时设限,后者需root权限且依赖cgroup v2启用。

在银河麒麟V10系统中限制某个进程的最大内存使用量,需根据该进程的启动方式选择对应层级的管控手段:若为普通用户命令行启动,用cgroups v2手动绑定;若由systemd管理,则必须通过service unit文件配置MemoryLimit;临时调试可在线写入/proc/PID/cgroup,但该操作不持久且依赖内核启用cgroup v2。
针对systemd服务进程(推荐用于nginx、dmserver等)
此方法适用于绝大多数后台服务,配置后永久生效,无需重启系统,且与systemd生命周期完全同步。
运行sudo systemctl edit nginx.service,在打开的编辑器中输入以下内容:
[Service]
MemoryLimit=1G
保存退出后,systemd会自动将新配置合并到服务单元中,无需执行daemon-reload。
验证是否生效:执行sudo systemctl show nginx.service | grep MemoryLimit,输出应为“MemoryLimit=1073741824”(即1G字节数)。
【注意:若服务此前已设置MemoryMax或MemoryHigh等参数,它们会与MemoryLimit冲突,必须统一删除旧参数只保留MemoryLimit】
针对任意正在运行的普通进程(如Java应用、Python脚本)
此方法不依赖进程启动方式,只要知道PID即可实时设限,但仅在当前运行周期内有效,进程重启后需重做。
方法一:使用systemd-run临时托管(推荐)
第一步:获取目标进程PID,例如ps aux | grep "java.*spring" | grep -v grep | awk '{print $2}'
第二步:用systemd-run创建带内存限制的新实例——执行systemd-run --scope -p MemoryMax=512M --uid $(id -u) --gid $(id -g) /proc/【PID】/exe,其中【PID】替换为实际数字。该命令会复刻原进程并强制其运行在512MB内存上限下。
方法二:直接写入cgroup v2接口(需root且确认已启用cgroup v2)
执行mkdir -p /sys/fs/cgroup/mylimit → echo 【PID】 > /sys/fs/cgroup/mylimit/cgroup.procs → echo 536870912 > /sys/fs/cgroup/mylimit/memory.max
这一步必须确保/sys/fs/cgroup挂载为cgroup2类型,否则写入memory.max会报错“No such file or directory”。
验证限制是否真实生效
运行sudo cat /sys/fs/cgroup/mylimit/memory.current,该值会实时显示当前cgroup内所有进程占用的物理内存字节数。
当该数值持续接近memory.max设定值时,内核将开始回收页面,若仍无法释放足够内存,OOM Killer会被触发并终止该cgroup中最易杀进程。
检查OOM事件记录:dmesg -T | grep -i "killed process",若输出中包含目标进程名,说明内存限制已起作用并触发了保护机制。











