修改cgroup的swappiness方法
错误一
使用sysctl修改swappiness在cgroup v1中,很多情况下都不会生效,因为大部分系统中,用户进程的memory cgroup层级都不是在memory子系统的根级,修改并不会影响cgroup子级配置。
错误二
tmpfiles方法会出现竞争情况,并不是总是有效的。
有效方法
该方法摘自:《system.slice swappiness is inconsistent with vm.swappiness sysctl》
翻译与改编如下:
我发现tmpfiles方法存在竞争问题,例如:
- snippet.bash
[root@localhost ~]# cat /etc/tmpfiles.d/swappiness.conf w /sys/fs/cgroup/memory/system.slice/memory.swappiness - - - - 10 w /sys/fs/cgroup/memory/user.slice/memory.swappiness - - - - 10 w /sys/fs/cgroup/memory/init.scope/memory.swappiness - - - - 10 [root@localhost ~]# cat $(find /sys/fs/cgroup/memory -name memory.swappiness) | sort -n | uniq -c 67 10 // some got the '10' 1 30 // global cgroup 45 60 // some still at default
在我看来,更好的方法是简单地强行改变memory.swappiness。最好是在引导时,在所有现有的cgroups上切换,特别是“After=systemd-sysctl.service”。
我草拟了以下方法,似乎工作挺好:
- snippet.bash
[root@localhost ~]# cat /usr/bin/cgroup_swappiness_set.sh #!/bin/sh CGROUP_V1_MEMORY_DIR=$(mount | grep "^cgroup .*memory" | cut -d ' ' -f 3) if [ -z $CGROUP_V1_MEMORY_DIR ]; then exit -22 # EINVAL fi GLOBAL_SWAPPINESS=$(cat /proc/sys/vm/swappiness) for cg in $(find $CGROUP_V1_MEMORY_DIR -name memory.swappiness); do echo $GLOBAL_SWAPPINESS > $cg done [root@localhost ~]# chmod +x /usr/bin/cgroup_swappiness_set.sh [root@localhost ~]# cat /usr/lib/systemd/system/swappiness_fix.service [Unit] Description=Set all existing -v1 memory cgroups to global vm.swappiness After=systemd-sysctl.service [Service] Type=oneshot ExecStart=/usr/bin/cgroup_swappiness_set.sh [Install] WantedBy=multi-user.target [root@localhost ~]# systemctl enable swappiness_fix.service
更好的方法是确保它以文件系统结构的“预购”方式设置。
打赏作者以资鼓励:
![]() | ![]() |