From 57e6b86b53010dd2612b0a6a4e04917673062ecf Mon Sep 17 00:00:00 2001 From: Jan Friesse Date: Mon, 3 May 2021 15:29:04 +0200 Subject: [PATCH 3/7] main: Add support for cgroup v2 Support for cgroup v2 is very similar to cgroup v1 just checking (and writing) different file. Testing this feature is a bit harder than with cgroup v1 so it's probably worh noting in this commit message. 1. Copy some service file (I've used httpd service) and set CPUQuota=30% in the [service] section. 2. Check /sys/fs/cgroup/cgroup.subtree_control - there should be no "cpu" 3. Start modified service 4. Check /sys/fs/cgroup/cgroup.subtree_control - there should be "cpu" 5. Start corosync - It should be able to get rt priority When move_to_root_cgroup is disabled, behavior differs: - If corosync is started before modified service, so there is no "cpu" in /sys/fs/cgroup/cgroup.subtree_control corosync starts without problem and gets rt priority. Starting modified service later will never add "cpu" into /sys/fs/cgroup/cgroup.subtree_control (because corosync is holding rt priority and it is placed in the non-root cgroup by systemd). - When corosync is started after modified service, so "cpu" is in /sys/fs/cgroup/cgroup.subtree_control, corosync is not able to get RT priority. Signed-off-by: Jan Friesse Reviewed-by: Christine Caulfield --- exec/main.c | 21 ++++++++++++++++----- man/corosync.conf.5 | 14 ++++++++++---- 2 files changed, 26 insertions(+), 9 deletions(-) diff --git a/exec/main.c b/exec/main.c index aa6d9fbf..65ae5e4f 100644 --- a/exec/main.c +++ b/exec/main.c @@ -1173,6 +1173,7 @@ error_close: static int corosync_move_to_root_cgroup(void) { FILE *f; int res = -1; + const char *cgroup_task_fname = NULL; /* * /sys/fs/cgroup is hardcoded, because most of Linux distributions are now @@ -1183,15 +1184,25 @@ static int corosync_move_to_root_cgroup(void) { */ f = fopen("/sys/fs/cgroup/cpu/cpu.rt_runtime_us", "rt"); if (f == NULL) { - log_printf(LOGSYS_LEVEL_DEBUG, "cpu.rt_runtime_us doesn't exists -> " - "system without cgroup or with disabled CONFIG_RT_GROUP_SCHED"); + /* + * Try cgroup v2 + */ + f = fopen("/sys/fs/cgroup/cgroup.procs", "rt"); + if (f == NULL) { + log_printf(LOG_DEBUG, "cpu.rt_runtime_us or cgroup.procs doesn't exist -> " + "system without cgroup or with disabled CONFIG_RT_GROUP_SCHED"); - res = 0; - goto exit_res; + res = 0; + goto exit_res; + } else { + cgroup_task_fname = "/sys/fs/cgroup/cgroup.procs"; + } + } else { + cgroup_task_fname = "/sys/fs/cgroup/cpu/tasks"; } (void)fclose(f); - f = fopen("/sys/fs/cgroup/cpu/tasks", "w"); + f = fopen(cgroup_task_fname, "w"); if (f == NULL) { log_printf(LOGSYS_LEVEL_WARNING, "Can't open cgroups tasks file for writing"); diff --git a/man/corosync.conf.5 b/man/corosync.conf.5 index 25289ba4..1c9d2ad7 100644 --- a/man/corosync.conf.5 +++ b/man/corosync.conf.5 @@ -1,6 +1,6 @@ .\"/* .\" * Copyright (c) 2005 MontaVista Software, Inc. -.\" * Copyright (c) 2006-2020 Red Hat, Inc. +.\" * Copyright (c) 2006-2021 Red Hat, Inc. .\" * .\" * All rights reserved. .\" * @@ -32,7 +32,7 @@ .\" * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF .\" * THE POSSIBILITY OF SUCH DAMAGE. .\" */ -.TH COROSYNC_CONF 5 2021-04-09 "corosync Man Page" "Corosync Cluster Engine Programmer's Manual" +.TH COROSYNC_CONF 5 2021-05-03 "corosync Man Page" "Corosync Cluster Engine Programmer's Manual" .SH NAME corosync.conf - corosync executive configuration file @@ -800,8 +800,14 @@ meaning maximal / minimal priority (so minimal / maximal nice value). .TP move_to_root_cgroup Should be set to yes (default) if corosync should try to move itself to root -cgroup. This feature is available only for systems with cgroups with RT -sched enabled (Linux with CONFIG_RT_GROUP_SCHED kernel option). +cgroup. This feature is available only for systems with cgroups v1 with RT +sched enabled (Linux with CONFIG_RT_GROUP_SCHED kernel option) and cgroups v2. + +It's worth noting that currently (May 3 2021) cgroup2 doesn’t yet +support control of realtime processes and the cpu controller can only be +enabled when all RT processes are in the root cgroup. So when move_to_root_cgroup +is disabled and systemd is used, it may be impossible to make systemd options +like CPUQuota working correctly until corosync is stopped. .TP allow_knet_handle_fallback -- 2.27.0