您已经了解了如何更改进程的优先级,那么对于线程又该如何操作呢?这部分内容介绍了如何更改用于计算每个线程优先级值的CPU 调度参数。您可以使用schedo(在AIX Version 5.2 及更早的版本中是schedune)来完成这项工作。
首先,您需要确保拥有下面的文件集(请参见 清单 4)。
清单 4. 检查文件集
# lslpp -lI bos.perf.tune
Fileset Level State Description
----------------------------------------------------------------------------
Path: /usr/lib/objrepos
bos.perf.tune 5.2.0.10 COMMITTED Performance Tuning Support
![]()
Path: /etc/objrepos
bos.perf.tune 5.2.0.10 COMMITTED Performance Tuning Support
现在,让我们报告所有的 CPU 参数,如清单 5 所示。
清单 5. 报告所有的 CPU 参数
# schedo -a %usDelta = 100 affinity_lim = 7 big_tick_size = 1 fixed_pri_global = 0 force_grq = 0 idle_migration_barrier = 4 maxspin = 16384 pacefork = 10 sched_D = 16 sched_R = 16 timeslice = 1 v_exempt_secs = 2 v_min_process = 2 v_repage_hi = 0 v_repage_proc = 4 v_sec_wait = 1
首先从fixed_pri_global 开始进行分析。它的缺省设置为0。当CPU 准备分派线程时,它会先检查全局运行队列,然后再检查其他队列。当线程在CPU 上的时间片结束之后,它将被重新放回到这个队列中。这可以帮助维护处理器的关联性(稍后我将介绍这部分内容)。要提高整体的线程性能,您可以将名为 RT_GRQ 的环境变量设置为ON。这样一来,就会自动地将线程放入到全局运行队列中。如果您将缺省值从 0 更改为 1,那么所有固定优先级的线程都将放入到这个运行队列中。您可以执行下面的命令将缺省值从0 更改为1: #schedo -o fix_pri_global=1。
让我们再来讨论一下线程。用户进程的实际优先级会随着时间发生变化,这取决于该进程最近所使用的CPU 时间。您需要查看的参数包括sched_R 和sched_D。这两个参数值的单位都是1/32 秒,并且它们的缺省值都为16。而且,对于刚创建的线程,其CPU 值为0。随着线程在CPU 上执行时间的增加,其CPU 使用时间将会递增。实际上,调度程序使用下面的公式来计算CPU 使用时间:CPU usage = CPU usage*(D/32)。
在这个示例中,如果D 参数设置为32,那么线程的CPU 使用时间将不会衰减,而该参数的缺省值为16,这样就允许CPU 使用时间随着时间的推移而衰减,从而使其获得更多的在CPU 上执行的时间。
每个CPU 都有一个专门的运行队列。运行队列是由运行线程所组成的列表,按照线程优先级的值进行排序。一共有256 种线程优先级(从0 到255)。还有一个附加的全局运行队列,其中放的是新的线程。
Schedo 通常用于更改调度程序时间片的长度。要更改时间片,可以使用schedo -o timeslice=value 选项。增加时间片的长度可以提高系统吞吐量,因为减少了上下文的切换。在进行这种更改之前,请确保反复地运行 vmstat 以确定系统中确实正在进行大量的上下文切换工作。
