使用 systemd 保持服务器性能

使用 systemd 保持服务器性能

我想执行一个长时间运行、占用大量内存的任务,但不影响服务器的性能。我的服务器有 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

相关内容