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 <jfriesse@redhat.com>
Reviewed-by: Christine Caulfield <ccaulfie@redhat.com>
This commit is contained in:
Jan Friesse 2021-05-03 15:29:04 +02:00
parent 27369481e5
commit 57e6b86b53
2 changed files with 26 additions and 9 deletions

View File

@ -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");

View File

@ -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 doesnt 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