Linux进程优先级
Linux 是一个多用户、多任务的操作系统,系统中通常运行着非常多的进程。但是 CPU 在一个时钟周期内只能运算一条指令(现在的 CPU 采用了多线程、多核心技术,所以在一个时钟周期内可以运算多条指令。 但是同时运算的指令数也远远小于系统中的进程总数),所以需要由进程的优先级来决定哪一个进程的运算指令先执行,哪一个进程的运算指令后运行。
在 Linux 系统中,表示进程优先级的有两个参数:Priority 和 Nice。通过"ps -l"命令可以查看参数对应的值:
[root@localhost ~]# ps -leF S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD4 S 0 1 0 0 80 0 - 35738 ep_pol ? 00:00:03 systemd1 S 0 2 0 0 80 0 - 0 kthrea ? 00:00:00 kthreadd...省略部分输出...
其中,PRI 代表 Priority,NI 代表 Nice。这两个值都表示优先级,数值越小代表该进程越优先被 CPU 处理。不过,PRI值是由内核动态调整的,用户不能直接修改。所以我们只能通过修改 NI 值来影响 PRI 值,间接地调整进程优先级。
PRI 和 NI 的关系 :PRI (最终值) = PRI (原始值) +NI
所以修改 NI 的值就可以改变进程的优先级。NI 值越小,进程的 PRI 就会降低,该进程就越优先被 CPU 处理;反之,NI 值越大,进程的 PRI 值就会増加,该进程就越靠后被 CPU 处理。
修改 NI 值时有几个注意事项:
- NI 范围是 -20~19。
- 普通用户调整 NI 值的范围是 0~19,而且只能调整自己的进程。
- 普通用户只能调高 NI 值,而不能降低。如原本 NI 值为 0,则只能调整为大于 0。
- 只有 root 用户才能设定进程 NI 值为负值,而且可以调整任何用户的进程。
nice命令:改变进程优先级
nice 命令可以给新执行的命令直接赋予 NI 值,但是不能修改已经存在进程的 NI 值。nice 命令格式如下:
[root@localhost ~] # nice [选项] 命令
选项:
- -n NI值:给命令赋予 NI 值;
nice命令改变进程优先级
用默认优先级启动并apache服务,查看 PRI值是80,而NI值是0
[root@localhost ~]# service httpd start[root@localhost ~]# ps -le 丨 grep "httd" | grep -v grepF S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD1 S 0 2084 1 0 80 0 - 1130 - ? 00:00:00 httpd5 S 2 2085 2084 0 80 0 - 1130 - ? 00:00:00 httpd5 S 2 2086 2084 0 80 0 - 1130 - ? 00:00:00 httpd5 S 2 2087 2084 0 80 0 - 1130 - ? 00:00:00 httpd5 S 2 2088 2084 0 80 0 - 1130 - ? 00:00:00 httpd5 S 2 2089 2084 0 80 0 - 1130 - ? 00:00:00 httpd
停止apache服务,并重启动apache服务,同时修改apache服务进程的NI值为-5
[root@localhost ~]# service httpd stop[root@localhost ~]# nice -n -5 service httpd start[rooteiocdlhost ~]# ps -le | grep "httpd" | grep -v grepF S UID PID PPID C FRI NI ADDR SZ WCHAN TTY TIME CMD1 S 0 2122 1 0 75 -5 - 1130 - ? 00:00:00 httpd5 S 2 2123 2122 0 75 -5 - 1130 - ? 00:00:00 httpd5 S 2 2124 2122 0 75 -5 - 1130 - ? 00:00:00 httpd5 S 2 2125 2122 0 75 -5 - 1130 - ? 00:00:00 httpd5 S 2 2126 2122 0 75 -5 - 1130 - ? 00:00:00 httpd5 S 2 2127 2122 0 75 -5 - 1130 - ? 00:00:00 httpd
httpd进程的PRI值变为了75,而NI值为-5
renice 命令:改变进程优先级
renice 命令可以修改已经存在进程的 NI 值。renice 命令格式如下:
[root@localhost ~] # renice [优先级] PID
renice 命令改变进程优先级
[root@localhost ~]# renice -10 21252125: old priority -5, new priority -10[root@localhost ~]# ps -le | grep "httpd" | grep -v grep1 S 0 2122 1 0 75 -5 - 113.0 - ? 00:00:00 httpd5 S 2 2123 2122 0 75 -5 - 1130 - ? 00:00:00 httpd5 S 2 2124 2122 0 75 -5 - 1130 - ? 00:00:00 httpd5 S 2 2125 2122 0 70 -10 - 1130 - ? 00:00:00 httpd5 S 2 2126 2122 0 75 -5 - 1130 - ? 00:00:00 httpd5 S 2 2.127 2122 0 75 -5 - 1130 - ? 00:00:00 httpd
PID为2125的进程的PRI值为70,而NI值为-10