系统性能分析和优化童剑2006/03/21msn:she11c0de@hotmail.com前言很高兴能有这样的机会,把我自己多年工作中对服务器硬件、软件方面的性能分析的经验和体会,以及性能优化的经验和各位朋友做一次分享。这份ppt的内容组织大致是这样的,通过对系统中和性能相关的各个环节的介绍,使大家知道出现性能问题时可以从那些方面入手去查,而分析典型应用对系统资源使用的特点,让大家对应用和系统资源的依赖有了更直观的认识,然后我会介绍常见的分析及监控系统资源时使用的工具,这个环节应该是最主要的,最后我会举一个实际发生过的系统性能瓶颈分析和优化的案例,作为一个实践和总结。本文涉及的内容基于Gnu/Linux系统平台,但关于性能优化分析和优化的思路也能适用于其他系统平台。我们将会讨论下列7个话题•性能分析的目的•性能分析相关的人•性能相关的各个环节•系统使用和优化的原则•典型应用对系统资源使用的特点•常见的性能分析工具介绍•性能分析及优化的案例开始第1个话题性能分析的目的•性能分析相关的人•性能相关的各个环节•系统使用和优化的原则•典型应用对系统资源使用的特点•常见的性能分析工具介绍•性能分析及优化的案例性能分析的目的•找出系统性能瓶颈–硬件瓶颈–软件瓶颈•提供性能优化方案–升级硬件–改进系统结构•达到合理的硬件和软件配置•使系统资源使用达到平衡性能分析的目的•但遗憾的是解决一个性能瓶颈,往往又会出现另外的瓶颈或者其他问题,所以性能优化更加切实的目标是做到在一定范围内使系统的各项资源使用趋向合理和保持一定的平衡。系统运行良好的时候恰恰也是各项资源达到了一个平衡体,任何一项资源的过渡使用都会造成平衡体系破坏,从而造成系统负载极高或者响应迟缓。比如CPU过渡使用会造成大量进程等待CPU资源,系统响应变慢,等待会造成进程数增加,进程增加又会造成内存使用增加,内存耗尽又会造成虚拟内存使用,使用虚拟内存又会造成磁盘IO增加和CPU开销增加(用于进程切换、缺页处理的CPU开销)开始第2个话题•性能分析的目的性能分析相关的人•性能相关的各个环节•系统使用和优化的原则•典型应用对系统资源使用的特点•常见的性能分析工具介绍•性能分析及优化的案例性能分析相关的人•系统管理员•大型应用的系统结构设计人员•软件开发人员性能分析相关的人•系统管理员–掌握系统运行状况(负载)–掌握系统资源使用情况(硬件)–掌握应用程序对资源的使用情况(应用程序执行效率,反馈给应用开发人员)–有针对性的开展服务器性能优化(硬件、软件、软件配置)性能分析相关的人•系统架构设计人员–了解程序执行效率–了解系统架构中的性能瓶颈,优化系统结构–设计更好的应用系统架构性能分析相关的人•软件开发人员–了解程序执行效率–改进程序逻辑、改进性能开始第3个话题•性能分析的目的•性能分析相关的人性能相关的各个环节•系统使用和优化的原则•典型应用对系统资源使用的特点•常见的性能分析工具介绍•性能分析及优化的案例性能相关的各个环节•硬件资源•操作系统•服务器软件•开发平台/中间件软件/框架软件•应用程序性能相关的-硬件资源•CPU•内存•存储系统•带宽性能相关的-硬件资源•CPU–是否使用SMP–单颗CPU的性能对依赖CPU的某些应用的影响很严重,比如数据库的查询处理性能相关的-硬件资源•内存–物理内存物理内存不够时会使用交换内存–交换内存使用交换内存会带来磁盘IO和CPU的开销增加性能相关的-硬件资源•存储系统–SCSI磁盘–ATA/SATA磁盘–RAID磁盘阵列(RAID0,RAID1,RAID5,RAID0+1)–一些经验1.小文件读写的性能瓶颈是磁盘的寻址(随机读写性能更差),评估的标准是tps2.大文件读写的性能瓶颈是带宽,评估的标准是持续的读写速度3.Linux可以利用空闲内存作文件系统访问的cache,因此系统内存越大存储系统的性能也越好性能相关的-硬件资源•带宽–网络带宽–SCSI总线带宽•大文件访问时SCSI的带宽瓶颈–系统总线带宽性能相关的-操作系统•SMP性能•VM性能•IO性能(存储设备、网络设备、异步IO)•文件系统性能(大文件优化、小文件优化、写优化、读优化、网络文件系统)•多线程性能开始第4个话题•性能分析的目的•性能分析相关的人•性能相关的各个环节系统使用和优化的原则•典型应用对系统资源使用的特点•常见的性能分析工具介绍•性能分析及优化的案例系统使用和优化的原则•对资源的使用状况作长期的监控和数据收集–Snmp+MRTG–Sar•程序的优化和系统结构的优化比硬件的性能优化更有效•避免不受限制的使用系统资源–设置各项服务对资源的使用限额,如Apache,MySQL,PHP等系统使用和优化的原则•始终保留一定量的空闲资源–多少合适?根据应用的特点,比如是否有突发性使用增长?–日常情况下,保留至少60%的系统资源,以应付突发使用增长。–日常情况下,资源使用率达到80%时,你必须有所行动了,尤其是web应用。•系统硬件达到合理的配置(以适合应用的特点为依据,资源消耗均衡为目标)–系统性能的水桶理论系统使用和优化的原则•应用软件对资源的使用要均衡(理想目标)–怎么样就算是均衡了?我也在摸索中……–理想状况为:CPU消耗到50%的时候,磁盘的带宽也到50%,磁盘的tps也到50%,内存使用也到50%(除去可以提供给cache的内存)开始第5个话题•性能分析的目的•性能分析相关的人•性能相关的各个环节•系统使用和优化的原则典型应用对系统资源使用的特点•常见的性能分析工具介绍•性能分析及优化的案例典型应用对系统资源使用的特点•声明这部分内容主要是本人在网站工作多年的一些实践经验积累,所以这些经验并不完全适用于其他的应用环境。在我的经验中,大多数的硬件性能问题主要和CPU、磁盘、内存相关,还没有遇到因为开发语言的运行效率对整个应用的性能造成影响,而应用程序设计的缺陷和数据库查询的滥用反倒是最最常见的性能问题。需要注意的是,大多数情况下,虽然性能瓶颈的起因是程序性能差或者是内存不足或者是磁盘瓶颈等各种原因,但最终表现出的结果就是CPU耗尽,系统负载极高,响应迟缓,甚至暂时失去响应,因此我们观察服务器状况时,最先看的就是系统负载和CPU空闲度。典型应用对系统资源使用的特点•动态内容为主的Web应用•静态内容为主的Web应用(如SquidCache)•数据库应用•软件下载•流媒体服务典型应用对系统资源使用的特点•动态内容为主的Web应用–频繁执行程序,如Perl,PHP,Java等,消耗CPU严重–提供并发用户访问,因此系统进程数多,消耗内存多,当内存不足时,使用交换内存也会增加CPU的开销–磁盘的写IO比较频繁(主要为随机写),比如生成cache文件,更新session文件等。–内存充足时读取的内容可以被cache住,cache的命中率和文件更新的频繁程度成反比,磁盘的读IO相对较小典型应用对系统资源使用的特点•静态内容为主的Web应用(如SquidCache)–网络带宽瓶颈–小文件的随机读取频繁,内存充足时可以缓解磁盘随机读的压力–系统内存不足时磁盘IO量会比较大(读、写、交换内存),因此增加CPU的开销典型应用对系统资源使用的特点•数据库应用–数据库查询语句复杂,大量的where子句,orderby,groupby排序等,CPU容易出现瓶颈–表太大时,查询遍历全表造成磁盘读的IO量大,容易出现读IO等待的情况–数据更新量大或者更新频繁时,造成磁盘写的IO量大–内存不足时频繁使用交换内存典型应用对系统资源使用的特点•软件下载–网络带宽瓶颈–存储系统带宽瓶颈(读)•流媒体服务–网络带宽瓶颈–存储系统带宽瓶颈(读)开始第6个话题•性能分析的目的•性能分析相关的人•性能相关的各个环节•系统使用和优化的原则•典型应用对系统资源使用的特点常见的性能分析工具介绍•性能分析及优化的案例常见的性能分析工具介绍•Vmstat•Top•Free•Uptime•sysstat工具包•Iozone•Strace希望看完以上工具的使用说明,让你能够知道如何判断系统瓶颈在那里、内存是否够用、CPU是否够用、磁盘IO是否够用、网络和磁盘带宽是否够用等问题。工具介绍-vmstatvmstat是一个很全面的性能分析工具,可以观察到系统的进程状态、内存使用、虚拟内存使用、磁盘的IO、中断、上下问切换、CPU使用等。系统性能分析工具中,我使用最多的是这个,除了sysstat工具包外,这个工具能查看的系统资源最多。对于Linux的性能分析,100%理解vmstat输出内容的含义,那你对系统性能分析的能力就算是基本掌握了。我这里主要说明一下这个命令显示出的部分数据代表的含义,和它反映出系统相关资源的状况。输出内容共有6类,分别说明如下。工具介绍-vmstat•Vmstat的输出格式如下(CentOS3.3)工具介绍-vmstat•Procs–r:运行的和等待(CPU时间片)运行的进程数,这个值也可以判断是否需要增加CPU(长期大于1)–b:处于不可中断状态的进程数,常见的情况是由IO引起的工具介绍-vmstat•Memory–swpd:切换到交换内存上的内存(默认以KB为单位)•如果swpd的值不为0,或者还比较大,比如超过100M了,但是si,so的值长期为0,这种情况我们可以不用担心,不会影响系统性能。–free:空闲的物理内存–buff:作为buffercache的内存,对块设备的读写进行缓冲–cache:作为pagecache的内存,文件系统的cache•如果cache的值大的时候,说明cache住的文件数多,如果频繁访问到的文件都能被cache住,那么磁盘的读IObi会非常小。工具介绍-vmstat•Swap–si:交换内存使用,由磁盘调入内存–so:交换内存使用,由内存调入磁盘内存够用的时候,这2个值都是0,如果这2个值长期大于0时,系统性能会受到影响。磁盘IO和CPU资源都会被消耗。我发现有些朋友看到空闲内存(free)很少或接近于0时,就认为内存不够用了,实际上不能光看这一点的,还要结合si,so,如果free很少,但是si,so也很少(大多时候是0),那么不用担心,系统性能这时不会受到影响的。工具介绍-vmstat•Io–bi:从块设备读入的数据总量(读磁盘)(KB/s),–bo:写入到块设备的数据总理(写磁盘)(KB/s)随机磁盘读写的时候,这2个值越大(如超出1M),能看到CPU在IO等待的值也会越大工具介绍-vmstat•System–in:每秒产生的中断次数–cs:每秒产生的上下文切换次数上面这2个值越大,会看到由内核消耗的CPU时间会越多工具介绍-vmstat•Cpu–us:用户进程消耗的CPU时间百分比•us的值比较高时,说明用户进程消耗的CPU时间多,但是如果长期超过50%的使用,那么我们就该考虑优化程序算法或者进行加速了(比如PHP/Perl)–sy:内核进程消耗的CPU时间百分比•sy的值高时,说明系统内核消耗的CPU资源多,这并不是良性的表现,我们应该检查原因。–wa:IO等待消耗的CPU时间百分比•wa的值高时,说明IO等待比较严重,这可能是由于磁盘大量作随机访问造成,也有可能是磁盘的带宽出现瓶颈(块操作)。–id:CPU处在空闲状态时间百分比工具介绍-vmstat•情景分析这个vmstat的输出那些信息值得关注?–Procsr:运行的进程比较多,系统很繁忙–Iobo:磁盘写的数据量稍大,如果是大文件的写,10M以内基本不用担心,如果是小文件写2M以内基本正常–Cpuus:持续大于50,服务高峰期可以接受–Cpuwa:稍微有些高–Cpuid:持续小于50,服务高峰期可以接受工具介绍-top这个命令可以查看系统中运行的进程的状况,CPU使用状况,系统负载,内存使用等。它是检查系统进程运行状况最方便的工具了,它默认显示部分活动的进程,并且按照进程使用CPU的多少排序。它可以显示全部CPU的使用状况,也可以显示每个进程都运行在那个CPU上面。我习惯使用这个命令查看那