您好,登录后才能下订单哦!
本篇内容主要讲解“如何理解Linux之进程优先级PR和NI”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何理解Linux之进程优先级PR和NI”吧!
JDK中线程有优先级,0-10,10表示优先级最大,而在Linux中则值最小表示优先级最高,优先级高的占用CPU的时间多。
Linux中有PR和NI,在top命令的结果中就可以看到,如下图1是top的结果,可以看到NI和PR的列值:
图1
先来搞清楚PR(priority)和NI(nice)值的区别
这是一个反应进程优先级状态的值,范围在-20到19,即总共有40个值,值最小,优先级最高,默认值是0
nice值越低的进程抢占CPU的能力越强,而nice值越高的进程抢占CPU的能力越弱
在原来O1调度的Linux上,nice值也叫静态优先级,一旦设置了,除非手动renice修改值,否则不会改变;在priority值在O1调度的Linux上,值是会变的,所以也叫动态优先级。
在linux上,renice 10 pid,这样就可以将pid的那个进程的优先级设置为10,renice设置值的时候只能设置为值更大的值,比如之前的值是5,之后的值设置为10是可以的,但是设置为-10是不可以的,会报没有权限的错误,除非使用root用户。
实时操作系统需要保证相关的实时进程在较短的时间内响应,不会有较长的延时,并且要求最小的中断延时和进程切换延时。对于这样的需求,一般的进程调度算法,无论是O1还是CFS都是无法满足的,所以内核在设计的时候,将实时进程单独映射了100个优先级,这些优先级都要高于正常进程的优先级(nice值),而实时进程的调度算法也不同,它们采用更简单的调度算法来减少调度开销。
由于实时进程,无论是O1还是CFS调度,都满足不了,所以给它们分配0-100的值优先级,使用简单的调度算法,来减少开销。
实时进程和非实时进程的区分是通过优先级来区分的,0-99的都是实时进程,而100-139的都是非实时进程,NICE的-20~19对应着100~139,如果PR列中看到的是'rt',那么说明这个任务/进程是realtime进程,即实时进程,有时候会看到PR的值不是数值,而是rt的。
如下List-1中所示,policy options部分,系统给进程5种调度策略,这5中调度策略是给俩中进程使用的,实时进程:SCHED_FIFO、SCHED_RR,而对于非实时进程则是:SCHED_OTHER、SCHED_OTHER、SCHED_IDLE。
List-1
mjduan@dmj:/mnt/sdb1/doc/minedoc$ chrt --help Show or change the real-time scheduling attributes of a process. Set policy: chrt [options] <priority> <command> [<arg>...] chrt [options] --pid <priority> <pid> Get policy: chrt [options] -p <pid> Policy options: -b, --batch set policy to SCHED_BATCH -d, --deadline set policy to SCHED_DEADLINE -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) Scheduling options: -R, --reset-on-fork set SCHED_RESET_ON_FORK for FIFO or RR -T, --sched-runtime <ns> runtime parameter for DEADLINE -P, --sched-period <ns> period parameter for DEADLINE -D, --sched-deadline <ns> deadline parameter for DEADLINE Other options: -a, --all-tasks operate on all the tasks (threads) for a given pid -m, --max show min and max valid priorities -p, --pid operate on existing given pid -v, --verbose display status information -h, --help display this help -V, --version display version For more details see chrt(1).
系统的整体调度策略:
如果系统中存在要执行的实时进程,那么执行实时进程
直到实时进程退出或者主动让出CPU时,才会调度执行非实时进程
sched_fifo: 是实时进程的调度策略之一,使用FIFO的策略,在优先级一样的情况下,谁先进入队列那么那个先被调度
sched_rr: 是实时进程调度策略之一,使用时间分片的策略,默认是100ms,这种策略简单,适合实时进程延时小的特点
Linux上更麻烦的是非实时调度策略,linux上很多进程都是非实时进程,它们的主要调度算法是O1和CFS调度策略
是2.6内核版本引入的,到2.6.63就被替换为CFS了
命名为O1是因为它算法的时间复杂度是O1,使用时间分片思路来,将cpu的时间分为一小段一小段,每个进程占用一段时间分片,对于多核的来说,对每个cpu进行这样时间分片即可。优先级是怎么处理的呢:优先级高的时间分片占用多,反之占用少
O1对多核、多CPU支持的不好,性能不好,此外linux内核还要加上cgroup的功能,所以被替换为了CFS,Linux在2.6.23之后开始启用CFS作为对一般优先级(SCHED_OTHER)进程调度方法
CFS调度策略会收集虚拟时间,然后构建红黑树red-block tree,虚拟时间就是红黑树的key,所以虚拟时间越短的会在红黑树的最左边,查询的时间复杂度是Log(N)。
大致是这样的,会根据当前进程的优先级和执行时间,来生成一个虚拟时间,对每个进程都是如此,最后构建红黑树,红黑树中左边的进程表示虚拟时间值小,表示大部分时候在占用cpu,而右边的进程表示虚拟时间大,当一个虚拟时间小的进程在占用cpu时,如果此时一个虚拟时间大的进程变得可运行,那么这个虚拟时间大的就会抢占cpu,即系统总是调度虚拟时间比较小的进程
图2
多核cpu情况下,CFS是怎么优化性能的,每个cpu会维护一个调度队列,避免使用全局队列而出现争抢的锁问题,但是每个cpu一个队列之后,就有可能出现负载不均衡,所以系统需要定期对各个cpu队列进行平衡
如下List-2中,使用chrt命令查看进程的优先级是0,调度算法是CFS
List-2
mjduan@dmj:/mnt/sdb1/doc/minedoc$ jps 26960 Main 12642 Jps 27090 Main 890 RemoteJdbcServer 31980 Launcher mjduan@dmj:/mnt/sdb1/doc/minedoc$ chrt -p 27090 pid 27090's current scheduling policy: SCHED_OTHER pid 27090's current scheduling priority: 0 mjduan@dmj:/mnt/sdb1/doc/minedoc$ chrt -p 890 pid 890's current scheduling policy: SCHED_OTHER pid 890's current scheduling priority: 0
如果需要调度的进程个数为n,那么平均每个进程占用的CPU时间为sched_latency_ns/n。显然,每个进程实际占用的CPU时间会因为n的增大而减小。但是实现上不可能让它无限的变小,所以sched_min_granularity_ns的值也限定了每个进程可以获得的执行时间周期的最小值
List-3
mjduan@dmj:/mnt/sdb1/doc/minedoc$ cat /proc/sys/kernel/sched_latency_ns 3000000 mjduan@dmj:/mnt/sdb1/doc/minedoc$ cat /proc/sys/kernel/sched_min_granularity_ns 300000
对于普通进程而言,PR=nice+20,所以默认情况下,创建的进程nice值是0,而PR值是20,比如默认的情况下java应用的PR就是20.
对于rt进程,即实时进程,PR=-1-用户视角,所以有时候看到PR值是-51的进程,那么它实际对应的优先级是50,有时候看到PR的值是rt而不是数值,这种对应的优先级是99
到此,相信大家对“如何理解Linux之进程优先级PR和NI”有了更深的了解,不妨来实际操作一番吧!这里是亿速云网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。