对于 AIX 主机的性能评估,我们从下面的 4 个方面来逐一介绍: CPU 、 MEMORY 、 I/O 系统和网络这 4 个方面来描述。
一、 CPU 性 能评估
首先,我们还是先来看一下 CPU 的性能评估。下面先主要介绍几个看 CPU 性能的命令。
1 、 vmstat
使用 vmstat 来进行性能评估,该命令可获得关于系统各种资源之间的相关性能的简要信息。当然我们也主要用它来看 CPU 的一个负载情况。
下面是我们调用 vmstat 命令的一个输出结果:
$vmstat 1 2
System configuration: lcpu=16 mem=23552MB
kthr memory page faults cpu
----- ----------- ------------------------ ----------------- -----------
r b avm fre re pi po fr sr cy in sy cs us sy id wa
0 0 3091988 2741152 0 0 0 0 0 0 1849 26129 4907 8 1 88 3
0 0 3091989 2741151 0 0 0 0 0 0 2527 32013 6561 15 2 77 6
对上面的命令解释如下:
Kthr 段 显示内容
¨ r 列表示可运行的内核线程平均数目,包括正在运行的线程和等待 CPU 的线程。如果这个数字大于 CPU 的数目,则表明有线程需要等待 CPU 。
¨ b 列表示处在非中断睡眠状态的进程数。包括正在等待文件系统 I/O 的线程,或由于内存装入控制而被挂 起的线程。
Memory 段 显示内容
¨ avm 列表示活动虚拟内存的页面数,每页一般 4KB
¨ fre 空闲的页面数,每页一般 4KB
Page 段 显示内容
¨ re – 该列无效
¨ pi 从磁盘交换到内存的交换页(调页空间)数量, 4KB/ 页。调页空间是驻留在硬盘上的虚拟内存的一部分。当内存使用过量时,会将溢出的工作组页面存储到调 页空间中(窃取页)。当进程访问一个窃取页时,就产生了一个缺页故障,而这一页页必须从调页空间中读入到内存中。
¨ po 从内存交换到磁盘的交换页数量, 4KB/ 页。如果窃取的工作也在调页空间中不存在或者已经作了修改,则写入调页空间中。如果不被再次访问, 它会留在调度空间中直到进程终止或者放弃空间。
¨ fr 根据页面替换算法每秒释放的页数。当 VMM 页面替换例程扫描页面帧表( Page Frame Table , PFT )时,它会根据一些条件选取需要窃取的 页面以补充空闲列表。该条件中包含工作页面和计算页面,释放的页面中,计算页面不产生 I/O ,工作页面如果数据没有发生修改,也不需要写回磁盘,也不会产生 I/O 。
¨ sr 根据页面替换算法每秒所检查的页数。 sr 值比 fr 值高的越多,说明替换算法要查找可以替换的页面就越困难。
¨ cy 每秒页面替换代码扫描了 PFT 多少次。因为增加空闲列表达到 maxfree 值,不一定需要完全扫描 PFT 表,而所有 vmstat 输出都为整数,所以通常 cy 列值为 0 。
Faults 段 显示内容(其实这段内容不需太多关注)
¨ in 在该时间间隔中观测到的每秒设备中断数。
¨ sy 在该时间间隔中观测到的每秒系统调用次数。
¨ cs 在该时间间隔中观测到的每秒钟上下文切换次数。
Cpu 段显 示内容
¨ us 列显示了用户模式所消耗的 CPU 时间。
¨ sy 列详细显示了 CPU 在系统模式所消耗的 CPU 时间。
¨ id 列显示了没有未决本地磁盘 I/O 时 CPU 空闲或等待时间的百分比。
¨ wa 列详细显示了有未决本地磁盘 I/O 时 CPU 空闲的时间百分比。 wa 的值如果超过 25%, 就表明磁盘子系统可能没有被正确平衡 , 或者这也可能是磁盘工作负荷很重的结果。
如果在一个单用户系统中, us + sy 时间不超过 90% ,我们就不认为系统的 CPU 是受限制的。
如果在一个多用户系统中, us + sy 时间 超过 80%, 我们就认为系统的 CPU 是 受限的。 其中的进程将要花时间在运行队列中等待。响应时间和吞吐量会受损 害。
检查 cpu ,我们主要关注报告中的 4 个 cpu 列和 2 个 kthr (内核线程)列。
在上面的示例中,我们可以观察到以 下几个主要的信息:
CPU IDLE 比较高,比较空闲; r 列为 0 ,表明线程不存在等待;
WA 值不 高,说明 I/O 压 力不大;
free 值 比较大, pi , po 为 0 ,表明内存非常富裕。空闲较多。
2 、 sar
第二个常用的是 sar 命令,但是 sar 会增加系统的开销。当然有些情况下, 我们使用 sar 比 较方便。
sar 的输出结果与前面的基本类似,这里不再作详细的介绍,关于命令的语法,也不再作详细的介绍,我们常用 的命令格式:
#sar 1 3
AIX jsdxh_db02 3 5 00C2C1EB4C00 10/24/07
System configuration: lcpu=16
17:52:26 %usr %sys %wio %idle physc
17:52:27 19 7 0 75 8.00
17:52:28 19 6 0 75 8.01
17:52:29 19 7 0 75 8.02
Average 19 7 0 75 8.01
在这里, sar 命令输出的是一个整体的 cpu 使用情况的一个统计,统计分项目的内 容也比较直观,通过名字就可以理解涵义。这里有一点比较方便的就是,在最后一行有一个汇总的 average 行,作为上述统计的一个平均。另外,补充说明一点的就是,一般来说,第一行统计信息包含了 sar 命令本身启动的 cpu 消耗,所以往往是偏高的,所以导致 average 值也往往是偏高一点的。当 然,这不会对结果产生多大影响。
当我们有多个 cpu 的时候,而程序采用的是单线程,有时 候会出现一种情况,我们检查发现, cpu 总体的使用率不高,但是程序响应却比较慢。这里有可能就是单线程只使用了一个 cpu ,导致这个 cpu100 %占用,处理不过来,而其他的 cpu 却闲置。这时可以对 cpu 分开查询,统计每个 cpu 的使用情况。
#sar -P ALL 1 2
AIX jsdxh_db02 3 5 00C2C1EB4C00 10/24/07
System configuration: lcpu=16
18:03:30 cpu %usr %sys %wio %idle physc
18:03:31 0 0 69 0 31 0.00
1 50 50 0 0 1.00
2 0 0 0 100 0.52
3 0 0 0 100 0.48
4 0 1 0 99 0.54
5 0 0 0 100 0.46
6 0 0 0 100 0.53
7 0 0 0 100 0.47
8 0 0 0 100 0.53
9 0 0 0 100 0.47
10 0 2 0 98 0.54
11 0 0 0 100 0.46
12 11 58 0 31 0.00
13 100 0 0 0 1.00
14 0 0 0 100 0.53
15 0 0 0 100 0.47
- 19 7 0 75 8.01
18:03:32 0 0 71 0 29 0.00
1 50 50 0 0 1.00
2 0 0 0 100 0.52
3 0 0 0 100 0.48
4 0 1 0 99 0.54
5 0 0 0 100 0.47
6 0 0 0 100 0.52
7 0 0 0 100 0.47
8 0 0 0 100 0.53
9 0 0 0 100 0.47
10 0 2 0 98 0.54
11 0 0 0 100 0.46
12 39 41 0 20 0.00
13 100 0 0 0 1.00
14 0 0 0 100 0.52
15 0 0 0 100 0.47
- 19 7 0 75 7.98
Average 0 0 70 0 30 0.00
1 50 50 0 0 1.00
2 0 0 0 100 0.52
3 0 0 0 100 0.48
4 0 1 0 99 0.54
5 0 0 0 100 0.46
6 0 0 0 100 0.53
7 0 0 0 100 0.47
8 0 0 0 100 0.53
9 0 0 0 100 0.47
10 0 2 0 98 0.54
11 0 0 0 100 0.46
12 28 48 0 24 0.00
13 100 0 0 0 1.00
14 0 0 0 100 0.52
15 0 0 0 100 0.47
- 19 7 0 75 8.00
上面是分 cpu 统计的情况,结果应该也比较直观吧。
Sar 还有其他一些比较特殊的使用方法,比如:
如果希望多个采样和多个报告,可为 sar 命令指定一个输出文件,这样就方便 多了。将 sar 命 令的标准输出数据定向到 /dev/null ,并将 sar 命令作为后台进程运行。具体的命令格式为:
sar -A -o /temp/sar_result.log 5 300 > /dev/null &
关于 sar 其他的一些使用方法,这里不再详述。
3 、 iostat
第三个可以用来使用的命令是 iostat.
$ iostat -t 2 4
tty: tin tout avg-cpu: % user % sys % idle % iowait
0.0 0.0 0.0 0.1 99.8 0.1
0.0 81.0 0.0 0.1 99.9 0.0
0.0 40.5 0.0 0.0 100.0 0.0
0.0 40.5 0.0 0.1 99.1 0.8
TTY 的 两列信息( tin 和 tou )显示了由所有 TTY 设备读写的字符数
CPU 统 计信息列( % user 、 % sys 、 % idle 和 % iowait )提供了 CPU 的使用情况。
注意:第一份报告为系统启动以来的一个累积值。
4 、 tprof
使用 tprof 命令用于统计每个进程的 CPU 使用情况
# tprof -x sleep 30
该命令的输出结果可查看 __prof.all 文件。
此命令运行 30 秒钟,在当前目录下创建一个名为 _prof.all 的文件。 30 秒钟内, CPU 被调度次数约为 3000 次。 __prof.all 文件中的字段 Total 为此进程调度到的 CPU 次数。如果进程所对应的 Total 字 段的值为 1500 ,即表示该进程在 3000 次 CPU 调度中占用了 1500 次,或理解为使用了一半的 CPU 时间。 tprof 的输出准确地显示出哪个进程在使用 CPU 时间。
在我下面的这一份示例 中,可以看到,大部分的 cpu 时间都是被 wait 所占用的。这里的 wait 实际上是 idle 进程,可以表明这个系统是一个完全空闲的系统。
$ more __prof.all
Process PID TID Total Kernel User Shared Other
======= === === ===== ====== ==== ====== =====
wait 40970 40971 2998 2998 0 0 0
wait 32776 32777 2994 2994 0 0 0
wait 24582 24583 2985 2985 0 0 0
wait 16388 16389 2980 2980 0 0 0
syncd 221254 155707 31 31 0 0 0
caiUxOs 524540 2294015 3 0 0 3 0
netm 73746 73747 1 1 0 0 0
hats_nim 1671242 1220665 1 0 0 1 0
snmpd64 598258 1245291 1 1 0 0 0
rpc.lockd 639212 1728679 1 1 0 0 0
tprof 704622 2277437 1 0 0 1 0
trclogio 360524 2408625 1 1 0 0 0
trace 1523820 2523145 1 0 0 1 0
clinfo 1958102 2760945 1 1 0 0 0
sh 1572938 2285709 1 1 0 0 0
======= === === ===== ====== ==== ====== =====
Total 12000 11994 0 6 0
Process FREQ Total Kernel User Shared Other
======= === ===== ====== ==== ====== =====
wait 4 11957 11957 0 0 0
syncd 1 31 31 0 0 0
caiUxOs 1 3 0 0 3 0
netm 1 1 1 0 0 0
hats_nim 1 1 0 0 1 0
snmpd64 1 1 1 0 0 0
rpc.lockd 1 1 1 0 0 0
tprof 1 1 0 0 1 0
trclogio 1 1 1 0 0 0
trace 1 1 0 0 1 0
clinfo 1 1 1 0 0 0
sh 1 1 1 0 0 0
======= === ===== ====== ==== ====== =====
Total 15 12000 11994 0 6 0
在这里,对 wait 进程作一点补充说明。
在 AIX 5L 下,你用 ps aux 会发现有一些 root 的 wait 进程
#ps aux |head -20
USER PID %CPU %MEM SZ RSS TTY STAT STIME TIME COMMAND
oracle 266354 5.7 0.0 50136 27524 - A 15:40:35 0:32 oracleora92 (LOC
root 17214 3.1 0.0 40 40 - A Jul 04 24793:53 wait
root 16946 3.1 0.0 40 40 - A Jul 04 24633:59 wait
root 16678 3.1 0.0 40 40 - A Jul 04 24600:21 wait
root 53274 3.1 0.0 40 40 - A Jul 04 24397:54 wait
root 286 3.1 0.0 40 40 - A Jul 04 24371:55 wait
root 8196 3.0 0.0 40 40 - A Jul 04 24312:40 wait
root 822 3.0 0.0 40 40 - A Jul 04 24303:36 wait
root 554 3.0 0.0 40 40 - A Jul 04 24261:50 wait
root 20776 2.7 0.0 40 40 - A Jul 04 21502:46 wait
root 57372 2.7 0.0 40 40 - A Jul 04 21439:31 wait
root 49176 2.7 0.0 40 40 - A Jul 04 21423:47 wait
root 21044 2.7 0.0 40 40 - A Jul 04 21398:24 wait
root 12848 2.7 0.0 40 40 - A Jul 04 21357:07 wait
root 21312 2.7 0.0 40 40 - A Jul 04 21324:26 wait
root 12580 2.7 0.0 40 40 - A Jul 04 21293:06 wait
root 13116 2.7 0.0 40 40 - A Jul 04 21195:47 wait
oracle 344612 0.3 0.0 57588 34976 - A Jul 04 2663:08 ora_j000_ora92
oracle 430408 0.3 0.0 55908 33296 - A Jul 04 2220:57 ora_j001_ora92
wait 就 是 CPU 空闲的时 候运行的空闲进程, AIX4 上叫 kproc 。所以这个进程占用越大,表示机器越空闲。 Wait 进程的数量是由机器上的逻辑 CPU 的个数决定的,有几个逻辑 CPU ,就有几个 wait 进程 .
5 、 ps
这个命令使用本身也比 较复杂,在这里只介绍如何查看 cpu 占用最高的进程。使用举例如下:
#ps aux | head -25
USER PID %CPU %MEM SZ RSS TTY STAT STIME TIME COMMAND
root 17214 3.1 0.0 40 40 - A Jul 04 25578:42 wait
root 16946 3.1 0.0 40 40 - A Jul 04 25415:54 wait
root 16678 3.1 0.0 40 40 - A Jul 04 25377:03 wait
root 53274 3.1 0.0 40 40 - A Jul 04 25170:12 wait
root 286 3.1 0.0 40 40 - A Jul 04 25144:00 wait
root 8196 3.0 0.0 40 40 - A Jul 04 25082:32 wait
root 822 3.0 0.0 40 40 - A Jul 04 25072:25 wait
root 554 3.0 0.0 40 40 - A Jul 04 25034:14 wait
root 20776 2.7 0.0 40 40 - A Jul 04 22181:27 wait
root 57372 2.7 0.0 40 40 - A Jul 04 22118:00 wait
root 49176 2.7 0.0 40 40 - A Jul 04 22102:02 wait
root 21044 2.7 0.0 40 40 - A Jul 04 22077:18 wait
root 12848 2.7 0.0 40 40 - A Jul 04 22036:44 wait
root 21312 2.7 0.0 40 40 - A Jul 04 21998:53 wait
root 12580 2.7 0.0 40 40 - A Jul 04 21967:17 wait
root 13116 2.7 0.0 40 40 - A Jul 04 21865:51 wait
oracle 344612 0.3 0.0 56372 33852 - A Jul 04 2707:30 ora_j000_ora92
oracle 430408 0.3 0.0 55916 33396 - A Jul 04 2266:20 ora_j001_ora92
oracle 365092 0.2 0.0 56184 33664 - A Jul 04 1765:58 ora_j002_ora92
oracle 442430 0.2 0.0 56092 33572 - A Jul 04 1426:40 ora_j003_ora92
oracle 385606 0.1 0.0 55984 33464 - A Jul 05 1159:17 ora_j004_ora92
oracle 413856 0.1 0.0 50520 28000 - A Jul 23 543:31 oracleora92 (LOC
oracle 143668 0.1 0.0 50528 28008 - A Jul 13 833:21 oracleora92 (LOC
oracle 369230 0.1 0.0 56600 34080 - A Jul 05 806:36 ora_j005_ora92
在这个输出结果中,排 在前面的是 16 个 root 用户的 wait 进程,这其实是 CPU 空闲的时候运行的空闲进程,之前已作 说明。
所以 CPU 最高的几个进程其实是下面的 ORACLE 用户的 ora_j00* 进程,这是 ORACLE 的 job 进程。在这里,这些进程的开销很小。如 果 ORACLE 的 进程开销比较大,我们可以用如下的方法来查询具体的进程在干什么事情,例如我们要查询进程 ora_j000_ora92 , PID=344612 ,可以使用下面的方法:
$su – oracle
SQL>sqlplus “/as sysdba”
SQL>oradebug setospid 344612
SQL>oradebug event 10046 trace name context forever, level 8
SQL>oradebug tracefile_name – 这个命令我们获得输出文件的绝对路径和文件名
SQL>oradebug event 10046 trace name context off
$tkprof /opt/oracle/app/oracle/admin/ora92/bdump/ora92_j000_344612.trc tracepid.txt
$more tracepid.txt
在 tracepid.txt 中,我们就可以看 到这个进程中具体运行的语句、过程等,以及所有的 SQL 的 cpu 消耗、物理读、逻辑读、执行计划等信息。
另外,我们也可以执行 下面的语句查看进程具体运行的 SQL 语句的文本:
SELECT /*+ ORDERED */ sql_text FROM v$sqltext a
WHERE (a.hash_value, a.address) IN (
SELECT DECODE (sql_hash_value,0, prev_hash_value,sql_hash_value),
DECODE (sql_hash_value,0, prev_sql_addr, sql_address)
FROM v$session b
WHERE b.paddr = (SELECT addr
FROM v$process c
WHERE c.spid = '&pid'))
ORDER BY piece ASC
6 、解决 CPU 占用的惩罚机制 nice 和 renice
指定和修改命令的优先级。
系统中运行的每个进程 都有一个优先级,我们可以用 ps 命令看到,这个优先级为 PRI , PRI 的值越小,优先级越高,能占用更多的 CPU 时间片。系统默认的 PRI 为 60 ,我们可以通过 nice 命令和 renice 命令来改变一个进程的优先级,从而控制进程对 CPU 时间片的占用。
任何一个用户都可以使 用 nice 命令来 使他的进程以低于系统默认的 pri 运行。但是只有 root 用户才可以使进程以高于默认的 pri 运行。
我们先来看一下 nice 命令的使用方法:
#nice –n -5 vmstat 2 10 >vmstat.out
# ps -el
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
200001 A 0 704738 1523728 0 55 15 aee1400 544 f100009e63c23e30 pts/1 0:00 vmstat
指定程序以 nice 值 -5 开始运行。程序开始后, nice 的值为 15 , PRI 的值为 55 。
nice 命令可以指定的范围为 -20 ( 最高优先级 ) 到 20 ( 最低优先级 ) 。在 AIX5.3 中,默认的 nice 为 20 。
# vmstat 2 10 >vmstat.out
# ps -el
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
200001 A 0 704740 1523728 0 60 20 32ec6400 472 f100009e63c23e30 pts/1 0:00 vmstat64
可以看到默认的情况下,系统使用的 nice=20 , pri=60 。
实际上,在使用 nice 指定的时候,我们也可以使用超出闭区间 [-20,20] 的值,比如:
nice –n -33 vmstat 2 10 >vmstat.out
# ps -el
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
200001 A 0 319652 1523728 0 40 0 82ef0400 544 f100009e63c23e30 pts/1 0:00 vmstat64
上例中,我们指定的 nice 小于 -20 ,得到最高的优先级( pri=40 )。反之,如果我们指定 nice 的值超过 20 ,比如 nice=21 ,我们将得到最低的优先级值 pri=100 。
renice 不能在具有固定优先级的进程上使用。非 root 用户可以在一个或多个运行进程的 nice 值上加一个指定的值,但不能从中减去指定的值。也就是只能降低进程的优先级,而不能增加优先级。
renice -n -10 pidnumber ,将指定的进程 nice 值减小 10 。
renice -n +5 pidnumber ,将指定的进程 nice 值增加 5 。
根据 nice 值的不同取值,这里 renice 的值可以取值的范围是闭区间 [-40,40 ] 。为什么取值范围是这个 呢?我们可以这样来理解,通过 ps –l 命令,我们可以看到 NI 的取值范围是闭区间 [0,40] ,我们使用 renice 需要改变的也就是整个值,考虑两个极端的情况,假如现在为 0 ,我们要把它改到 40 ,就必须得 renice –n 40 ,如果现在是 40 ,我们要把它改为 0 ,则 renice 的值就得是 -40 了。
当然,跟 nice 一样,在这里 renice 的值在命中使用的时候也可以超 出这个闭区间,不会报错,但有效的结果只落在这个闭区间内。
# ps l 1630282
FSUID PID PPID C PRI NI ADDR SZ RSS WCHAN TTY TIME CMD
200001 A 0 1630282 680062 0 100 40 413e8400 472 484 EVENT pts/1 0:00 v
# renice -n -30 1630282
# ps l 1630282
FSUID PID PPID C PRI NI ADDR SZ RSS WCHAN TTY TIME CMD
200001 A 0 1630282 680062 0 50 10 413e8400 472 484 EVENT pts/1 0:00 v
我们可以总结一下, pri 值的取值公式大概如下:
优先级值( PRI ) = 基本优先级( 60 )+ nice 损失 + 基于最近 CPU 使用情况的 CPU 损失
总的来说 nice 值越小,进程的优先级越高,能分配到更多的 cpu 时间片。反之,也成立。
7 、小 结
对于系统 cpu 的监控,建议:
1 )使用 vmstat 进行分析
2 ) sar –P ALL 1 10 分析,多个 cpu 间的负载是否平衡
3 ) ps aux 查看
4 ) tprof 查看更详细的信息