Message ID | 20240409225612.1837905-1-bmarzins@redhat.com (mailing list archive) |
---|---|
State | Not Applicable, archived |
Delegated to: | christophe varoqui |
Headers | show |
Series | [v2] multipathd: make multipathd set priority to RLIMIT_RTPRIO | expand |
On Tue, 2024-04-09 at 18:56 -0400, Benjamin Marzinski wrote: > With this change, if the SCHED_RT_PRIO compiler flag has been > removed. > Instead multipathd will call getrlimit(RLIMIT_RTPRIO, ...) and look > at > the hard limit. It it's 0, multipath will do nothing. Otherwise it > will > change its scheduling policy to SCHED_RR and its priority to the hard > limit. > > This allows users to change the priority of that multipathd runs with > by > adding > > LimitRTPRIO=<prio> > > to the [Service] section of the multipathd.service unit file. Setting > LimitRTPRIO=0 will make multipathd run as a normal process, while > setting LimitRTPRIO=infinity will make it use the maximum SCHED_RR > prio, > which is 99. > > To keep the existing behavior, multipathd.service now sets > LimitRTPRIO=infinity > > Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com> Reviewed-by: Martin Wilck <mwilck@suse.com> I will wait a while for feedback on https://github.com/opensvc/multipath-tools/issues/82 before pushing it to the queue branch. When it's pushed, I'll squash it with 1c4301a ("multipathd: make multipathd scheduling configurable"), if you don't mind. Thanks, Martin
On Wed, Apr 10, 2024 at 10:37:38AM +0200, Martin Wilck wrote: > On Tue, 2024-04-09 at 18:56 -0400, Benjamin Marzinski wrote: > > With this change, if the SCHED_RT_PRIO compiler flag has been > > removed. > > Instead multipathd will call getrlimit(RLIMIT_RTPRIO, ...) and look > > at > > the hard limit. It it's 0, multipath will do nothing. Otherwise it > > will > > change its scheduling policy to SCHED_RR and its priority to the hard > > limit. > > > > This allows users to change the priority of that multipathd runs with > > by > > adding > > > > LimitRTPRIO=<prio> > > > > to the [Service] section of the multipathd.service unit file. Setting > > LimitRTPRIO=0 will make multipathd run as a normal process, while > > setting LimitRTPRIO=infinity will make it use the maximum SCHED_RR > > prio, > > which is 99. > > > > To keep the existing behavior, multipathd.service now sets > > LimitRTPRIO=infinity > > > > Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com> > > Reviewed-by: Martin Wilck <mwilck@suse.com> > > I will wait a while for feedback on > https://github.com/opensvc/multipath-tools/issues/82 > before pushing it to the queue branch. > > When it's pushed, I'll squash it with 1c4301a ("multipathd: make > multipathd scheduling configurable"), if you don't mind. That's fine. > > Thanks, > Martin
diff --git a/Makefile.inc b/Makefile.inc index 6d206281..5668e638 100644 --- a/Makefile.inc +++ b/Makefile.inc @@ -18,12 +18,6 @@ READLINE := # SCSI_DH_MODULES_PRELOAD := scsi_dh_alua scsi_dh_rdac SCSI_DH_MODULES_PRELOAD := -# Multipathd scheduling priority. Set value from 1 to 99 to make multipathd -# change its scheduling policy to SCHED_RR and its priority to the specified -# value. set to 0 to stop multipathd from changing the scheduling policy and -# priority it was started with. -SCHED_RT_PRIO := 99 - EXTRAVERSION := $(shell rev=$$(git rev-parse --short=7 HEAD 2>/dev/null); echo $${rev:+-g$$rev}) # PKG_CONFIG must be read from the environment to enable compilation diff --git a/README.md b/README.md index bb41bf0e..d4f35f57 100644 --- a/README.md +++ b/README.md @@ -98,9 +98,6 @@ The following variables can be passed to the `make` command line: By default, command line editing is disabled. Note that using libreadline may [make binary indistributable due to license incompatibility](https://github.com/opensvc/multipath-tools/issues/36). - * `SCHED_RT_PRIO={0-99}`: for values {1-99} set the realtime priority - multipathd will attempt to run with. for value 0, disable multipathd - changing itself to a realtime process. * `ENABLE_LIBDMMP=0`: disable building libdmmp * `ENABLE_DMEVENTS_POLL=0`: disable support for the device-mapper event polling API. For use with pre-5.0 kernels that don't support dmevent polling diff --git a/multipathd/Makefile b/multipathd/Makefile index 7300f07a..997b40cf 100644 --- a/multipathd/Makefile +++ b/multipathd/Makefile @@ -57,9 +57,6 @@ $(CLI): $(CLI_OBJS) cli_handlers.o: cli_handlers.c $(Q)$(CC) $(CPPFLAGS) $(CFLAGS) -Wno-unused-parameter -c -o $@ $< -main.o: main.c - $(Q)$(CC) $(CPPFLAGS) -DSCHED_RT_PRIO=$(SCHED_RT_PRIO) $(CFLAGS) -c -o $@ $< - install: $(Q)$(INSTALL_PROGRAM) -d $(DESTDIR)$(bindir) $(Q)$(INSTALL_PROGRAM) -m 755 $(EXEC) $(DESTDIR)$(bindir) diff --git a/multipathd/main.c b/multipathd/main.c index 9486a8a3..dd17d5c3 100644 --- a/multipathd/main.c +++ b/multipathd/main.c @@ -3171,14 +3171,23 @@ static void setscheduler (void) { int res; - static struct sched_param sched_param = { - .sched_priority = SCHED_RT_PRIO - }; + static struct sched_param sched_param; + struct rlimit rlim; + + if (getrlimit(RLIMIT_RTPRIO, &rlim) < 0 || rlim.rlim_max == 0) + return; + + sched_param.sched_priority = rlim.rlim_max > INT_MAX ? INT_MAX : + rlim.rlim_max; + res = sched_get_priority_max(SCHED_RR); + if (res > 0 && res < sched_param.sched_priority) + sched_param.sched_priority = res; - res = sched_setscheduler (0, SCHED_RR, &sched_param); + res = sched_setscheduler(0, SCHED_RR, &sched_param); if (res == -1) - condlog(2, "Could not set SCHED_RR at priority 99"); + condlog(2, "Could not set SCHED_RR at priority %d", + sched_param.sched_priority); return; } @@ -3471,8 +3480,7 @@ child (__attribute__((unused)) void *param) if (!vecs) goto failed; - if (SCHED_RT_PRIO) - setscheduler(); + setscheduler(); set_oom_adj(); #ifdef FPIN_EVENT_HANDLER if (conf->marginal_pathgroups == MARGINAL_PATHGROUP_FPIN) diff --git a/multipathd/multipathd.service.in b/multipathd/multipathd.service.in index 6d03ff71..18bb367e 100644 --- a/multipathd/multipathd.service.in +++ b/multipathd/multipathd.service.in @@ -19,6 +19,7 @@ NotifyAccess=main ExecStart=/sbin/multipathd -d -s ExecReload=/sbin/multipathd reconfigure TasksMax=infinity +LimitRTPRIO=infinity [Install] WantedBy=sysinit.target
With this change, if the SCHED_RT_PRIO compiler flag has been removed. Instead multipathd will call getrlimit(RLIMIT_RTPRIO, ...) and look at the hard limit. It it's 0, multipath will do nothing. Otherwise it will change its scheduling policy to SCHED_RR and its priority to the hard limit. This allows users to change the priority of that multipathd runs with by adding LimitRTPRIO=<prio> to the [Service] section of the multipathd.service unit file. Setting LimitRTPRIO=0 will make multipathd run as a normal process, while setting LimitRTPRIO=infinity will make it use the maximum SCHED_RR prio, which is 99. To keep the existing behavior, multipathd.service now sets LimitRTPRIO=infinity Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com> --- Notes: v2: Removed SCHED_RT_PRIO compiler flag at Martin Wilck's suggestion. Added LimitRTPRIO=infinity to multipathd.service Makefile.inc | 6 ------ README.md | 3 --- multipathd/Makefile | 3 --- multipathd/main.c | 22 +++++++++++++++------- multipathd/multipathd.service.in | 1 + 5 files changed, 16 insertions(+), 19 deletions(-)