Приношу свои извинения, если я публикую это здесь, а не как супер-пользователь.
Я пытался запустить 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, ¶ms);
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, ¶ms);
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 каким-либо образом меня от изменения политики планирования?