AIX 5.3主机性能评估-CPU性能评估

对于 AIX 主机的性能评估,我们从下面的 4 个方面来逐一介绍: CPU MEMORY I/O 系统和网络这 4 个方面来描述。

 

一、 CPU 性 能评估

    首先,我们还是先来看一下 CPU 的性能评估。下面先主要介绍几个看 CPU 性能的命令。

1 vmstat

    使用 vmstat 来进行性能评估,该命令可获得关于系统各种资源之间的相关性能的简要信息。当然我们也主要用它来看 CPU 的一个负载情况。

    下面是我们调用 vmstat 命令的一个输出结果:

www.ixdba.net

 

$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 查看更详细的信息

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值