Изменение политики планирования потока в реальном времени завершается неудачно: CONFIG_RT_GROUP_SCHED = y - PullRequest
0 голосов
/ 05 июля 2019

Приношу свои извинения, если я публикую это здесь, а не как супер-пользователь.

Я пытался запустить docker в группе реального времени и наткнулся на включение cgroups - CONFIG_RT_GROUP_SCHED в ядре для реального запуска.док-приложения (здесь: https://docs.docker.com/config/containers/resource_constraints/#configure-the-default-cfs-scheduler)

Я настроил свое ядро ​​для включения флагов FIFO / RR и проверил его (Доступно здесь: Как включить CONFIG_RT_GROUP_SCHED в Ubuntu, чтобы сделать его RT )

Я считаю, что моя система теперь правильно спланирована, потому что я могу запустить докер с ограниченными ресурсами в этой системе, который обращается к cgroups с помощью следующей команды:

$ 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;
}

Я проверил этот код в универсальной системе CentOS с исправленными версиями ubuntu / fedora и RT. Все эти системы позволяют кодуустановить приоритет.Удивительно, но это настроенное ядро ​​CONFIG_RT_GROUP_SCHED=y, которое не позволяет мне устанавливать политику приоритетов.Точно так же это также не позволяет cyclictest запускать

//install cyclictest by following

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

Я не понял этого аномального поведения.Блокирует ли включение CONFIG_RT_GROUP_SCHED каким-либо образом меня от изменения политики планирования?

...