15

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);
}
1

2 Answers 2

15

Use the chrt command with chrt --rr <priority between 1-99> <command>

Example:

# Note: `sudo` is not required if you are root
chrt --rr 99 ls

# use `sudo` otherwise
sudo chrt --rr 99 ls

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:

Scheduling policies:
  -b | --batch         set policy to SCHED_BATCH
  -f | --fifo          set policy to SCHED_FIFO
  -i | --idle          set policy to SCHED_IDLE
  -o | --other         set policy to SCHED_OTHER
  -r | --rr            set policy to SCHED_RR (default)

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 with chrt, every thread gets it.

8
  • Thanks @Egil. By the way, the default scheduking class is TS right. You can see in the ps command output.
    – samarasa
    Jun 30, 2011 at 17:33
  • Yeah..its working in this way. SOmehow, it is not working if we give pid.
    – samarasa
    Jun 30, 2011 at 19:53
  • there're too few -r (only used twice), I suggest using -rrrrrrrrr instead ;-P
    – poige
    Sep 2, 2017 at 3:23
  • It didn't need root to run on my end... Dec 10, 2017 at 23:00
  • @samarasa : maybe -a option is what you need. From the manual: -a, --all-tasks Set or retrieve the scheduling attributes of all the tasks (threads) for a given PID. Feb 2, 2018 at 9:34
2

Just add this code inside the thread code:

pthread_t this_thread = pthread_self();
struct sched_param params;
params.sched_priority = sched_get_priority_max(SCHED_RR);
pthread_setschedparam(this_thread, SCHED_RR, &params);

This will give the any thread which runs this code the maximum SCHED_RR (round-robin real-time scheduler) priority of 99.

See:

  1. A description of each scheduler policy, including the SCHED_RR round-robin soft real-time scheduler: https://man7.org/linux/man-pages/man7/sched.7.html.
  2. A mention that the min and max priorities for the SCHED_RR scheduler are 1 and 99, respectively: https://man7.org/linux/man-pages/man2/sched_get_priority_min.2.html.
  3. https://man7.org/linux/man-pages/man3/pthread_setschedparam.3.html
3
  • 1
    You may actually want to give the thread the minimum SCHED_RR priority of 1, instead of the maximum priority of 99, in order to ensure that you don't block threads which need to be high priority, such as the network stack. I'm not 100% sure, but I think setting your thread's priority to 99 could block the network stack & result in strange bugs. Using SCHED_RR is necessary to get much better timing resolution (~5 us sleep resolution vs 55 us sleep resolution) when using calls such as clock_nanosleep(), but using the highest priority within this policy is not required. Apr 6, 2022 at 22:07
  • This is another great resource to read to learn about the Linux soft real-time scheduler policies and priorities: Dr. Dobb's: Soft Real-Time Programming with Linux. Apr 6, 2022 at 22:10
  • 1
    Thanks for your answer here, by the way. It helped me figure out my own answer here: see my answer here, and I referenced it in making my "Demo 1" through "Demo 5" inside function set_scheduler() in my sleep_nanosleep_minimum_time_interval.c test file. Apr 8, 2022 at 0:09

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .