抱歉,如果我在这里而不是 super 用户发帖。

我试图在实时组内运行docker时遇到了启用cgroups-内核中的CONFIG_RT_GROUP_SCHED来运行实时docker应用程序的情况(此处为https://docs.docker.com/config/containers/resource_constraints/#configure-the-default-cfs-scheduler)

我将内核配置为启用FIFO / RR标志并进行了验证(可在此处使用:How to enable CONFIG_RT_GROUP_SCHED in Ubuntu to make it RT)

我相信我的系统现在已正确调度,因为我能够在该系统上运行资源受限的docker,该系统使用以下命令访问cgroup:

$ docker run -it --cpu-rt-runtime=950000 \
                      --ulimit rtprio=99 \
                      --cap-add=sys_nice \
                      debian:jessie

我继续尝试探索RT系统的更多功能。我有此CPP代码将RT优先级调度分配给线程。此代码基本上试图将SCHED_FIFO优先级设置为线程,并在内核允许的情况下进行打印,以进行打印。
#include <iostream>
#include <pthread.h>
#include <sched.h>

using namespace std;

void set_realtime_priority() {
     int ret;
     // We'll operate on the currently running thread.
     pthread_t this_thread = pthread_self();
     // struct sched_param is used to store the scheduling priority
     struct sched_param params;

     // We'll set the priority to the maximum.
     params.sched_priority = sched_get_priority_max(SCHED_FIFO);
     std::cout << "Trying to set thread realtime prio = " << params.sched_priority << std::endl;

     // Attempt to set thread real-time priority to the SCHED_FIFO policy
     ret = pthread_setschedparam(this_thread, SCHED_FIFO, &params);
     if (ret != 0) {
         // Print the error
         std::cout << "Unsuccessful in setting thread realtime prio" << std::endl;
         return;
     }
     // Now verify the change in thread priority
     int policy = 0;
     ret = pthread_getschedparam(this_thread, &policy, &params);
     if (ret != 0) {
         std::cout << "Couldn't retrieve real-time scheduling paramers" << std::endl;
         return;
     }

     // Check the correct policy was applied
     if(policy != SCHED_FIFO) {
         std::cout << "Scheduling is NOT SCHED_FIFO!" << std::endl;
     } else {
         std::cout << "SCHED_FIFO OK" << std::endl;
     }

     // Print thread scheduling priority
     std::cout << "Thread priority is " << params.sched_priority << std::endl;
}

int main(){
set_realtime_priority();
return 0;
}

我已经在通用的ubuntu / fedora和RT修补的CentOS系统上验证了此代码。所有这些系统都允许代码设置优先级。令人惊讶的是,它的CONFIG_RT_GROUP_SCHED=y配置内核不允许我设置优先级策略。同样,它也不允许cyclictest运行
//install cyclictest by following

$ sudo apt-get install rt-tests
$ sudo cyclictest

我不了解这种异常行为。启用CONFIG_RT_GROUP_SCHED是否会以某种方式阻止我更改调度策略?

最佳答案

我不确定您是否已解决此问题,但是昨天我遇到了同样的问题,这是我的解决方案。

当CONFIG_RT_GROUP_SCHED = y时,您应授予对cgroup运行某个RT线程的权限。可以通过为“rt_runtime_us”节点提供适当的值来完成。

1)找到一个cgroup进行循环测试

如果通过shell命令进行午餐,它将遵循cgroup进行shell进程。请输入以下命令以找到用于循环测试或sh进程的cgroup

ps -O cgroup

2)为您的cgroup分配适当的rt时间表时隙

在我的情况下,“sh”进程进入“system.slice / system-serial-blabla” cgroup。
因此,我将最大时隙分配给了这些cgroup层次结构,该问题已得到解决。

] echo 950000> /sys/fs/cgroup/cpu/system.slice/cpu.rt_runtime_us

] echo 950000> /sys/fs/cgroup/cpu/system.slice/system-serial-blabla/cpu.rt_runtime_us

祝好运!

关于c++ - 更改线程实时调度策略失败:CONFIG_RT_GROUP_SCHED = y,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56904831/

10-16 17:40