
aix系统性能管理及oracle案例分析.docx
45页AIX 5.3主机性能评估 对于AIX主机的性能评估,我们从下面的4个方面来逐一介绍:CPU、MEMORY、I/O系统和网络这4个方面来描述一、CPU性能评估 首先,我们还是先来看一下CPU的性能评估下面先主要介绍几个看CPU性能的命令1、使用vmstat来进行性能评估,该命令可获得关于系统各种资源之间的相关性能的简要信息当然我们也主要用它来看CPU的一个负载情况 下面是我们调用vmstat命令的一个输出结果:$vmstat 1 2 System configuration: lcpu=16 mem=23552MBkthr 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 32022 6561 15 2 77 6 对上面的命令解释如下:Kthr段显示内容r列表示可运行的内核线程平均数目,包括正在运行的线程和等待 CPU 的线程。
如果这个数字大于 CPU 的数目,那么说明有线程需要等待CPUb列表示处在非中断睡眠状态的进程数包括正在等待文件系统 I/O 的线程,或由于内存装入控制而被挂起的线程Memory段显示内容avm列表示活动虚拟内存的页面数,每页一般4KBfre空闲的页面数,每页一般4KBPage段显示内容re –该列无效pi 从磁盘交换到内存的交换页〔调页空间〕数量,4KB/页调页空间是驻留在硬盘上的虚拟内存的一局部当内存使用过量时,会将溢出的工作组页面存储到调页空间中〔窃取页〕当进程访问一个窃取页时,就产生了一个缺页故障,而这一页页必须从调页空间中读入到内存中po 从内存交换到磁盘的交换页数量,4KB/页如果窃取的工作也在调页空间中不存在或者已经作了修改,那么写入调页空间中如果不被再次访问,它会留在调度空间中直到进程终止或者放弃空间fr 根据页面替换算法每秒释放的页数当VMM页面替换例程扫描页面帧表〔Page Frame Table,PFT〕时,它会根据一些条件选取需要窃取的页面以补充空闲列表该条件中包含工作页面和计算页面,释放的页面中,计算页面不产生I/O,工作页面如果数据没有发生修改,也不需要写回磁盘,也不会产生I/O。
sr 根据页面替换算法每秒所检查的页数sr值比fr值高的越多,说明替换算法要查找可以替换的页面就越困难cy 每秒页面替换代码扫描了PFT多少次因为增加空闲列表到达maxfree值,不一定需要完全扫描PFT表,而所有vmstat输出都为整数,所以通常cy列值为0Faults段显示内容〔其实这段内容不需太多关注〕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 1 2AIX jsdxh_db02 3 5 00C2C1EB4C00 10/24/07System configuration: lcpu=16 17:52:26 %usr %sys %wio %idle physc17:52:27 19 7 0 75 8.0017:52:28 19 6 0 75 8.01Average 19 7 0 75 8.01在这里,sar命令输出的是一个整体的cpu使用情况的一个统计,统计分工程的内容也比拟直观,通过名字就可以理解涵义。
这里有一点比拟方便的就是,在最后一行有一个汇总的average行,作为上述统计的一个平均另外,补充说明一点的就是,一般来说,第一行统计信息包含了sar命令本身启动的cpu消耗,所以往往是偏高的,所以导致average值也往往是偏高一点的当然,这不会对结果产生多大影响当我们有多个cpu的时候,而程序采用的是单线程,有时候会出现一种情况,我们检查发现,cpu总体的使用率不高,但是程序响应却比拟慢这里有可能就是单线程只使用了一个cpu,导致这个cpu100%占用,处理不过来,而其他的cpu却闲置这时可以对cpu分开查询,统计每个cpu的使用情况sar -P ALL 1 2Sar还有其他一些比拟特殊的使用方法,比方:如果希望多个采样和多个报告,可为 sar 命令指定一个输出文件,这样就方便多了将 sar 命令的标准输出数据定向到 /dev/null,并将 sar 命令作为后台进程运行具体的命令格式为:sar -A -o /temp/sar_result.log 5 300 > /dev/null & 关于sar其他的一些使用方法,这里不再详述3、第三个可以用来使用的命令是iostat.$ iostat -t 2 4tty: 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.8TTY 的两列信息〔tin 和 tou〕显示了由所有 TTY 设备读写的字符数CPU 统计信息列〔% user、% sys、% idle 和 % iowait〕提供了 CPU 的使用情况。
注意:第一份报告为系统启动以来的一个累积值4、使用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进程,可以说明这个系统是一个完全空闲的系统在AIX 5L下,你用ps aux会发现有一些root的wait进程#ps aux |head -20wait就是CPU空闲的时候运行的空闲进程,AIX4上叫kproc所以这个进程占用越大,表示机器越空闲Wait进程的数量是由机器上的逻辑CPU的个数决定的,有几个逻辑CPU,就有几个wait进程.5、ps这个命令使用本身也比拟复杂,在这里只介绍如何查看cpu占用最高的进程。
例如下:#ps aux | head -25在这个输出结果中,排在前面的是16个root用户的wait进程,这其实是CPU空闲的时候运行的空闲进程,之前已作说明所以CPU最高的几个进程其实是下面的ORACLE用户的ora_j00*进程,这是ORACLE的job进程在这里,这些进程的开销很小如果ORACLE的进程开销比拟大,我们可以用如下的方法来查询具体的进程在干什么事情,例如我们要查询进程ora_j000_ora92,PID=344612,可以使用下面的方法:$su – oracleSQL>sqlplus “/as sysdba〞SQL>oradebug setospid 344612SQL>oradebug event 10046 trace name context forever, level 8SQL>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。
