ошибка sched_setscheduler (EPERM) после установки libpam-systemd

Просто пытаюсь установить максимальный приоритет расписания с помощью политики SCHED_FIFO. Этот код начал выдавать ошибку после того, как я установил libpam-systemd.

EDIT: сводится к двум приведенным ниже вопросам, задайте их как можно яснее.

СТРЕЙС:

sched_setscheduler(564, SCHED_FIFO, {99}) = -1 EPERM (Операция не разрешена)

param.sched_priority = sched_get_priority_max(SCHED_FIFO);
printf("priority %d \n", param.sched_priority);

ret1 = sched_setscheduler(getpid(), SCHED_FIFO, &param);
printf("sched_setscheduler ret %d \n", ret1);
if(ret1 == -1){
    perror("sched_setscheduler");
    goto fail;
}

ВОПРОС: Почему привилегированный пользователь должен получить EPERM?

Также безуспешно пытался установить ниже в /etc/security/limits.conf.

root   soft   rtprio       99    
root   hard   rtprio       99

ИЗ ФАЙЛА КОНФИГУРАЦИИ KENREL

#CONFIG_SCHED_AUTOGROUP is not set
CONFIG_CGROUP_SCHED=y
CONFIG_FAIR_GROUP_SCHED=y
CONFIG_CFS_BANDWIDTH=y
CONFIG_RT_GROUP_SCHED=y
CONFIG_GENERIC_SCHED_CLOCK=y
CONFIG_CGROUPS=y
CONFIG_CGROUP_DEBUG=y
CONFIG_CGROUP_FREEZER=y

ОБНОВЛЕНИЕ Ошибка в коде ядра в файле linux/kernel/sched/core.c

#ifdef CONFIG_RT_GROUP_SCHED
    /*
     * Do not allow realtime tasks into groups that have no runtime
     * assigned.
     */
    if (rt_bandwidth_enabled() && rt_policy(policy) &&
            task_group(p)->rt_bandwidth.rt_runtime == 0 &&
            !task_group_is_autogroup(task_group(p))) {
        task_rq_unlock(rq, p, &flags);
        return -EPERM;
    }
#endif

PASS CASE: без libpam-systemd я получаю следующие значения

[   36.278241] rt_bandwidth_enabled(): 1 
[   36.281977] rt_policy(policy) : 1 
[   36.285367] task_group_is_autogroup(task_group(p)) : 0 
[   36.289883] task_group(p)->rt_bandwidth.rt_runtime : 950000000 

FAIL CASE: с libpam-systemd я получаю следующие значения

[ 2096.713855] rt_bandwidth_enabled(): 1 
[ 2096.717871] rt_policy(policy) : 1 
[ 2096.721408] task_group_is_autogroup(task_group(p)) : 0 
[ 2096.726180] task_group(p)->rt_bandwidth.rt_runtime: 0

ВОПРОС: Почему libpam-systemd должен изменять пропускную способность среды выполнения rt для пользователя root?

Значения времени выполнения Scheduler RT из proc

root@jarvis:/home/jarvis# cat /proc/sys/kernel/sched_rt_runtime_us 
950000
root@jarvis:/home/jarvis# cat /proc/sys/kernel/sched_rt_period_us
1000000

Любая помощь высоко ценится.


person jarvis1729    schedule 01.12.2015    source источник
comment
Обсуждение в списке рассылки systemd относительно того же находится на @ lists.freedesktop .org/archives/systemd-devel/2016-Январь/   -  person jarvis1729    schedule 01.02.2016
comment
Настройка CONFIG_RT_GROUP_SCHED=n решила эту проблему.   -  person jarvis1729    schedule 21.03.2016


Ответы (1)


systemd создает отдельную cgroup для каждого пользователя и каждой службы. Проверьте /proc/self/cgroup, чтобы увидеть различия. Обратите внимание, что существуют известные проблемы с планированием RT:

    We recommend to turn off Real-Time group scheduling in the
    kernel when using systemd. RT group scheduling effectively
    makes RT scheduling unavailable for most userspace, since it
    requires explicit assignment of RT budgets to each unit whose
    processes making use of RT. As there's no sensible way to
    assign these budgets automatically this cannot really be
    fixed, and it's best to disable group scheduling hence.
       CONFIG_RT_GROUP_SCHED=n
person user1686    schedule 29.01.2016