管理CPU使用
1、 优先数和进程优先级:
在大多数的Unix系统中都会使用基于优先级的循环调度算法来为多个竞争资源的进程分配CPU资源。所有的进程都会被分配一个执行优先级,这是一个整数值,改制会随着几个因素动态的计算更新。而且在Unix系统中会为不同优先级的进程分配不同的优先级队列,虽然系统中可能同时存在大量进程,但是同一时刻只会有少数进程占用CPU。并且一旦某个进程开始运行,它便会持续运行下去,直到他需要等待I/O操作完成从内核接受中断,或者释放CPU控制,或者耗尽系统所分配的时间片。一旦某个进程停止运行,调度程序会去到某个合适优先级队列中选择一个队列中排在最前面的进程,然后启动并运行它。刚刚停止运行的进程如果还没有运行完毕,会被调度程序放到它所属的优先级队列的队尾,并等待继续运行,这个过程叫做进程的“阻塞”。刚刚被选中的进程会处于“就绪”状态,当获得实际的CPU控制权后,“就绪”进程进入“运行”状态。这就是所谓的进程状态转换,如果一个系统是支持带“挂起”状态的,那么一个进程在结束某次运行后,也可能被调度程序交换出内存。
一个Unix进程会有两个与之相关的优先级参数:
.优先数:这个数值是请求的,相对于其他进程的执行优先级。该值可有进程的所有者或者Root用户来设置和修改。使用ps –l命令可以看到该值(该值对应输出中的NI一栏)。
.当前执行优先级:该值由操作系统动态计算和更新得到,计算该值时常考虑的因素包括:该进程的优先数、最近的CPU使用时间、其他可运行进程及优先级等等。使用ps -l命令可以看到该值(该值对应输出中的PRI一栏)。
不同的Unix系统中优先数的范围不同,但是优先数的值越小级别越高,这一点是一致的。对于BSD系统优先数范围为:-20-20(默认为0),对于System V系统(AIX,HP-UNIX)优先数范围为:0-39(默认为20)。一些操作系统提供了特殊优先数,可以将该优先数指定给某个进程,使得该进程在没有其他进程占用CPU时使用CPU。Solaris上改值为19,AIX、HP-Unix、Linux上该值为20。
所有的用户都可以更改进程优先数,但是只能增大优先数值,不能减少,只有超级用户可以减少进程优先数。
可以使用一些内置的Shell命令来更改进程优先数,如:nice命令
nice -6 bigjob
或者
nice +6 bigjob
两个命令操作结果相同,都是将bigjob进程的优先数提高到默认优先数加6后的优先数。
在现在常用的AIX、HP-UNIX系统中还可以通过renice命令来修改进程优先数,命令格式为:
renice -n new-nice-number pid,其中new-nice-number为新的进程优先数值、PID为进程号如:renice –n 12 8201
2、 监测CPU使用:
有多种方法可以获得CPU整体活动快照,最常用的就是vmstat命令,该命令格式为:vmstat interval [count],其中interval是报告之间的间隔秒数,count是产生的总的报告数。
如:vmstat 5 4
procs memory page disk faults cpu
r b w avm fre re at pi po fr de sr d0 d1 d2 d3 in sy cs us sy id
1 0 0 61312 9280 0 0 24 1 2 0 0 4 1 1 12 35 66 16 63 11 26
vmstat命令报告的第一行显示开机以来的所有统计数据的平均值,因该忽略该行。
r 正在等待CPU使用的进程
cs 上下文切换数
us 用户时间占CPU执行周期的百分比
sy 系统时间占CPU执行周期的半分比
id CPU空闲时间
3、 识别CPU资源短缺问题:
很高的CPU使用率有时对于系统来说并不是坏事,这说明系统正在被充分使用,而且系统出现短暂的CPU使用尖峰也是正常的事情。但是如果正在追踪系统性能问题,发现CPU使用率一直很高,就有可能出现CPU资源短缺问题,应该给与足够重视。一般情况下如果下面的症状经常出现,或者持续很长时间,就有可能是CPU资源短缺造成的。
.一定时间内负荷平均值很高。可以使用sy+us的值除以报告周期来估算。
.处理器使用总量(sy+us)不断增长,当超过80%-90%时应该给与足够的关注,很可能是CPU资源出现了短缺。
.出现了大量的等待进程(r),当该值大于每CPU 3-6时,就因该给与关注。
.持续的异常高的系统时间(sy),特别是还伴随着大量的上下文切换(cs),这表明有大量进程在竞争CPU的使用。一般情况下系统时间因该等于系统时间1/3或者更少。但是此种情况不一定就是由于CPU资源短缺引起的,还可能由于内存资源不足。但是出现该种情况后也要考虑一下CPU资源是否出现短缺。
如果出现上述情况,那么就应该采用一些办法来解决,通常情况下可以通过查看进程运行情况来定位问题和问题进程(使用PS命令),定位之后可以使用命令来降低进程的执行优先数使之让出CPU,或者将需要大量CPU执行时间的进程做成批量作业,在系统压力很小的时候执行(如每天下班后),另外如果操作系统支持还可以通过配置调度过程更改进程调度行为,使之按照管理员的期待方式运行。
4、 配置系统调度程序:
由于笔者经常使用的Unix系统是IBM-AIX系统和HP-UNIX系统,但是HP-UNIX系统未提供调整调度程序的方法和工具,因此下面以AIX系统为例来说明如何调整系统进程调度程序。不同的系统调整的方式和工具不同,因为不同系统的调度策略是不同的,因此如果想对一个系统的调度程序进行调整,那么首先要仔细阅读系统手册,而且要小心谨慎的进行这项工作。不过最好还是要清专门的设备供应商的工程来进行。
AIX系统中进程动态优先级范围为:0-127,值越低越有可能获得CPU执行权,一般情况下执行优先级不断变化,变化公式如下:
new_priority=min+nice+(frac*recent)
其中min是最小进程优先级,其值一般为40,nice是进程优先数,recent代表进程最近一段时期内获得CPU的使用时间(ps –l输出的C栏目)。默认时frac=0.5,它指定了最近的CPU使用因素比重。
对于新的进程,recent从0开始,最大值为120。默认时,每个10毫秒的时间片末(一个CPU时钟周期),调度程序把当前控制CPU的进程的recent值加1。另外每个1秒钟,调度程序将减少所有进程的recent值(默认除以2)。该过程可以惩罚那些最近获得CPU的进程,增加他们的优先级数值,对于那些等待CPU执行的进程,逐渐降低他们的优先级数,达到他们的优先级的最低值。
该调度策略结果是,在具有相同级别的优先级进程中(计算密集型)进程间平均分配CPU资源。当具有普通优先级的作业和优先级别提升了的作业都准备运行时,普通作业将获得更多的CPU时间,但是其它作业也将得到一些CPU时间。
使用schedtune工具可以来更改优先级变化公式中的参数,从而更该调度策略,该工具的执行文件路径为/usr/samples/kernel。如下面命令所示:
schedtune –r 15 –d 15该命令将会修改调度公式中的frac和recent参数,从而影响调度策略。其中-r将会修改frac参数,更改后的值将会等于15/32,减小该值将会使普通优先级进程与提升优先级进程等同化过程减缓,极端情况将该值设为0,那么进程的优先级计算将只会取决于进程执行优先数;-d将会修改recent参数的减小比例(默认时每隔1秒钟recent/2),同样更改后的recent参数的减小比例等于32/15,之后每隔一秒钟recent将除以新的减小比例来减少recent值。极端情况将-d设为32褶将会使recent值简单的累加(因为减小比例为1),这样会使占用CPU较少的进程总是优先于长时间运行的进程。
另外使用schedtune –t将会更改进程所占用的时间片长度。该选项以10毫秒时钟周期的数目作为其参数,如:schedtune –r 1将会使时间片长度加倍,即设置为20毫秒。只有在系统重起后schedtune的修改才会生效,如果想做永久修改那么就要编写启动脚本或者将更改命令写入/etc/inittab中。
5、 Unix批处理:
如果系统中需要运行大量占用CPU资源的进程,那么可以选择在不同的时间来运行这些作业,一般选择在系统压较小的时间来运行。这就是Unix的批处理发挥作用的地方。标准Unix中可以通过at和batch命令来完成,at提供了在指定时间来运行作业的能力,而batch提供了一个作业队列,作业可以像批处理那样顺序执行。在多数Unix系统中管理员可以编辑queuedefs文件来定义额外的队列,该文件在不同系统中位置不同,如下所示:
AIX /var/adm/cron
HP-UNIx /var/adm/cron
Solaris /var/cron.d
Linux 未使用
该文件定义队列的名称职有单字母(大小写都有效)。一般,队列a用于at,队列b用于batch,在很多新的系统中作业c用于cron,队列按如下格式定义:
q.xjynzw
其中q为队列名,x表示作业个数,y表示队列作业进程优先级,z表示尝试启动新作业的时间间隔(单位:秒)。默认值分别为:x=100,y=2,z=60。
例:a.4j1n
b.2j2n90w
h.2j10n300w
前两个分别为at和batch队列,第三个定义了一个h队列,该队列可同时运行1到2个作业,作业进程优先级为10,启动新作业的时间间隔为5分钟。
另外还可以使用crontab命令来编辑定期任务,执行大批量作业,比如定期执行数据库备份等耗时操作,具体如何使用请查阅相关资料。