FAIRYFAR-INTERNAL
 
  FAIRYFAR-INTERNAL  |  SITEMAP  |  ABOUT-ME  |  HOME  
修改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

更好的方法是确保它以文件系统结构的“预购”方式设置。



打赏作者以资鼓励:
移动端扫码阅读: