关于进程优先级
linux
进程优先级
在进程的运行过程中,CPU资源
的分配就是通过进程的优先级来完成的。优先级高的进程具有优先执行的权限。在我们的linux上,配置进程的优先级是十分有用的,可以用于改善系统的性能。我们还可以将某个进程给分配到某个如果是多核心的话,这样就可以让一些不重要的进程跑在一个cpu
上,其他重要的进程跑在其他cpu
上。
进程优先级的分类
在系统进程中可以分为普通进程和实时进程,普通进程的优先级可分为动态优先级
和静态优先级
,而实时进程又增加了一个实时优先级
。我们在上面所说的是动态优先级。所谓的静态优先级,它不会随着时间的改变而去改变,内核也不会去修改它,只能通过系统调用nice
。
而动态优先级
是调度程序通过增加或减少进程静态优先级的值来奖励IO小号型进程
或惩罚cpu消耗型进程
。调整后的优先级称为动态优先级。在进程描述符中用prio
表示,通常所说的优先级指的是动态优先级。在动态优先级中,数字越小,代表优先级越高,在早期的centos4,5
版本中一共有140个优先级,即1-139,在后来的版本的优先级中,优先级变成了1-99,共100个优先级。我们可以使用一个命令来查看动态优先级ps axo pid,ni,pri,cmd | head -10
[root@CT731 ~]#ps axo pid,ni,pri,cmd | head -10
PID NI PRI CMD
1 0 19 /usr/lib/systemd/systemd --switched-root --system --deserialize 21
2 0 19 [kthreadd]
3 0 19 [ksoftirqd/0]
5 -20 39 [kworker/0:0H]
7 - 139 [migration/0]
8 0 19 [rcu_bh]
9 0 19 [rcu_sched]
10 - 139 [watchdog/0]
11 - 139 [watchdog/1]
在上面的一条命令中,pid
是进程编号,ni
是nice值,pri
就是priority也就是我们的动态优先级。
普通进程的优先级通过一个关于静态优先级和进程交互性函数关系计算得到。随实际任务的实际运行情况得到。实时优先级和它的实时优先级成线性,不随进程的运行而改变。
静态优先级的调整
上面我们说到普通进程的静态优先级可以使用nice
命令来进行调整,以达到系统的较高的性能,其中,我们使用nice
后面跟上进程是调整一个新进程的优先级,我们还可以使用renice
调整已经运行的进程。
静态优先级: 100-139
进程默认启动时的nice值为0,优先级为120
只有根用户才能降低nice值(提高优先性)
我们以ping 172.17.0.1
为例说明nice调优。
首先,我们来看看没有经过调优的进程优先级。
[root@CT731 ~]#ping 172.17.0.1
PING 172.17.0.1 (172.17.0.1) 56(84) bytes of data.
64 bytes from 172.17.0.1: icmp_seq=1 ttl=64 time=0.584 ms
64 bytes from 172.17.0.1: icmp_seq=2 ttl=64 time=0.477 ms
[root@CT731 ~]#ps axo pid,comm,ni,pri,rtprio | egrep "PID|ping"
PID COMMAND NI PRI RTPRIO
48298 ping 0 19 -
接下来,我们看看系统调优后的优先级。
[root@CT731 ~]#nice -n -20 ping 172.17.0.1
PING 172.17.0.1 (172.17.0.1) 56(84) bytes of data.
64 bytes from 172.17.0.1: icmp_seq=1 ttl=64 time=0.487 ms
64 bytes from 172.17.0.1: icmp_seq=2 ttl=64 time=0.645 ms
[root@CT731 ~]#ps axo pid,comm,ni,pri,rtprio | egrep "PID|ping"
PID COMMAND NI PRI RTPRIO
48143 ping -20 39 -
我们可以发现,在我们没有进行调整之前,ping的静态优先级是19,然后我们给它使用nice进行调整,调整后的值变成了39,此时我们是不是会疑惑,我们用nice调整的数值是-20,实际的pri值应该是-19,为什么值会增加呢?我想说的是,我们用nice进行调整后,ping的优先级的确提升了,数值的变化是因为pri值直接加上了|nice|,但是由于nice
的优先级高于pri
,所以在实际上,ping
命令的进程优先级是提高了的。
我们还可以对正在运行的进程进行调整,使用renice
命令。
我们还是以ping为例,首先执ping 172.17.0.1
,然后查看ni
值和pri
值。
[root@CT731 ~]#ping 172.17.0.1
PING 172.17.0.1 (172.17.0.1) 56(84) bytes of data.
64 bytes from 172.17.0.1: icmp_seq=1 ttl=64 time=1.38 ms
64 bytes from 172.17.0.1: icmp_seq=2 ttl=64 time=0.638 ms
[root@CT731 hexo]#ps axo pid,comm,ni,pri,rtprio | egrep "PID|ping"
PID COMMAND NI PRI RTPRIO
108390 ping 0 19 -
然后我们使用renice -n -10 108390
进行优先级的调整。
[root@CT731 hexo]#renice -n -10 108390
108390 (process ID) old priority 0, new priority -10
[root@CT731 hexo]#ps axo pid,comm,ni,pri,rtprio | egrep "PID|ping"
PID COMMAND NI PRI RTPRIO
108390 ping -10 29 -
此时,我们已经将ping命令的进程的优先级给提高了。