高性能Linux服务器第10章基于Linux服务器的性能分析与优化
10.1.2提供性能优化方案查找系统性能瓶颈是个复杂而耗时的过程,需要在应用程序、操作系统、服务器硬件、网络环境等方面进行查找和定位,影响性能最大的是应用程序和操作系统两个方面,因为这两个方面出现的问题不易察觉,隐蔽性很强。而硬件、网络方面出现的问题,一般都能马上定位。一旦找到了系统性能问题,解决起来就非常迅速和容易。例如发现系统硬件存在问题,如果是物理故障,那么更换硬件就可以了,如果是硬件性能不能满足需求,升级硬件就可以了;如果发现是网络问题,比如带宽不够、网络不稳定,只需优化和升级网络即可:如果发现是应用程序问题,修改或优化软件系统即可;而如果是操作系统配置问题,修改系统参数、修改系统配置即可。可见,只要找到了性能瓶颈,就可以提供性能优化方案,有标准、有目的地进行系统优化。
10.1.3使系统硬件和软件资源的使用达到平衡Linux操作系统是一个开源产品,也是一个开源软件的实践和应用平台,在这个平台下有无数的开源软件支撑,常见的有Apache、Tomcat、MySQL、PHP等。开源软件的最大理念是自由、开放,那么Linux作为一个开源平台,最终要实现的是通过这些开源软件的支持,以最低廉的成本,达到应用性能的最优化。但是,系统的性能问题并非是孤立的,解决了一个性能瓶颈。可能会出现另一个性能瓶颈。所以说性能优化的最终目的是:在一定范围内使系统的各项资源使用趋干合理并保持一定的平衡,即系统运行良好的时候恰恰就是系统资源达到了一个平衡状态的时候。而在操作系统中,任何一项资源的过度使用都会破坏这种平衡状态,从而导致系统响应缓慢或者负载过高。例如,CPU资源的过度使用会造成系统中出现大量的等待进程,导致应用程序响应缓慢,而进程的大量增加又会导致系统内存资源的增加,当物理内存耗尽时,系统就会使用虚拟内存,而虚拟内存的使用又会造成磁盘I/O的增加并加大CPU的开销。因此,系统性能的优化就是在硬件、操作系统、应用软件之闻找到一个平衡点。
10.2分析系统性能涉及的人员10.2.1Linux系统管理人员在进行性能优化的过程中,系统管理人员承担着很重要的任务,首先,系统管理人员要了解和掌握操作系统的当前运行状态,例如系统负载、内存状态、进程状态、CPU负荷等,这些信息是检测和判断系统性能的基础和依据;其次,系统管理人员还要掌握系统的硬件信息,例如磁盘I/O、CPU型号、内存大小、网卡带宽等参数信息,然后根据这些信息综合评估系统资源的使用情况;第三,作为一名系统管理人员,还要掌握应用程序对系统资源的使用情况,更深入的一点就是要了解应用程序的运行效率,例如是否有程序bug、内存溢出等问题。通过对系统资源的监控,就能发现应用程序是否存在异常,如果确实是应用程序存在问题,需要把问题立刻反映给程序开发人员,进而改进或升级程序。性能优化本身就是一个复杂和繁琐的过程,系统管理人员只有了解了系统硬件信息、网络信息、操作系统配置信息和应用程序信息才能有针对性地展开对服务器的性能优化,这就要求系统管理员有充足的理论知识、丰富的实战经验以及缜密分析问题的头脑。
10.2.2系统架构设计人员系统性能优化涉及的第二类人员就是应用程序酌架构设计人员。如果系统管理人员在经过综合判断后,发现影响性能的是应用程序的执行效率,那么程序架构设计人员就要及时介入,深入了解程序运行状态。首先,系统架构设计人员要跟踪了解程序的执行效率,如果执行效率存在问题,要找出哪里出现了问题;其次,如果真的是架构设计出现了问题,那么就要马上优化或改进系统架构,设计更好的应用系统架构。
10.2.3软件开发人员系统性能优化最后一个环节涉及的是程序或软件开发人员。在系统管理员或架构设计人员找到程序或结构瓶颈后,程序开发人员要马上介入进行相应的程序修改。修改程序要以程序的执行效率为基准,改进程序的逻辑,有针对性地进行代码优化。例如,系统管理人员在系统中发现有条SQL语句耗费大量的系统资源,抓取这条执行的SQL语句后,发现此SQL语句的执行效率太差,是开发人员编写的代码执行效率低造成的,这就需要把这个信息反馈给开发人员。开发人员在了解到这个问题后,可以有针对性地进行SQL优化,进而实现程序代码的优化。从上面这个过程可以看出,系统性能优化一般遵循的流程是:首先系统管理人员查看系统的整体状况,主要从系统硬件、网络设备、操作系统配置、应用程序架构和程序代码5个方面进行综合判断。如果发现是系统硬件、网络设备或者操作系统配置问题,系统管理负可以根据情况自主解决;如果发现是程序结构问题,就需要提交给程序架构设计人员:如果发现是程序代码执行问题,就交给开发人员进行代码优化。这样就完成了一个系统性能优化的过程。
4.网络宽带Linux下的各种应用,一般都是基于网络的,因此网络带宽也是影响性能的一个重要因素,低速的、不稳定的网络将导致网络应用程序的访问阻塞,而稳定、高速的网络带宽,可以保证应用程序在网络上畅通无阻的运行。幸运的是,现在的网络一般都是千兆带宽或光纤网络,带宽问题对应用程序性能造成的影响正在逐步降低。
10.3.3应用程序软件资源应用程序的优化其实是整个优化工程的核心,如果一个应用程序存在bug.那么即使其他方面都达到了最优状态,整个应用系统还是性能低下的。所以,对应用程序的优化是性能优化过程的重中之重,这就对程序架构设计人员和程序开发人员提出了更高的要求。
10.4系统性能分析标准和优化原则性能调优的主要目的是使系统能够有效地利用各种资源,最大可能地发挥应用程序和系统之间的性能触合,使应用高效、稳定地运行。但是,衡量系统资源利用率好坏的标准没有一个严格的定义,针对不同的系统和应用也没有一个统一的说法,因此,这里提供的标准其实是一个经验值,如表10-1所示。
表10-1系统性能分析标准
10.5几种典型应用对系统资源使用的特点10.5.1以静态内容为主的Web应用这类应用的一个主要特点是小文件居多,并且读操作频繁.Web服务器一般为Apache或Nginx,因为这陌个HTTP服务器对静态资源的处理非常迅速和高效。在Web访问量不大时,可以直接对外提供服务,但是在有很大并发请求时,单一的Web服务无法支撑大量的客户端访问,此时就需要由多台Wcb服务器组成负载集群系统。为了实现更高效的访问,在最前端还可以搭建Cache服务器,也就是将静态资源文件缓存到操作系统内存中直接进行读操作,因为直接从内存读取数据要比从硬盘读数据效率高很多,所以在Web前端搭建Cachc服务器可以大大提高并发访问性能。常用的Cachc轶件有Squid、Varinsh等。Cache服务器虽然可以提高访问性能,但要求服务器有很大的内存,当系统内存充足时,可以缓解磁盘随机读的压力:当内存过小或者内存不足时,系统就会使用虚拟内存,而虚拟内存的使用会引起磁盘I/O的增大,当磁盘I/0增大时,CPU的开销也随之增加。在高并发访问时,还存在另外一个问题,就是网络带宽瓶颈,如果客户端访问量很大且带宽不够,就会阻塞网络,影响访问。因此,在构建基于Web的网络应用时,网络带宽也是必须考虑的一个因素。
10.5.2以动态内容为主的Web应用这类应用的一个特点是频繁地执行写操作,例如Java、PHP、Perl、CGI等,会导致CPU资源消耗严重。因为动态程序的执行要进行编译java、解析php、读取数据库等操作,而这些操作都会消耗CPU资源。因此,一个基于动态程序的Web应用,应该选择多个性能较高的CPU,这将对系统整体性能的提高有很大帮助。基于动态内容的Web应用在高并发访问时,系统执行的进程数会很多,因此要注意负载的分配。由于过多的进程会消耗大量系统内存,如果内存不足,就会使用虚拟内存,而虚拟内存的增加会导致磁盘写操作频繁,进而消耗CPU资源。因此要寻求一个硬件资源和软件资源的平衡点,例如配置较大的内存和高性能的CPU,而在软件方面可通过如Memcached之类的软件加快程序与数据库之间的访问效率。
10.5.5流媒体服务应用流媒体主要应用在视频会议、视频点播、远程教育、在线直播等方面,这类应用主要的性能瓶颈是网络带宽和存储系统带宽(主要是读操作)。面对海量用户,如何保障用户接收到高清晰的、流畅的画面,如何最大限度地节省网络带宽,这些都是流煤体应用要解决的首要问题。对于流媒体服务器的优化,可以从存储策略、传输策略、调度策略、代理服务器缓存策略及流媒体服务器的体系结构设计等几个方面进行考虑。在存储方面,需要对视频的编码格式进行优化,进而节省空间,优化存储性能;在传输方面,可以采用智能流技术控制发送的速率,最大程度地保障用户观看视频的流畅性;在调度方面,可以采用静态调度和动态调度结合的方法:在代理服务器方面,可以采用分段缓存、动态缓存等管理策略;在流媒体体系结构方面,可以采用内存池和线程池技术改善内存消耗和线程过多对性能造成的影响。
10.6Linux下常见的性能分析工具10.6.1vmstat命令vmstat是VirtualMeomoryStatistics(虚拟内存统计)的缩写,很多Linux发行版本都默认安装了此命令工具。
利用vmstat命令可以对操作系统的内存信息、进程状态、CPU活动等进行监视,不足之处是无法对某个进程进行深入分析。vmstat命令的语法如下:
例如:
vmstat3表示每3秒更新一次输出信息,循环输出,按Ctrl+c停止输出。
vmstat35表示每3秒更新一次输出信息,统计5次后停止输出。下面是vmstat命令在某个系统中的输出结果:
10.6.2sar命令-》sysstat包sar命令很强大,是分析系统性能的重要工具之一。通过sar指令,可以全面获取系统的CPU、运行队列、磁盘I/O、分页(交换区)、内存、CPU中断、网终等性能数据。
安装
yuminstall-ysysstatsar命令的语法如下:
sar—u35系统的CPU计数是从O开始的,如果要查看第二个CPU的运行负载,使用下面组合:
sar—p135要查看系统磁盘的读写性能,使用以下组合:
sar-d35同理,查看系统内存使用情况、网络运行状态,可以分别使用下面的命令:
sar-r52sar—nDEV53下面是sar命令对某个系统的CPU统计输出:
[rootOwebaerver-]#sar-P035Linux2.6.9-42.ELsmp(webaerver)11/29/2008_i686_(8CPU)06:29:33PMCPU%user%nice%system%iowait%steal%idle06:29:36PMO3.000.000.330.000.0096.6706:29:39PMO0.670.000.330.000.0099.0006:29:42PMO0.000.000.330.000.0099.6706:29:45PMO0.670.000.330.000.0099.0006:29:48PM01.000.000.330.330.0098.34Average:01.070.000.330.070.0098.53这个输出是对系统的第一个CPU的信息统计,需要注意的是,sar中对CPU的计数是从0开始的,因此,“sar-P035”表示对系统的第一个CPU进行信息统计,“sar-P435”则表示对系统的第5个CPU进行统计。依此类推,可以看出,上面的系统有8个CPU。
10.6.3iostat命令-》也是sysstat包(pidstat、sar、iostat、tapestat、mpstat、cifsiostat)
yuminstall-ysysstat安装完毕,系统会多出3个命令:iostat、sar和mpstat,然后就可以直接在系统下运行iostat命令了。iostat命令的语法如下:
iostat[-c|-d][一k][—t][一x[device]][interval[count]]各个选项及参数含义如下:
[root@webserver-]#iostat-cLinux2.6.9-42.ELsmp(webserver)11/29/2008_i686_(8CPU)avg-cpu:%user%nice%system%iowait%steal%idle2.520.000.300.240.0096.96在这里,使用了“-c”参数,只显示系统CPU的统计信息,输出中每项代表的含义与sar命令的输出项完全相同。下面通过“iostat-d”命令组合来查看系统磁盘的使用状况:
[root@webserver-]#iostat-d23Linux2.6.9-42.ELsmp(webserver)12/01/2008_i686_(8CPU)Device:tpsBlk_read/sBlk_*rrtn/sBlk_readBlk_wrtnsdal.872.58114.126479462286537372Device:tpsBlk_read/sBlk_*rrtn/sBlk_readBlk_wrtnsdao.ooo.ooo.ooooDevice:tpsBlk_read/sBlk_Wr-tri/sBlkreadBlk_wrtnsdal.000.0012.00024上面每项输出的解释如下:
[root@webserver-]#iostat-x/dev/sda23Linux2.6.9-42.ELsmp(webserver)12/01/2008_i686_(8CPU)avg-cpu:%user%nice%system%iowait%steal%idle2.450.000.300.240.0097.03Device:rrqm/swrqm/sr/sw/srsec/swsec/savgrq-szavgqu-szawaitsvctm%utilsda0.0112.480.10l.782.58114.0362.330.0738.391.300.24avg-cpu:%user%nice%system%iowait%steal%idle3.970.001.838190.008614Device:rrqm/swrqm/sr/sw/srsec/swsec/savgrq-szavgqu-szawaitsvctm%utilsda0.00195.000.0018.000.001704.0094.670.042.500.110.20avg-cpu:%user%nice%system%iowait%steal%idle4.040.001.838.010.0086*18Device:rrqm/swrqm/sr/sw/srsec/swsec/savgrq-szavgqu-szawaitsvctm%utilsdasda0.004.500.007.000.o092.0013.140.OI0.790.140.10这个输出基本与“sar-d”相同。需要说明以下几个选项的含义:口rrqm/s表示每秒进行合并的读操作数目。口wrqm/s表示每秒进行合并的写操作数目。口r/s表示每秒完成读I/O设备的次数。口w/s表示每秒完成写I/O设备的次数。口rsec/s表示每秒读取的扇区数。口wsec/s表示每秒写入的扇区数。
10.6.4free命令free是监控Linux内存使用状况最常用的指令。看下面这一个输出:
[root@webeerver-]#free-b-s5totalusedfreesharedbufferscachedMem:8505901056752870604897719500802601123846601158656-/+buffera/cache:6674350087838466048Swap:85871493121638408586985472totalusedfreesharedbufferscachedMem:8505901056752693657697896448002601287686601142272-/+buffers/cache:6656655367840235520Swap:85871493121638408586985472totalusedfreesharedbufferscachedMem:85059010567523987456981913600-/+buffers/cache:6627164167843184640Swap:85871493121638408586985472其中,“-b”表示以千字节(也就是1024字节)为单位来显示内存使用情况。
10.6.6netstat命令netstat命令用于显示本机网络连接、运行端口、路由表等信息。其语法如下:Netstat[选项]该命令的选项说明如表10-2所示。
表10-2netstat命令的选项说明
选项含义-a显示本机的所有连接和监听端口-n以网络IP地址的形式显示当前蠢立的有效连接和端口-r显示路由表信息-s显示按协议的统计信息.默认将显示IP、IPv6、ICMP、ICMPv6、TCP、TCPv6、UDP和UDPv6的统计信息/etc/services文件-v显示当前的有效连接,与“-n”选项类似-t显示所有的TCP协议连接情况-u显示所有的UDP协议连接情况-c<秒数>后面的秒致表示每隔几秒就刷新显示一次-i显示自动配置接口的状态-l仅显示连接状态为“LISTEN”的服务的网络状态-p显示连接对应的PID与程序名“netstat—i”命令组合可以显示网络接口的详细信息。看下面的输出:
下面通过一个具体的例子来解释top命令中每个选项的含义。查看当前系统活动的进程,如图10-1所示。
图10-1查看当前系统活动的进程从图10-1中可以看到,top的输出分为两个部分:统计信息区和进程信息区,即前5行显示为统计信息区,后面几行的为进程信息区。下面分别介绍。
10.8本章小结本章通过理论与实践相结合的方法,系统地讲述了Linux服务器的性能分析原则和优化方法。首先介绍了系统性能分析的目的和意义,接着讲解了影响Linux性能的各种因素,然后分析了常见的几种Web应用系统使用系统资源的特点。接下来详细介绍了Linux下几个常见的性能优化分析工具的使用,最后通过两个具体的案例从整体上一步一步演示了Web应用系统的优化过程。系统优化是个非常大的话题,涉及的知识面广,分析过程也较复杂,这对系统优化人员提出了非常高的要求。但是万变不离其宗,只要掌握了分析问题的步骤和思考问题的方法,优化系统的过程也将变得十分轻松。