12.7 进程优先级
-
Linux 是一个多用户、多任务的操作系统,系统中通常运行着非常多的进程。但是 CPU 在一个时钟周期内只能运算一条指令,即使现在的 CPU 采用了多线程、多核心技术,所以在一个时钟周期内可以运算多条指令。 但是同时运算的指令数也远远小于系统中的进程总数,那问题来了:谁应该先运算,谁应该后运算呢?这就需要由进程的优先级来决定了。
-
另外,CPU 在运算数据时,不是把一个进程的运算完成,再进行下一个进程的运算,而是先运算进程 1,再运算进程 2,接下来运算进程 3,然后再运算进程1,直到进程任务结束。不仅如此,由于进程优先级的存在,进程并不是依次运算的,而是哪个进程的优先级高,哪个进程会在一次运算循环中被更多次地运算。
-
在 Linux 系统中,表示进程优先级的有两个参数:Priority 和 Nice。
ps -le
命令打印项中有这两个字段
[root@CncLucZK ~]# ps -le|more
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 S 0 1 0 0 80 0 - 44174 do_epo ? 00:00:33 systemd
1 S 0 2 0 0 80 0 - 0 - ? 00:00:00 kthreadd
1 I 0 3 2 0 60 -20 - 0 - ? 00:00:00 rcu_gp
1 I 0 4 2 0 60 -20 - 0 - ? 00:00:00 rcu_par_gp
1 I 0 6 2 0 60 -20 - 0 - ? 00:00:00 kworker/0:0H-kblockd
1 I 0 8 2 0 60 -20 - 0 - ? 00:00:00 mm_percpu_wq
1 S 0 9 2 0 80 0 - 0 - ? 00:00:03 ksoftirqd/0
--more--
-
其中,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 值为负值,而且可以调整任何用户的进程。
12.8 nice和renice命令:改变进程优先级
-
Linux 内核决定哪些运行中的进程可以访问 CPU 时,其中一个需要考虑的因素就是进程优先级的值(也称为 nice 值)。每个进程都有一个介于 -20 到 19 之间的 nice 值。默认情况下,进程的 nice 值为 0。进程的 nice 值,可以通过 nice 命令和 renice 命令修改,进而调整进程的运行顺序。
-
nice 命令可以给要启动的进程赋予 NI 值,但是不能修改已运行进程的 NI 值。nice 命令格式如下:
[root@localhost ~] # nice [-n NI值] 命令
-n NI值:给命令赋予 NI 值,该值的范围为 -20~19;
[root@CncLucZK ~]# service httpd start
[root@CncLucZK ~]# ps -le|grep 'httpd'
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 S 0 1113053 1 0 80 0 - 68639 core_s ? 00:00:01 httpd
5 S 48 1143899 1113053 0 80 0 - 71908 - ? 00:00:00 httpd
5 S 48 1143900 1113053 0 80 0 - 483744 - ? 00:00:05 httpd
5 S 48 1143901 1113053 0 80 0 - 450958 - ? 00:00:05 httpd
5 S 48 1143902 1113053 0 80 0 - 450958 - ? 00:00:05 httpd
5 S 48 1144815 1113053 0 80 0 - 450958 - ? 00:00:05 httpd
#用默认优先级自动apache服务,PRI值是80,而NI值是0
#用nice 命令修改优先级前先停止进程
[root@CncLucZK ~]# service httpd stop
Redirecting to /bin/systemctl stop httpd.service
#[root@CncLucZK ~]# nice --10 service httpd start #这个“-10”中的“-”仅表示参数前缀;所以,如果希望将当前目录下的documents目录打包,并且赋予tar进程最高的优先级:
[root@CncLucZK ~]# nice -n -10 service httpd start #启动apache服务,同时修改apache服务进程的NI值为-10
[root@CncLucZK ~]# ps -le|grep 'httpd' #查看下httpd的进程信息,PRI、NI值是否发生变化
- 同 nice 命令恰恰相反,renice 命令可以在进程运行时修改其 NI 值,从而调整优先级。renice 命令格式如下:
[root@localhost ~] # renice [优先级] PID
注意,此命令中使用的是进程的 PID 号,因此常与 ps 等命令配合使用。
[root@CncLucZK ~]# ps -le | grep "mysqld" | grep -v grep
4 S 27 1364 1 0 80 0 - 448060 x64_sy ? 00:15:06 mysqld
[root@CncLucZK ~]# renice -10 1364
1364 (process ID) old priority 0, new priority -10
[root@CncLucZK ~]# ps -le | grep "mysqld" | grep -v grep
4 S 27 1364 1 0 70 -10 - 448060 x64_sy ? 00:15:06 mysqld
#PID为1364的进程的PRI值为70,而NI值为-10
- 目前 CPU 十分强大,能够合理地对进程进行调整,输入输出设备也远远跟不上 CPU 地脚步,反而在更多的情况下,CPU 总是在等待哪些缓慢的 I/O(输入/输出)设备完成数据的读写和传输任务。然而,手动设置进程的优先级并不能影响 I/O 设备对它的处理,这就意味着,哪些有着低优先级的进程常常不合理地占据着本就低效地 I/O 资源。
参考文献:
Linux进程优先级
下一篇:Linux学习-51-进程间通信和终止线程命令
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/123741.html