我想执行一个长时间运行、占用大量内存的任务,但不影响服务器的性能。我的服务器有 4GB RAM,我创建了一个 30GB 的交换文件。
有一个非常耗费内存的程序(它对一个巨大的数据库执行复杂的查询),一段时间后,它会给服务器带来很大的压力,以至于我甚至无法通过 ssh 登录。
我的计划是通过 systemd 来限制该程序的资源。首先,防止用户和系统程序交换:
# systemctl edit user.slice
[Slice]
MemorySwapMax=0
和
# systemctl edit system.slice
[Slice]
MemorySwapMax=0
然后,为内存密集型程序创建一个切片:
[Slice]
CPUAccounting=true
CPUShares=512
MemoryLimit=1G
MemoryMax=1.1G
MemorySwapMax=infinity
这应该可以防止程序使用超过 1GB 的 RAM,但允许它随意交换 - 对吗?
不幸的是,这不管用。要么程序被杀死,要么服务器在一段时间后无法访问(当调整值时)。
我能做我喜欢做的事吗?如果可以,我该怎么做?
编辑:我的解决方案
echo 100 > /sys/fs/cgroup/memory/<myswappingslice>.slice/memory.swappiness
echo 0 > /sys/fs/cgroup/memory/user.slice/memory.swappiness
echo 0 > /sys/fs/cgroup/memory/system.slice/memory.swappiness
就这样。我将消耗内存的服务分配给 .slice,以便它积极交换,不会用尽所有 RAM。通过阻止 user.slice 和 system.slice 交换,服务器的整体性能不会受到负面影响。
答案1
该MemorySwapMax=
指令是在 systemd 232 中引入的。如果您使用的是旧版本,则可能无法使用此指令。
没有命名的指令MemoryMax=
,但是有MemoryLimit=
。
请参阅man systemd.directives
您安装的 systemd 版本中的所有指令列表,包括对man
它们所记录页面的引用。
答案2
MemoryMax= 存在,但它相当新,旧版本的 systemd 可能没有使用它。
在此处查看文档。
https://www.freedesktop.org/software/systemd/man/systemd.resource-control.html