公平性问题
进程产生之后,我们人为给它定一个优先级,取值范围为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 | 进程优先级 |
NI | nice值,负值表示高优先级,正值表示低优先级 |
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