我正在尝试配置我的 .service 文件以限制给定服务在终止之前可以使用多少内存,按系统内存的百分比(在这种情况下为 10% 作为上限):
[Unit]
Description=MQTT Loop
After=radioLoop.service
[Service]
Type=simple
Environment=PYTHONIOENCODING=UTF-8
ExecStart=/usr/bin/python3 -u /opt/pilot/mqttLoop.py
WorkingDirectory=/opt/pilot
StandardOutput=journal
Restart=on-failure
User=pilot
MemoryMax=10%
[Install]
WantedBy=multi-user.target
感兴趣的MemoryMax
线是根据我对systemd docs 的理解尝试配置的线。
我的 systemd 版本是:
systemd 241 (241)
+PAM +AUDIT +SELINUX +IMA +APPARMOR +SMACK +SYSVINIT +UTMP +LIBCRYPTSETUP +GCRYPT +GNUTLS +ACL +XZ +LZ4 +SECCOMP +BLKID +ELFUTILS +KMOD -IDN2 +IDN -PCRE2 default-hierarchy=hybrid
但它不起作用。
# ps -m -o lwp,rss,pmem,pcpu,unit -u pilot
LWP RSS %MEM %CPU UNIT
- 76244 30.3 8.5 mqttLoop.service
1232 - - 7.0 mqttLoop.service
1249 - - 1.7 mqttLoop.service
1254 - - 0.2 mqttLoop.service
我已经远远超过 10%(那里有 30%),然后它不会重新启动该过程。我试过交换MemoryMax
(MemoryLimit
相同值的旧变体),但它没有效果。我错过了什么?
更新
我已确定处理计数的 systemd 设置已正确打开。
# grep -i "memory" system.conf
#DefaultMemoryAccounting=yes
但我在内核配置中注意到以下内容:
Memory Controller
使用选定的选项重建内核就足够了吗?
是的,打开该选项足以使 MemoryMax 按预期工作。