Since Systemd v213 and consequently with RHEL 7.2, a new resource control option called CPUQuota is now available.
Last year I wrote a post on the CPUShares option.
I decided to revisit it with this new CPUQuota option.
Caution: The following tutorial shouldn’t be run on a production server! The CPU will be used at 100%!
As in the previous post, I created a basic Systemd unit file called /etc/systemd/system/testSpeed.service:
[Unit] Description=Test Speed After=syslog.target [Service] ExecStart=/usr/bin/openssl speed ExecStop=/bin/kill -WINCH ${MAINPID} [Install] WantedBy=multi-user.target
Then, I created another copy of this file and updated the Systemd configuration:
# cd /etc/systemd/system; cp testSpeed.service testSpeed2.service # systemctl daemon-reload
I started both new services on a fresh standard install of Centos 7.2 on a VM with 1 vCPU:
# systemctl start testSpeed testSpeed2
Each of the two new services were using almost 50% of the CPU time (excerpt of the top command execution):
PID USER PR NI S %CPU %MEM TIME+ COMMAND 24598 root 20 0 R 49.8 0.3 0:08.42 openssl 24601 root 20 0 R 49.8 0.3 0:08.40 openssl
I checked the default CPUQuota property of the testSpeed service:
# systemctl show testSpeed | grep CPUQuota CPUQuotaPerSecUSec=infinity
Note: Don’t ask me why the option is called CPUQuota and the property CPUQuotaPerSecUSec, I don’t know!
Because I wanted to learn how CGroups were working, I decided to apply a CPU constraint:
# systemctl set-property testSpeed CPUQuota=10%
Note: You don’t need to restart any service. The % character is not optional.
Now, the testSpeed service gets 10% of the CPU time and the testSpeed2 gets 90%:
PID USER PR NI S %CPU %MEM TIME+ COMMAND 24601 root 20 0 R 90.0 0.3 1:23.58 openssl 24598 root 20 0 R 10.0 0.3 1:22.20 openssl
The CPUQuota property of the testSpeed & testSpeed2 services is now as follows:
# systemctl show testSpeed | grep CPUQuota CPUQuotaPerSecUSec=100ms DropInPaths=/etc/systemd/system/testSpeed.service.d/50-CPUQuota.conf # systemctl show testSpeed2 | grep CPUQuota CPUQuotaPerSecUSec=infinity
What exactly happened?
With the CPUShares option, you assigned a percentage of CPU time to a service. With the CPUQuota option, you now set a duration in millisecond. This duration is the maximum of CPU time allowed to a service per second. This service can get an amount of CPU time below but not above this limit.
The behaviour of the CPUQuota option is much easier to understand than the CPUShares‘.
Look at my CGroups page to get some other tips on this topic.
Some additional information is available in the systemd.resource-control man page.
Recent Comments