By default programs run with Time Sharing (TS policy) on Linux. How to run a program with SCHED_RR
policy on Linux from command line?
Thanks for giving information about chrt(1) command. I have used the command to run Firefox with RR policy, but as you see below, only main thread of Firefox runs with RR policy. Could you tell me how to run all other threads of Firefox also with RR policy.
$ ps -Lo pid,tid,class 2051
PID TID CLS
2051 2051 RR
2051 2055 TS
2051 2056 TS
2051 2057 TS
2051 2058 TS
2051 2059 TS
2051 2060 TS
2051 2061 TS
2051 2063 TS
2051 2067 TS
2051 2068 TS
2051 2069 TS
2051 2070 TS
2051 2072 TS
2051 2073 TS
2051 2074 TS
2051 2075 TS
2051 2077 TS
2051 2078 TS
2051 2080 TS
2051 2356 RR
2051 2386 TS
2051 2387 TS
Edit: I ran the following simple pthreads program and tested like the above. Unfortunately chrt command only changes the class of the main thread. Please see below.
$ ps -Lo pid,tid,class 3552
PID TID CLS
3552 3552 TS
3552 3553 TS
3552 3554 TS
3552 3555 TS
3552 3556 TS
3552 3557 TS
$ sudo chrt --rr -p 30 3552
...
$ ps -Lo pid,tid,class 3552
PID TID CLS
3552 3552 RR
3552 3553 TS
3552 3554 TS
3552 3555 TS
3552 3556 TS
3552 3557 TS
---- Program----
#include <pthread.h>
#include <stdio.h>
#define NUM_THREADS 5
void *PrintHello(void *threadid)
{
long tid;
tid = (long)threadid;
printf("Hello World! It's me, thread #%ld!\n", tid);
long k = 1;
long a[10000];
int i = 1;
long b[10000];
for (k = 0; k < 400000000; k++) {
if (i == 9999) {
i = 1;
}
a[i] = ((k + i) * (k - i))/2;
a[i] = k/2;
b[i] = i * 20;
b[i] = a[i] - b[i];
i++;
int j = 0;
for (j = 0; j < i; j++) {
k = j - i;
}
}
pthread_exit(NULL);
}
int main (int argc, char *argv[])
{
pthread_t threads[NUM_THREADS];
int rc;
long t;
for(t=0; t<NUM_THREADS; t++){
printf("In main: creating thread %ld\n", t);
rc = pthread_create(&threads[t], NULL, PrintHello, (void *)t);
if (rc){
printf("ERROR; return code from pthread_create() is %d\n", rc);
exit(-1);
}
}
pthread_exit(NULL);
}
Use the
chrt
command withchrt --rr <priority between 1-99> <command>
Example:
Note that setting
SCHED_RR
require root permissions, so you either have to be root or run it with sudo.You can also use
chrt
to give a running process realtime priority:chrt -p --rr <priority between 1-99> <pid>
The same commands applies for other scheduling classes as well, albeit with a different parameter instead of -rr:
Edit:
In the Firefox case, it must be spesific to Firefox. In a multithreaded application I wrote myself, all the threads keep the RR class. As seen in your output, two threads have class RR, so it's not only the parent thread either.
Edit 2:
Try starting the process with
chrt
instead of rescheduling an existing pid. It appears that if you reschedule, only the first thread gets RR class. However, if you start it withchrt
, every thread gets it.Just add this code inside the thread code:
This will give the any thread which runs this code the maximum
SCHED_RR
(round-robin real-time scheduler) priority of99
.See:
SCHED_RR
round-robin soft real-time scheduler: https://man7.org/linux/man-pages/man7/sched.7.html.SCHED_RR
scheduler are1
and99
, respectively: https://man7.org/linux/man-pages/man2/sched_get_priority_min.2.html.