您的位置:首页 > 其它

进程的优先级

2015-08-04 22:08 225 查看

公平性问题

进程产生之后,我们人为给它定一个优先级,取值范围为0-39,这就是所谓的静态优先级(进程描述符中有static_prio域指定)。static_prio取值越低优先级越高,越早被调度。内核调度程序根据静态优先级来调度进程执行,这种情况下会导致一些进程优先级低的进程始终得不到CPU资源。这样就难以避免饥饿情况发生,这是不公平的调度。抛出问题,如何解决公平性?

有人提出了,在进程描述符中引进动态优先级(进程描述符中prio域),根据静态优先级+奖惩制度来得到进程的动态优先级,取值范围0-139。调度器根据进程的动态优先级进行调度。如何理解奖惩制度?奖励IO消耗型进程,惩罚那些CPU消耗型进程,这样一来饥饿的进程优先级值可以慢慢增大,从而得到调度器的青睐,可以尽可能避免饥饿情况发生,调度尽可能公平。

实时性问题

有人又站出来说话了,我的进程是交互型的,需要响应时间短,实时性好。作为一个普通实时进程,我敲入一个命令,半天没反应。抛出问题,如何解决实时性?

解决这个问题,同样的方法我们在进程描述符中引进了rt_priority域,取值0-99(0 - MAX_RT_PRIO-1)

prio = MAX_RT_PRIO - 1 - rt_priority


从上面表达式中可以看出,rt_priority取值越大,prio取值越小,进程优先级越高,进程越早被调度执行,实时性越好。

时间片

在完全公平调度器CFS融入内核之前,时间片是各种调度器的一个重要的概念。它指定了进程在被抢占之前所能运行的时间。调用器的一个重要目标便是有效的分配时间片,以便提供良好的用户体验。时间片分的过长会导致交互式进程响应不佳。时间片分的过长会导致进程切换带来的消耗。为了解决这个矛盾内核采用了:

1. 提高交互进程的优先级,同时分配默认的时间片

2. 不需要进程一次性用完时间片,可多次使用。

高的优先级可保证交互进程的频繁调用,长的时间片可保证它们可长时间处于可执行状态。

调整进程优先级

我们可以使用top命令查看所有进程的优先级,top 命令是最流行的性能监视工具之一,用于监视性能。

root@node-14:~# top
top - 21:57:15 up 34 days,  1:34,  7 users,  load average: 1.09, 1.25, 1.42
Tasks: 204 total,   2 running, 201 sleeping,   0 stopped,   1 zombie
Cpu(s): 15.3%us,  1.3%sy,  0.0%ni, 79.3%id,  3.9%wa,  0.0%hi,  0.2%si,  0.0%st
Mem:  16402620k total, 16083976k used,   318644k free,   292820k buffers
Swap:  8000508k total,        0k used,  8000508k free,  8078864k cached

PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
2531 rabbitmq  20   0 2528m 428m 2568 S    5  2.7   2942:32 beam.smp
2970 glance    20   0 1510m  64m 8384 S    4  0.4   1361:15 glance-api
2972 glance    20   0 2215m  67m 8440 S    3  0.4   1570:38 glance-api
2954 nova      20   0  286m 111m 3308 S    3  0.7   1499:38 nova-conductor
2956 nova      20   0  286m 111m 3372 S    3  0.7   1503:59 nova-conductor
2096 nova      20   0  256m  84m 5520 S    2  0.5 995:41.66 nova-consoleaut
2098 nova      20   0  248m  76m 5516 S    2  0.5 993:53.38 nova-scheduler
2925 cinder    20   0 2895m 742m 8224 S    2  4.6   1042:06 cinder-volume
2958 nova      20   0  286m 112m 3372 S    2  0.7   1502:07 nova-conductor
3076 nova      20   0  296m 117m 3432 S    2  0.7   1178:36 nova-api
10127 nova      20   0  136m  30m 2204 S    2  0.2 523:11.72 nova-novncproxy
14591 nova      20   0  136m  30m 2204 S    2  0.2 385:54.01 nova-novncproxy
2092 nova      20   0  242m  70m 5504 S    2  0.4 994:44.16 nova-cert
2099 cinder    20   0  222m  52m 4636 S    2  0.3   1013:51 cinder-schedule
15196 nova      20   0  136m  30m 2204 S    2  0.2 386:33.41 nova-novncproxy
2099 cinder    20   0  222m  52m 4636 S    2  0.3   1014:28 cinder-schedule
2097 nova      20   0  128m  42m 4788 S    2  0.3 409:10.46 nova-conductor
2092 nova      20   0  242m  70m 5504 S    2  0.4 995:20.23 nova-cert


字段说明
PID进程id
USER进程所有者
PR进程优先级
NInice值,负值表示高优先级,正值表示低优先级
VIRT进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES
RES进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA
SHR共享内存大小,单位kb
S进程状态。D=不可中断的睡眠状态 R=运行 S=睡眠 T=跟踪/停止 Z=僵尸进程
%CPU上次更新到现在的CPU时间占用百分比
%MEM进程使用的物理内存百分比
TIME+进程使用的CPU时间总计,单位1/100秒
COMMAND进程名称(命令名/命令行)
查看某个进程的运行情况,可以看到当前进程的优先级是20,nice值是0,prio = nice + 20

top -p 2021
PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
2021 keystone  20  0  228m  64m 5700 S    2  0.4   1276:30 keystone-all


修改2021进程的优先级nice值为-1,提高进程的优先级,优先被调度执行。

renice -1 -p 2021
PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
2021 keystone 19  -1  228m  64m 5700 S    2  0.4   1276:30 keystone-all
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息