Learning Linux Commands: nice & renice

Introduction

User’s ability to attach a priority value to its own process upon execution determines whether you are being nice to your fellow users on the same system. Are you being nice or you simply abuse system resources for no apparent reason? In this article you will learn how to manage your processes in terms of how much processing power they consume and how to change a priority value of your processes using nice & renice Linux command. We will start with some basic theory about what is process, process scheduling, how to fork new process and then we move to nice command and explain how to change process priority value.

What is process

In simple words a process is a naming convention used by Linux to assume role of a running program. A process is a collection of rules by which any particular program makes use of assigned processor time, memory and I/O resources. Each process running on a Linux system has its own Process ID ( PID ) by which it can be monitored and administered.

Linux kernel is designed to collect various information about each process. These include, but not limited to:

  • process status ( runnable, sleeping, zombie or stopped )
  • process execution priority ( niceness)
  • information about used resources
  • owner of the process
  • what network ports and files had each particular process opened
  • and more…

Now that we have some idea on what the process is we can go ahead and create some process. To do this simply open your terminal and execute yes command in background and redirecting its output to /dev/null:

$ yes > /dev/null &
[1] 5997

After that use ps -l command we cant extract the information about our yes process:

$ ps -l
F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
0 S  1000  5830  3283  0  80   0 -  6412 wait   pts/0    00:00:00 bash
0 R  1000  5997  5830 99  80   0 -  1757 -      pts/0    00:00:09 yes
0 R  1000  5998  5830  0  80   0 -  2399 -      pts/0    00:00:00 ps

From the above we can read to following information:

  • F – FLAG: the process did not start with superuser privileges. Otherwise we would see number 4 or sum of 1 and 4. Check man ps for more info.
  • S – STATE: process is currently running
  • UID – User ID of user who initiated the process. UID is actual an alias for EUID ( Effective User ID )
  • PID – Process ID of our yes command is 5997
  • PPID – Parent Process ID. This is a process ID from which our yes command had been forked from. In this case it is bash with PID 5830.
  • C – Integer value of Processor utilization in % .
  • PRI – Process priority. The higher value the lower priority.
  • NI – Nice value with range from -20 to 19. The higher value the more nice you are to other users in other words the higher value the lower priority.

Process scheduling

Linux kernel scheduler

This section can be skipped if you do not feel like to go into more details about process priority and scheduling. Here we will attempt to describe Linux process with some easy to understand rudimentary summarization as this topic can span multiple pages and that would be the only introduction.

From our point of view we need to understand that Linux ( Linux kernel version >= 2.6 ) scheduler is preemptive. This is a ability which allows kernel to preemptively choose to execute higher priority task over the ones with a lower priority. Furthermore, kernel separates priority lists to real-time tasks and user tasks raging from 1 – 100 and 101 – 140 respectively.

Furthermore, Linux kernel assigns to higher priority tasks longer quantum time and lower priority tasks shorter quantum time this is approximately 200 ms and 10 ms, respectively. In other words every task is allowed to execute only if it has some remaining time slice. Therefore, shorter time slice to execute causes process to stay shorter time in active runqueue and thus consume less resources. Once the process time slice is empty, process is moved to expired runqueue where it’s priority is re-calculate and then moved again to active runqueue. This relationship is illustrated on the diagram on your right. It is important to mention that both where both active and expired runqueues contain lists of tasks sorted by their priority.

Process Life cycle

The basic principle of Linux process management contains two distinct operations when creating new process. The operation is where process copies itself by fork() call and thus creates a new process with unique PID. The fork operation is most commonly followed by exec() operation which executes a new program. The first process created during the boot time is init which is always assigned PID 1. All other processes are considered child processes of init process. Under normal circumstances before children process is allows to die this event needs to be acknowledged by a parent process by sending exit value. Successful termination send a parent process value 0. If from some reason child process outlives parent process init will accept this process as orphaned process.

Using nice command

Since the processing power was and still is growing exponentially over the years the importance of nice command is diminishing at the same pace. Therefore, as a result it is very today that you will be forced to change process priority manually. Nevertheless, this ability is there and it still may be useful in some situations. By default nice will set a nice level to 10.

$ nice yes > /dev/null &
[1] 5199
$ ps -l
F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
0 S  1000  3383  3380  0  80   0 -  6445 wait   pts/0    00:00:00 bash
0 R  1000  5199  3383 99  90  10 -  1757 -      pts/0    00:00:07 yes
0 R  1000  5200  3383  0  80   0 -  2399 -      pts/0    00:00:00 ps 

To start process with other nice value than 10 we can use -n switch.

$ nice -n 15 yes > /dev/null &
OR
$ nice -15 yes > /dev/null &
[1] 5270
$ ps -l
F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
0 S  1000  3383  3380  0  80   0 -  6447 wait   pts/0    00:00:00 bash
0 R  1000  5270  3383 99  95  15 -  1757 -      pts/0    00:00:02 yes
0 R  1000  5271  3383  0  80   0 -  2399 -      pts/0    00:00:00 ps

To set nice value below 0 root permissions are required. Nice will still start the program, however, the nice value will be set to 0. Here, we try to set nice value to -1 without root permissions:

$ nice -n -1 yes > /dev/null &
[1] 5285
nice: cannot set niceness: Permission denied
$ ps -l
F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
0 S  1000  3383  3380  0  80   0 -  6447 wait   pts/0    00:00:00 bash
0 R  1000  5285  3383 95  80   0 -  1757 -      pts/0    00:00:07 yes
0 R  1000  5295  3383  0  80   0 -  2399 -      pts/0    00:00:00 ps

Therefore, in order to set nice value to lower than 0 we need execute the above program as root or using sudo.

# nice -n -1 yes > /dev/null &
[1] 5537
# ps -l
F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
4 S     0  5428  3383  0  80   0 - 14430 wait   pts/0    00:00:00 su
0 S     0  5436  5428  1  80   0 -  7351 wait   pts/0    00:00:00 bash
4 R     0  5537  5436 87  79  -1 -  1757 -      pts/0    00:00:04 yes
4 R     0  5538  5436  0  80   0 -  2399 -      pts/0    00:00:00 ps

Using renice command

In the previous section we have learned how to start a program with pre-set nice value using nice command. Here, we try to change the nice value of a running program using renice command. Here, we have a running yes program with nice value of 10:

$ ps -l
F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
0 S  1000  3383  3380  0  80   0 -  6447 wait   pts/0    00:00:00 bash
0 R  1000  5645  3383 99  90  10 -  1757 -      pts/0    00:00:04 yes
0 R  1000  5646  3383  0  80   0 -  2399 -      pts/0    00:00:00 ps

To change its value we can use renice command and supply PID and nice value. Let’s change nice value to 15:

$ renice -n 15 -p 5645
5645 (process ID) old priority 10, new priority 15
$ ps -l
F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
0 S  1000  3383  3380  0  80   0 -  6447 wait   pts/0    00:00:00 bash
0 R  1000  5645  3383 99  95  15 -  1757 -      pts/0    00:00:31 yes
0 R  1000  5656  3383  0  80   0 -  2399 -      pts/0    00:00:00 ps

The rule to follow is that non-super user can only increase the nice value ( give less priority ) to any process. If would would now try change to nice value from 15 back to 10 he following error would appear:

$ renice -n 10 -p 5645
renice: failed to set priority for 5645 (process ID): Permission denied

renice command also gives a root user the ability to change a nice value of any user’s processes. This is done by -u switch. The following linux command will change a priority of all user’s processes to -19.

# renice -n -19 -u lubos
1000 (user ID) old priority 0, new priority -19

Conclusion

Nice command can be a handy tool and is certainly easy to use. Please note that you can also use top command to renice process values.



Comments and Discussions
Linux Forum