Prayer

在一般中寻求卓越
posts - 1256, comments - 190, trackbacks - 0, articles - 0
  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

如何调试 AIX 上的应用程序

Posted on 2012-03-02 15:26 Prayer 阅读(847) 评论(0)  编辑 收藏 引用 所属分类: LINUX/UNIX/AIX

----越来越多的用户选择了IBM的RS/6000服务器作为应用程序的运行平台,并且伴随应用程序复杂度的增加,给系统以及应用程序的性能提出了进一步的要求。在这里讲解是如何在AIX环境中调试系统性能,找出具体的问题和产生的原因,找到解决的办法,使得应用程序的反应速度加快,以满足用户的需求。
  ----从性能角度来看,总体上分为:系统整体性能和应用程序个体的性能。从性能调试的方法来讲大体上是一致的,只是着重点和调试目标的不同。在系统性能方面,是为了达到最大的系统吞吐量并减小反应时间;在应用程序方面,是为了减小反应时间。
----性能调试就是使得应用程序和系统的资源分配能够最佳地符合当前特定环境。
----性能调试的流程如下:
 首先判断CPU是否是瓶颈,如果CPU是瓶颈则调试系统或应用程序的参数,增强CPU; 
 第二判断内存是否是瓶颈,调节系统和应用程序关于内存的参数,使内存的使用达到最佳; 
 第三判断磁盘的输入/输出是否是瓶颈,调节磁盘的使用状态及参数,减少输入/输出时间; 
 第四判断网络是否是瓶颈,调节网络环境或应用程序访问方式,增加网络吞吐量或减小网络压力;
 第五附加的测试跟踪,使用附加工具生成分析报表。
 
  ----这里开始对每一个步骤进一步的阐述。 
    ----对于每一个进程来讲,它们都有进程优先级,计算公式为:PRI=NICE+40+CPU_ PENALTY,从公式中可以看到基本上用户进程的优先级是大于40的。可以使用“ps -l”和“ps -emo THREAD”命令分别查寻进程和线程的CPU使用状态。使用“nice -n proname”和“renice +n proid”来修改进程的优先级。
 
  ----对CPU的整体调试过程可以总结如下:
    首先使用“iostat”、“vmstat”和“sar”命令查看是否CPU有瓶颈,以及使用状态;
  使用“ps”命令查看哪条进程占用大量CPU时间; 
  使用“prof”、“gprof”和“tprof”命令查看特定的应用程序中哪些或哪一条语句占用CPU过长;
----改应用程序代码,优化程序,对于十分消耗CPU资源的数学算法调用要使用AIX系统提供的函数库BLAS/ESSL中的数学算法,这些算法函数要比程序员自己开发的函数节省系统资源。
----此外,在编译可执行文件时,使用优化参数对程序进行进一步优化。
----对于CPU的消耗在很多情况下是由应用程序引起的,在应用程序优化完成以后,如果CPU依然没有很大的改善,这就需要对CPU直接进行升级了,要么就增加CPU的个数。这里还有两个命令在应用程序调试时十分有用:“time”和“timex”。这两个命令可以检测出某个应用程序从开始到结束总共花费的时间,“time”返回分钟数和秒数,“timex”返回总共的秒数。
----在判断和调试系统内存之前,首先要了解内存访问的概念。内存在大多数情况下指虚拟内存,其中包括实内存(Real Memory)和磁盘上的虚拟空间(Paging Space)。值得注意的是在AIX系统中,实内存的输入/输出不仅在磁盘虚拟空间之间产生,而且包括另外两种形式:固定数据文件(Persistent Segment)和远程数据文件(Client Segment)。为了减少磁盘的寻址时间,磁盘虚拟空间往往采用连续的存储空间。
----检测系统内存的使用情况主要使用命令“vmstat”,此命令可以查看到活动的虚拟空间和剩余的实内存、内存页的输入/输出状态和CPU是否有输入/输出空闲。在分析统计调试结果时,一定要注意上面提到的实内存输入/输出的三种途径。
----使用“ps au”命令可以查看每条进程的内存占有情况,数据是以百分比的方式显示。
 
  ----还有一个命令十分有用,“svmon”,这个命令帮助调试者进一步取得有关进程使用内存的信息,它可以生成当前使用内存最多的进程状态报表。SVMON命令和VMSTAT命令可以配合使用,它们的返回结果有一部分是相互重叠的,由此也可以验证进程使用内存状态的真实性。另外,SVMON命令还可以分析出来指定进程在使用内存方面的细节,究竟是哪些程序片占用了哪些内存,参数是“-P”。
  ----命令“vmtune”用来修改操作系统与内存使用相关的系统参数。通过修改内存系统参数可以改变系统对内存使用的方式以及分配原则,从而调节内存的输入/输出。
  ----在内存的使用中有一个现象称为“Thrashing”,即内存使用产生抖动现象,为了满足某些进程的执行,不断地对内存进行输入/输出,当系统发现将要产生这种现象时,就会暂停某些进程使内存抖动现象不再发生。抖动现象会影响某些进程的反应速度,要尽量避免内存抖动的产生。内存抖动是由磁盘虚拟空间分配冲突造成的,磁盘虚拟空间对应用程序进程来讲不够大。
  ----在磁盘的读写方面是与AIX操作系统的磁盘管理相关的。AIX操作系统的磁盘管理分为四个层次:
  ----文件/目录、文件系统、逻辑卷和物理卷。访问磁盘的适配器目前基本上有四类:SCSI-1、SCSI-2、SSA和HIPPI。它们的访问吞吐量是从低到高。数据存放在磁盘分区的不同也会影响访问速度,总的来说,存放在磁盘中心最快,从中心向两侧访问速度逐渐降低(寻址时间会加长)。这里有五个系统参数在定义逻辑卷的时候可供选择:“Inner Edge”、“Inner Middle”、“Center”、“Outer Middle”和“Outer Edge”。使用“iostat”命令可以查看每一块磁盘使用情况,如果是多块磁盘,可以检测到磁盘资源是否平均利用,磁盘输入/输出等待的百分比和整个磁盘的吞吐量等。还有一条命令“filemon”,这条命令可以收集到各个层面的访问信息,包括文件系统、虚拟内存和物理磁盘。
  ----此命令将收集到的信息输出到一个文件中,在信息文件中可以查询到逻辑卷的输入/输出量,访问的文件名,读/写的块数、其中顺序读/写的块数分别是多少,磁盘寻址所占整个时间的百分比。使用命令“lslv ”和“lslv -l ”可以查到指定的逻辑卷所存放的物理磁盘位置,以及实际的命中率。当发现磁盘读写量较大,CPU的输入/输出等待较多,但磁盘的使用比较均衡,这时就需要提高适配器的性能,增加适配器的吞吐量,可以增加磁盘适配器个数或者高一级的适配器。
  ----可以使用“vmtune”命令调高与逻辑卷相关的参数“hd_pbuf_cnt”,当使用命令“filemon”命令发现磁盘输入/输出大部分是顺序读写的时候,调高参数“hd_pbuf_cnt”值会改善系统性能。
  ----上面讲到的调试方法大都直接与物理设备有关,下面来介绍以下如何调节文件系统的性能。文件系统的访问包括逻辑文件系统、虚拟磁盘空间管理、裸设备读写和逻辑卷管理,并且系统对于单个文件的访问也根据文件的大小分为三种访问机制:小于32K的文件直接访问、大于32K且小于4M的文件通过一层索引块寻址、大于4M的文件通过两层索引块寻址。另外,在性能调试时应该考虑文件存放的物理位置是否是连续的(有几个断点)和该文件空间与文件存放所占用的连续物理空间的比例,这两个因素都会影响文件访问时的寻址时间。可以使用“fileplace”命令统计出指定文件的这两个数值。第一个参考值为“seqentiality”,其计算方式为(文件总的块数-中断次数)/文件总的块数;第二个参考值为“space efficiency”,其计算方式为(文件总的块数/文件存放占用区域的连续块数)。两个值都是越大越好。在AIX系统中存在一个文件系统日志,名为“JFS Log”;这个文件日志同样会抢占磁盘的输入/输出,这个文件日志应该与使用的文件系统处于不同的物理磁盘上。
  ----对于有的应用程序可以利用AIX操作系统提供的裸设备(Row Device)存储方式,例如UDB关系型数据库系统可以将自身的表空间(Tablespace)和数据库日志存放在裸设备上,这样就提高了数据存取的速度。
  ----当发现文件系统中文件出现过多的断点时,可以对文件系统进行重整。此项工作可以通过系统提供的“smit”工具完成,也可以调用命令“defragfs”。但为了安全起见,在进行这项工作之前要确保已经对当前的文件系统做了备份,最好有两份。这里还要提到两个参数:“numfsbufs”和“lvm_bufcnt”,如果应用程序有大量向高速输入/输出端口的写操作,调高这两个参数会提高应用程序的访问速度。参数“lvm_bufcnt”只对向裸设备的输入/输出操作起作用。
  ----网络性能和网络构架有直接关系,主要取决与网络每秒的传输速率。有两个命令可以查看网络当前使用的状态,它们是:“netstat”和“netpmon”。这两个命令分别可以看到不同的网络使用信息,其中“netpmon”可以查看到非常细致的网络上的传输使用状态。对网络的调试命令有下列三种:“no”、“chdev”和“ifconfig”,通过这三个调试命令调试网络相关参数,提高网络传输性能。
  ----在某些应用程序中会对远程数据文件直接访问,这就用到了NFS服务。查看NFS的使用状态可以使用命令:“nfsstat”。有几个参数会直接影响NFS的访问速度,“nfsd daemons”的个数、虚拟磁盘空间为文件分派的大小、传输和接受队列的大小、参数“nfs_socketsize”和“sb_max”以及是否使用“Access Control Lists”。虽然网络在特定的环境下,同样是可以将性能调高的,但这里还是建议使用者将经常访问的数据文件从远程复制到本地进行读写。
  ----在AIX操作系统中,系统提供了几个性能跟踪的程序:“trace”、“trcrpt”和一系列图形工具。图形工具包括:“PDT”、“perfpmr”、“PTX/6000”和“BEST/1”。通过使用这些附加的工具,可以进一步对系统和应用程序的使用状态跟踪调试。
  ----最后,读者也许还记得在文章的开始,提到对应用程序的调试,这里强调的是,调试应用程序是提高性能的最佳手段,对应用程序的改善在某些情况下,会给性能带来成倍的提高。而对系统参数的调节不会达到这种地步。系统性能的不足最终是通过增加系统硬件设备来解决的。此文只是提供读者一个调试性能的清晰条理,真正的性能调试还要在具体项目中得以验证。读者要记住何谓“性能调试”:在性能调试的过程中没有一定之规,就象做菜没有菜谱一样,这是一个仁者见仁、智者见智的事情。

 


只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理