1

In CentOS 7 how do I set the default memory.swappiness for all the systemd cgroups? I can do it per cgroup via the ControlGroupAttribute option, but I would like to override the default of 60 for all the cgroups.

Jeff Kubina
  • 397
  • 1
  • 3
  • 12

1 Answers1

1

If you want to do this for ALL cgroups, do you want to do this for the whole system? If that's the case, you can set swappiness system wide in "/etc/sysctl.conf". The line you would be editing is "vm.swappiness=" which you can set to anything from 0 to 100.

As a fair warning to anyone moving this value as a way to avoid swapping altogether, setting this very low will almost entirely disable demand paging, which is a very useful way to get idle pages out of RAM and into swap. Yes, it's "swapping", but that's not such a desperate thing as is the old traditional sense of swapping when we run out of memory. Demand paging is especially useful in large databases, and it shouldn't really slow anything down. It certainly beats swapping things out when we're out of memory last second, as demand paging helps to keep that from happening in the first place while the system isn't grinding to a halt, rather than after it is. A setting of 0 for vm.swappiness system wide can cause a system to OOM kill processes when under heavy pressure, potentially bringing the whole system down in a kernel panic.

Also worth mentioning, you must call upon the sysctl.conf file to be read after editing it. # sysctl -p reads lines that have been modified in /etc/sysctl.conf. vm.swappiness can be changed on a running system this way, or by using procfs thusly: # echo 50 > /proc/sys/vm/swappiness where 50 is any number from 0 to 100.

Spooler
  • 7,016
  • 16
  • 29
  • 1
    I already have vm.swappiness set to zero and what I am see is some processes (mesos) swapping out a lot that have their cgroup swappiness set to 60. So I don't think vm.swappiness takes precedence over the cgroups setting, does it? – Jeff Kubina Sep 27 '16 at 13:25
  • 1
    I'm looking through kernel documentation. I see that a top-hierarchy cgroup does honor the global vm.swappiness level. However, I don't see any mention of child cgroups. I don't see why it wouldn't carry forth, but I need to chew on more documentation and probably spin up a little lab real quick. I know that memory.swappiness isn't a setting you may use on root cgroups with children. Also, this scenario *may* have already been addressed in http://unix.stackexchange.com/questions/77939/turning-off-swapping-for-only-one-process-with-cgroups – Spooler Sep 27 '16 at 15:58
  • My scenario was not addressed in the unix.stackexchange link, but it got me to even more documentation and to having more questions. 1) The default swappiness for cgroups is 60, but how do I change that system wide for all existing and/or new cgroups? 2) On my system vm.swappiness=0 but "cgget -r memory.swappiness /" returns 60, shouldn't it return zero? 3) From the cgroup/memory docs the "limit reclaim enforces that 0 swappiness really prevents from any swapping even if there is a swap storage available"; so wrt cgroups does that mean setting memory.swappiness=0 turns swapping off? – Jeff Kubina Sep 27 '16 at 18:39
  • I am wrong on 2), I just verified that doing "sysctl -w vm.swappiness=n" sets /sys/fs/cgroup/memory/memory.swappiness to n, and vise versa. – Jeff Kubina Sep 27 '16 at 18:51
  • Ah, yes. You must read the sysctl.conf file into the proc filesystem, or set vm.swappiness via proc directly, which you've accomplished with that command. Turning swappiness to 0 does not tun swap off, but it does prevent the system from demand paging until the last second. It might as well be off in this case, as this will probably kill the system for that to happen. – Spooler Sep 27 '16 at 19:00
  • So on a fresh CentOS7 install I did sysctl -w vm.swappiness=0, edited /etc/system/system.conf so that Default{CPU,BlockIO,Memory}Account=yes, and then after a reboot I find vm.swappiness=/sys/fs/cgroup/memory/memory.swappiness=60. Actually all cgroups have memory.swappiness=60. Seems like activating cgroup memory account is causing it to set memory.swappiness=60. – Jeff Kubina Sep 27 '16 at 20:05
  • 1
    sysctl -w only changes the running values on your system. It does not make persistent entries, so changes made with -w will be lost on reboot. If you want changes to persist, update the /etc/sysctl.conf file with your desired values as well as updating your running values (as the sysctl.conf file does not control things in real time). – Spooler Sep 28 '16 at 00:22