系统性能分析和优化.ppt

2,026 views

Published on

0 Comments
6 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
2,026
On SlideShare
0
From Embeds
0
Number of Embeds
6
Actions
Shares
0
Downloads
105
Comments
0
Likes
6
Embeds 0
No embeds

No notes for slide

系统性能分析和优化.ppt

  1. 1. 系统性能分析和优化
  2. 2. 前言 <ul><li>很高兴能有这样的机会,把我自己多年工作中对服务器硬件、软件方面的性能分析的经验和体会,以及性能优化的经验和各位朋友做一次分享。 </li></ul><ul><li>这份 ppt 的内容组织大致是这样的,通过对系统中和性能相关的各个环节的介绍,使大家知道出现性能问题时可以从那些方面入手去查,而分析典型应用对系统资源使用的特点,让大家对应用和系统资源的依赖有了更直观的认识,然后我会介绍常见的分析及监控系统资源时使用的工具,这个环节应该是最主要的,最后我会举一个实际发生过的系统性能瓶颈分析和优化的案例,作为一个实践和总结。 </li></ul><ul><li>本文涉及的内容基于 Gnu/Linux 系统平台,但关于性能优化分析和优化的思路也能适用于其他系统平台。 </li></ul>
  3. 3. 我们将会讨论下列 7 个话题 <ul><li>性能分析的目的 </li></ul><ul><li>性能分析相关的人 </li></ul><ul><li>性能相关的各个环节 </li></ul><ul><li>系统使用和优化的原则 </li></ul><ul><li>典型应用对系统资源使用的特点 </li></ul><ul><li>常见的性能分析工具介绍 </li></ul><ul><li>性能分析及优化的案例 </li></ul>
  4. 4. 开始第 1 个话题 <ul><li>性能分析的目的 </li></ul><ul><li>性能分析相关的人 </li></ul><ul><li>性能相关的各个环节 </li></ul><ul><li>系统使用和优化的原则 </li></ul><ul><li>典型应用对系统资源使用的特点 </li></ul><ul><li>常见的性能分析工具介绍 </li></ul><ul><li>性能分析及优化的案例 </li></ul>
  5. 5. 性能分析的目的 <ul><li>找出系统性能瓶颈 </li></ul><ul><ul><li>硬件瓶颈 </li></ul></ul><ul><ul><li>软件瓶颈 </li></ul></ul><ul><li>提供性能优化方案 </li></ul><ul><ul><li>升级硬件 </li></ul></ul><ul><ul><li>改进系统结构 </li></ul></ul><ul><li>达到合理的硬件和软件配置 </li></ul><ul><li>使系统资源使用达到平衡 </li></ul>
  6. 6. 性能分析的目的 <ul><li>但遗憾的是 </li></ul><ul><li>解决一个性能瓶颈,往往又会出现另外的瓶颈或者其他问题,所以性能优化更加切实的目标是做到在一定范围内使系统的各项资源使用趋向合理和保持一定的平衡。 </li></ul><ul><li>系统运行良好的时候恰恰也是各项资源达到了一个平衡体,任何一项资源的过渡使用都会造成平衡体系破坏,从而造成系统负载极高或者响应迟缓。比如 CPU 过渡使用会造成大量进程等待 CPU 资源,系统响应变慢,等待会造成进程数增加,进程增加又会造成内存使用增加,内存耗尽又会造成虚拟内存使用,使用虚拟内存又会造成磁盘 IO 增加和 CPU 开销增加(用于进程切换、缺页处理的 CPU 开销) </li></ul>
  7. 7. 开始第 2 个话题 <ul><li>性能分析的目的 </li></ul><ul><li>性能分析相关的人 </li></ul><ul><li>性能相关的各个环节 </li></ul><ul><li>系统使用和优化的原则 </li></ul><ul><li>典型应用对系统资源使用的特点 </li></ul><ul><li>常见的性能分析工具介绍 </li></ul><ul><li>性能分析及优化的案例 </li></ul>
  8. 8. 性能分析相关的人 <ul><li>系统管理员 </li></ul><ul><li>大型应用的系统结构设计人员 </li></ul><ul><li>软件开发人员 </li></ul>
  9. 9. 性能分析相关的人 <ul><li>系统管理员 </li></ul><ul><ul><li>掌握系统运行状况 ( 负载 ) </li></ul></ul><ul><ul><li>掌握系统资源使用情况 ( 硬件 ) </li></ul></ul><ul><ul><li>掌握应用程序对资源的使用情况 ( 应用程序执行效率,反馈给应用开发人员 ) </li></ul></ul><ul><ul><li>有针对性的开展服务器性能优化 ( 硬件、软件、软件配置 ) </li></ul></ul>
  10. 10. 性能分析相关的人 <ul><li>系统架构设计人员 </li></ul><ul><ul><li>了解程序执行效率 </li></ul></ul><ul><ul><li>了解系统架构中的性能瓶颈,优化系统结构 </li></ul></ul><ul><ul><li>设计更好的应用系统架构 </li></ul></ul>
  11. 11. 性能分析相关的人 <ul><li>软件开发人员 </li></ul><ul><ul><li>了解程序执行效率 </li></ul></ul><ul><ul><li>改进程序逻辑、改进性能 </li></ul></ul>
  12. 12. 开始第 3 个话题 <ul><li>性能分析的目的 </li></ul><ul><li>性能分析相关的人 </li></ul><ul><li>性能相关的各个环节 </li></ul><ul><li>系统使用和优化的原则 </li></ul><ul><li>典型应用对系统资源使用的特点 </li></ul><ul><li>常见的性能分析工具介绍 </li></ul><ul><li>性能分析及优化的案例 </li></ul>
  13. 13. 性能相关的各个环节 <ul><li>硬件资源 </li></ul><ul><li>操作系统 </li></ul><ul><li>服务器软件 </li></ul><ul><li>开发平台 / 中间件软件 / 框架软件 </li></ul><ul><li>应用程序 </li></ul>
  14. 14. 性能相关的 - 硬件资源 <ul><li>CPU </li></ul><ul><li>内存 </li></ul><ul><li>存储系统 </li></ul><ul><li>带宽 </li></ul>
  15. 15. 性能相关的 - 硬件资源 <ul><li>CPU </li></ul><ul><ul><li>是否使用 SMP </li></ul></ul><ul><ul><li>单颗 CPU 的性能对依赖 CPU 的某些应用的影响很严重,比如数据库的查询处理 </li></ul></ul>
  16. 16. 性能相关的 - 硬件资源 <ul><li>内存 </li></ul><ul><ul><li>物理内存 </li></ul></ul><ul><li>物理内存不够时会使用交换内存 </li></ul><ul><ul><li>交换内存 </li></ul></ul><ul><ul><li>使用交换内存会带来磁盘 IO 和 CPU 的开销增加 </li></ul></ul>
  17. 17. 性能相关的 - 硬件资源 <ul><li>存储系统 </li></ul><ul><ul><li>SCSI 磁盘 </li></ul></ul><ul><ul><li>ATA/SATA 磁盘 </li></ul></ul><ul><ul><li>RAID 磁盘阵列 (RAID0, RAID1, RAID5, RAID0+1) </li></ul></ul><ul><ul><li>一些经验 </li></ul></ul><ul><ul><ul><li>小文件读写的性能瓶颈是磁盘的寻址(随机读写性能更差),评估的标准是 tps </li></ul></ul></ul><ul><ul><ul><li>大文件读写的性能瓶颈是带宽,评估的标准是持续的读写速度 </li></ul></ul></ul><ul><ul><ul><li>Linux 可以利用空闲内存作文件系统访问的 cache ,因此系统内存越大存储系统的性能也越好 </li></ul></ul></ul>
  18. 18. 性能相关的 - 硬件资源 <ul><li>带宽 </li></ul><ul><ul><li>网络带宽 </li></ul></ul><ul><ul><li>SCSI 总线带宽 </li></ul></ul><ul><ul><ul><li>大文件访问时 SCSI 的带宽瓶颈 </li></ul></ul></ul><ul><ul><li>系统总线带宽 </li></ul></ul>
  19. 19. 性能相关的 - 操作系统 <ul><li>SMP 性能 </li></ul><ul><li>VM 性能 </li></ul><ul><li>IO 性能 ( 存储设备、网络设备、异步 IO) </li></ul><ul><li>文件系统性能 ( 大文件优化、小文件优化、写优化、读优化、网络文件系统 ) </li></ul><ul><li>多线程性能 </li></ul>
  20. 20. 开始第 4 个话题 <ul><li>性能分析的目的 </li></ul><ul><li>性能分析相关的人 </li></ul><ul><li>性能相关的各个环节 </li></ul><ul><li>系统使用和优化的原则 </li></ul><ul><li>典型应用对系统资源使用的特点 </li></ul><ul><li>常见的性能分析工具介绍 </li></ul><ul><li>性能分析及优化的案例 </li></ul>
  21. 21. 系统使用和优化的原则 <ul><li>对资源的使用状况作长期的监控和数据收集 </li></ul><ul><ul><li>Snmp+MRTG </li></ul></ul><ul><ul><li>Sar </li></ul></ul><ul><li>程序的优化和系统结构的优化比硬件的性能优化更有效 </li></ul><ul><li>避免不受限制的使用系统资源 </li></ul><ul><ul><li>设置各项服务对资源的使用限额,如 Apache, MySQL,PHP 等 </li></ul></ul>
  22. 22. 系统使用和优化的原则 <ul><li>始终保留一定量的空闲资源 </li></ul><ul><ul><li>多少合适?根据应用的特点,比如是否有突发性使用增长? </li></ul></ul><ul><ul><li>日常情况下,保留至少 60% 的系统资源,以应付突发使用增长。 </li></ul></ul><ul><ul><li>日常情况下,资源使用率达到 80% 时,你必须有所行动了,尤其是 web 应用。 </li></ul></ul><ul><li>系统硬件达到合理的配置(以适合应用的特点为依据,资源消耗均衡为目标) </li></ul><ul><ul><li>系统性能的水桶理论 </li></ul></ul>
  23. 23. 系统使用和优化的原则 <ul><li>应用软件对资源的使用要均衡(理想目标) </li></ul><ul><ul><li>怎么样就算是均衡了?我也在摸索中…… </li></ul></ul><ul><ul><li>理想状况为: CPU 消耗到 50% 的时候,磁盘的带宽也到 50% ,磁盘的 tps 也到 50% ,内存使用也到 50%( 除去可以提供给 cache 的内存 ) </li></ul></ul>
  24. 24. 开始第 5 个话题 <ul><li>性能分析的目的 </li></ul><ul><li>性能分析相关的人 </li></ul><ul><li>性能相关的各个环节 </li></ul><ul><li>系统使用和优化的原则 </li></ul><ul><li>典型应用对系统资源使用的特点 </li></ul><ul><li>常见的性能分析工具介绍 </li></ul><ul><li>性能分析及优化的案例 </li></ul>
  25. 25. 典型应用对系统资源使用的特点 <ul><li>声明 </li></ul><ul><li>这部分内容主要是本人在网站工作多年的一些实践经验积累, 所以这些经验并不完全适用于其他的应用环境。 </li></ul><ul><li>在我的经验中,大多数的硬件性能问题主要和 CPU 、磁盘、内存相关, 还没有遇到因为开发语言的运行效率对整个应用的性能造成影响,而应用程序设计的缺陷和数据库查询的滥用反倒是最最常见的性能问题。 </li></ul><ul><li>需要注意的是,大多数情况下,虽然性能瓶颈的起因是程序性能差或者是内存不足或者是磁盘瓶颈等各种原因,但最终表现出的结果就是 CPU 耗尽,系统负载极高,响应迟缓,甚至暂时失去响应,因此我们观察服务器状况时,最先看的就是系统负载和 CPU 空闲度。 </li></ul>
  26. 26. 典型应用对系统资源使用的特点 <ul><li>动态内容为主的 Web 应用 </li></ul><ul><li>静态内容为主的 Web 应用 ( 如 Squid Cache) </li></ul><ul><li>数据库应用 </li></ul><ul><li>软件下载 </li></ul><ul><li>流媒体服务 </li></ul>
  27. 27. 典型应用对系统资源使用的特点 <ul><li>动态内容为主的 Web 应用 </li></ul><ul><ul><li>频繁执行程序,如 Perl, PHP, Java 等,消耗 CPU 严重 </li></ul></ul><ul><ul><li>提供并发用户访问,因此系统进程数多,消耗内存多,当内存不足时,使用交换内存也会增加 CPU 的开销 </li></ul></ul><ul><ul><li>磁盘的写 IO 比较频繁(主要为随机写),比如生成 cache 文件,更新 session 文件等。 </li></ul></ul><ul><ul><li>内存充足时读取的内容可以被 cache 住, cache 的命中率和文件更新的频繁程度成反比,磁盘的读 IO 相对较小 </li></ul></ul>
  28. 28. 典型应用对系统资源使用的特点 <ul><li>静态内容为主的 Web 应用 ( 如 Squid Cache) </li></ul><ul><ul><li>网络带宽瓶颈 </li></ul></ul><ul><ul><li>小文件的随机读取频繁,内存充足时可以缓解磁盘随机读的压力 </li></ul></ul><ul><ul><li>系统内存不足时磁盘 IO 量会比较大(读、写、交换内存),因此增加 CPU 的开销 </li></ul></ul>
  29. 29. 典型应用对系统资源使用的特点 <ul><li>数据库应用 </li></ul><ul><ul><li>数据库查询语句复杂,大量的 where 子句, order by, group by 排序等, CPU 容易出现瓶颈 </li></ul></ul><ul><ul><li>表太大时,查询遍历全表造成磁盘读的 IO 量大,容易出现读 IO 等待的情况 </li></ul></ul><ul><ul><li>数据更新量大或者更新频繁时,造成磁盘写的 IO 量大 </li></ul></ul><ul><ul><li>内存不足时频繁使用交换内存 </li></ul></ul>
  30. 30. 典型应用对系统资源使用的特点 <ul><li>软件下载 </li></ul><ul><ul><li>网络带宽瓶颈 </li></ul></ul><ul><ul><li>存储系统带宽瓶颈 ( 读 ) </li></ul></ul><ul><li>流媒体服务 </li></ul><ul><ul><li>网络带宽瓶颈 </li></ul></ul><ul><ul><li>存储系统带宽瓶颈 ( 读 ) </li></ul></ul>
  31. 31. 开始第 6 个话题 <ul><li>性能分析的目的 </li></ul><ul><li>性能分析相关的人 </li></ul><ul><li>性能相关的各个环节 </li></ul><ul><li>系统使用和优化的原则 </li></ul><ul><li>典型应用对系统资源使用的特点 </li></ul><ul><li>常见的性能分析工具介绍 </li></ul><ul><li>性能分析及优化的案例 </li></ul>
  32. 32. 常见的性能分析工具介绍 <ul><li>Vmstat </li></ul><ul><li>Top </li></ul><ul><li>Free </li></ul><ul><li>Uptime </li></ul><ul><li>sysstat 工具包 </li></ul><ul><li>Iozone </li></ul><ul><li>Strace </li></ul><ul><li>希望看完以上工具的使用说明,让你能够知道如何判断系统瓶颈在那里、内存是否够用、 CPU 是否够用、磁盘 IO 是否够用、网络和磁盘带宽是否够用等问题。 </li></ul>
  33. 33. 工具介绍 -vmstat <ul><li>vmstat 是一个很全面的性能分析工具,可以观察到系统的进程状态、内存使用、虚拟内存使用、磁盘的 IO 、中断、上下问切换、 CPU 使用等。系统性能分析工具中,我使用最多的是这个,除了 sysstat 工具包外,这个工具能查看的系统资源最多。 </li></ul><ul><li>对于 Linux 的性能分析, 100% 理解 vmstat 输出内容的含义,那你对系统性能分析的能力就算是基本掌握了。 </li></ul><ul><li>我这里主要说明一下这个命令显示出的部分数据代表的含义,和它反映出系统相关资源的状况。输出内容共有 6 类,分别说明如下。 </li></ul>
  34. 34. 工具介绍 -vmstat <ul><li>Vmstat 的输出格式如下 (CentOS 3.3) </li></ul>
  35. 35. 工具介绍 -vmstat <ul><li>Procs </li></ul><ul><ul><li>r: </li></ul></ul><ul><ul><li>运行的和等待 (CPU 时间片 ) 运行的进程数,这个值也可以判断是否需要增加 CPU( 长期大于 1) </li></ul></ul><ul><ul><li>b: </li></ul></ul><ul><ul><li>处于不可中断状态的进程数,常见的情况是由 IO 引起的 </li></ul></ul>
  36. 36. 工具介绍 -vmstat <ul><li>Memory </li></ul><ul><ul><li>swpd: 切换到交换内存上的内存 ( 默认以 KB 为单位 ) </li></ul></ul><ul><ul><ul><li>如果 swpd 的值不为 0 ,或者还比较大,比如超过 100M 了,但是 si, so 的值长期为 0 ,这种情况我们可以不用担心,不会影响系统性能。 </li></ul></ul></ul><ul><ul><li>free: 空闲的物理内存 </li></ul></ul><ul><ul><li>buff: 作为 buffer cache 的内存,对块设备的读写进行缓冲 </li></ul></ul><ul><ul><li>cache: 作为 page cache 的内存 , 文件系统的 cache </li></ul></ul><ul><ul><ul><li>如果 cache 的值大的时候,说明 cache 住的文件数多,如果频繁访问到的文件都能被 cache 住,那么磁盘的读 IO bi 会非常小。 </li></ul></ul></ul>
  37. 37. 工具介绍 -vmstat <ul><li>Swap </li></ul><ul><ul><li>si: 交换内存使用,由磁盘调入内存 </li></ul></ul><ul><ul><li>so: 交换内存使用,由内存调入磁盘 </li></ul></ul><ul><ul><li>内存够用的时候,这 2 个值都是 0 ,如果这 2 个值长期大于 0 时,系统性能会受到影响。磁盘 IO 和 CPU 资源都会被消耗。 </li></ul></ul><ul><ul><li>我发现有些朋友看到空闲内存 (free) 很少或接近于 0 时,就认为内存不够用了,实际上不能光看这一点的,还要结合 si,so ,如果 free 很少,但是 si,so 也很少 ( 大多时候是 0) ,那么不用担心,系统性能这时不会受到影响的。 </li></ul></ul>
  38. 38. 工具介绍 -vmstat <ul><li>Io </li></ul><ul><ul><li>bi: 从块设备读入的数据总量 ( 读磁盘 ) (KB/s) , </li></ul></ul><ul><ul><li>bo: 写入到块设备的数据总理 ( 写磁盘 ) (KB/s) </li></ul></ul><ul><ul><li>随机磁盘读写的时候,这 2 个 值越大(如超出 1M ),能看到 CPU 在 IO 等待的值也会越大 </li></ul></ul>
  39. 39. 工具介绍 -vmstat <ul><li>System </li></ul><ul><ul><li>in: 每秒产生的中断次数 </li></ul></ul><ul><ul><li>cs: 每秒产生的上下文切换次数 </li></ul></ul><ul><ul><li>上面这 2 个值越大,会看到由内核消耗的 CPU 时间会越多 </li></ul></ul>
  40. 40. 工具介绍 -vmstat <ul><li>Cpu </li></ul><ul><ul><li>us: 用户进程消耗的 CPU 时间百分比 </li></ul></ul><ul><ul><ul><li>us 的值比较高时,说明用户进程消耗的 CPU 时间多,但是如果长期超过 50% 的使用,那么我们就该考虑优化程序算法或者进行加速了 ( 比如 PHP/Perl) </li></ul></ul></ul><ul><ul><li>sy: 内核进程消耗的 CPU 时间百分比 </li></ul></ul><ul><ul><ul><li>sy 的值高时,说明系统内核消耗的 CPU 资源多,这并不是良性的表现,我们应该检查原因。 </li></ul></ul></ul><ul><ul><li>wa: IO 等待消耗的 CPU 时间百分比 </li></ul></ul><ul><ul><ul><li>wa 的值高时,说明 IO 等待比较严重,这可能是由于磁盘大量作随机访问造成,也有可能是磁盘的带宽出现瓶颈 ( 块操作 ) 。 </li></ul></ul></ul><ul><ul><li>id: CPU 处在空闲状态时间百分比 </li></ul></ul>
  41. 41. 工具介绍 -vmstat <ul><li>情景分析 </li></ul><ul><li>这个 vmstat 的输出那些信息值得关注? </li></ul><ul><ul><li>Procs r: 运行的进程比较多,系统很繁忙 </li></ul></ul><ul><ul><li>Io bo: 磁盘写的数据量稍大,如果是大文件的写, 10M 以内基本不用担心,如果是小文件写 2M 以内基本正常 </li></ul></ul><ul><ul><li>Cpu us: 持续大于 50 ,服务高峰期可以接受 </li></ul></ul><ul><ul><li>Cpu wa: 稍微有些高 </li></ul></ul><ul><ul><li>Cpu id: 持续小于 50 ,服务高峰期可以接受 </li></ul></ul>
  42. 42. 工具介绍 -top <ul><li>这个命令可以查看系统中运行的进程的状况, CPU 使用状况,系统负载,内存使用等。它是检查系统进程运行状况最方便的工具了,它默认显示部分活动的进程,并且按照进程使用 CPU 的多少排序。它可以显示全部 CPU 的使用状况,也可以显示每个进程都运行在那个 CPU 上面。 </li></ul><ul><li>我习惯使用这个命令查看那些进程或者那类进程占用 CPU 和内存资源最多,以此迅速定位存在性能问题的进程,以及运行异常的进程。 </li></ul>
  43. 43. 工具介绍 -top <ul><li>Top 命令的输出 1 (CentOS 3.3) </li></ul>
  44. 44. 工具介绍 -top <ul><li>Top 命令的输出 2 (CentOS 3.3) </li></ul>
  45. 45. 工具介绍 -top <ul><li>用 top 看到的内存的说明 (Mem 的第 2 行 ) </li></ul><ul><ul><li>actv </li></ul></ul><ul><ul><li>active 活跃的内存页,正在映射给进程使用 </li></ul></ul><ul><ul><li>in_d </li></ul></ul><ul><ul><li>inactive_dirty 非活跃的内存页,并且内存数据被修改,需要写回磁盘 </li></ul></ul><ul><ul><li>in_c </li></ul></ul><ul><ul><li>inactive_clean 非活跃的内存页,干净的数据,可以被重新分配使用 </li></ul></ul>
  46. 46. 工具介绍 -top <ul><li>问题? </li></ul><ul><li>in_d 和 in_c 以及 cache, buffer 的内存有何不同? </li></ul><ul><li>我的理解: </li></ul><ul><li>actv, in_d, in_c 是 VM 中对内存的管理组织形式, buffer 是块设备读写缓冲, cache 是文件系统缓存 </li></ul>
  47. 47. 工具介绍 -top <ul><li>用 top 看到的进程所处的几种状态 (STAT 列 ) 。 </li></ul><ul><ul><li>D 不可中断休眠,通常是 IO 操作所处的状态 </li></ul></ul><ul><ul><li>R 正在执行的或者处在等待执行的进程队列中 </li></ul></ul><ul><ul><li>S 休眠中 </li></ul></ul><ul><ul><li>T 暂停刮起的(比如 Ctrl+Z ),也可能是被 strace 命令调用中的状态 </li></ul></ul><ul><ul><li>Z 僵尸进程,进程执行完成,但由于其父进程没有销毁该进程,而被 init 进程接管进行销毁。 </li></ul></ul><ul><ul><li>W 没有使用物理内存,所占用的物理内存被切换到交换内存 </li></ul></ul><ul><ul><li>< 高优先级的进程 </li></ul></ul><ul><ul><li>N 低优先级 </li></ul></ul><ul><ul><li>有时候一个进程会有多个状态的标志,比如 SWN , SW </li></ul></ul>
  48. 48. 工具介绍 -top <ul><li>情景分析 </li></ul><ul><li>前面两次 top 的输出那些信息值得关注? </li></ul><ul><ul><li>图 1) </li></ul></ul><ul><ul><ul><li>Load average: 系统负载有降低的趋势,但仍然较高 </li></ul></ul></ul><ul><ul><ul><li>Running: 有 3 个进程正在运行,正常,因为系统有 4 颗 CPU </li></ul></ul></ul><ul><ul><ul><li>Cpu user: 接近 200% 了,有些大,服务高峰时可以接受 </li></ul></ul></ul><ul><ul><ul><li>Cpu idle: 小于 200% 了,需要注意 </li></ul></ul></ul><ul><ul><li>图 2) </li></ul></ul><ul><ul><li>Cpu iowait: 接近 200% 了,很大 </li></ul></ul>
  49. 49. 工具介绍 -free <ul><li>free 命令显示系统内存的使用状况(物理内存和交换内存) </li></ul><ul><li>通过这个命令我们可以看到系统进程实际使用的物理内存, buffer 和 cache 使用的物理内存 </li></ul>
  50. 50. 工具介绍 -free <ul><li>free 命令输出的第二行 (Mem) </li></ul><ul><li>这行分别显示了物理内存的总量 (total) 、已使用的 (used) 、空闲的 (free) 、共享的 (shared) 、 buffer 、 cache 的内存。 </li></ul>
  51. 51. 工具介绍 -free <ul><li>free 命令输出的第三行 (-/+ buffers/cache) </li></ul><ul><li>这行最容易让人迷惑。 </li></ul><ul><li>它显示的第一个值( used 这一列)是这样得来的: </li></ul><ul><li>Mem 行 used 列 - Mem 行 buffers 列 - Mem 行 cached 列 </li></ul><ul><li>它显示的第二个值( free 这一列)是这样得来的: </li></ul><ul><li>Mem 行 free 列 + Mem 行 buffers 列 + Mem 行 cached 列 </li></ul>
  52. 52. 工具介绍 -free <ul><li>free 命令输出的第四行 (Swap) </li></ul><ul><li>这行显示交换内存的总量、已使用量、空闲量 </li></ul><ul><li>通常 buffer 和 cache 可以使用的内存空间越大,系统 IO 和 文件系统访问的性能越好。 </li></ul>
  53. 53. 工具介绍 -uptime <ul><li>最简便的查看系统负载的工具,系统负载越小,系统运行状况越好,对于系统负载处在什么范围内比较合适,我想是没有定论的,我介绍一下我的习惯。 </li></ul><ul><li>我一般以 15 分钟负载的值来评估系统的健康度,以 10 为这个值的临界点,如果系统负载持续高于 10 ,通常是存在某个资源长期紧张的原因,我们需要重视,并且得开始着手解决这个问题了。 </li></ul><ul><li>如果偶尔高于 10 ,应该开始留意它出现的频度,这往往是前面一种状况的先兆。 </li></ul>
  54. 54. 工具介绍 - sysstat 工具包 <ul><li>这个工具包提供了著名的 sar 命令,还有非常实用的 iostat, mpstat, sa1, sa2 等命令。 </li></ul><ul><li>这几个命令可实现前面提及工具大多数的功能,除此之外,还能查看系统的网络带宽状况、每块磁盘使用状况、每个磁盘分区的使用状况等。 </li></ul>
  55. 55. 工具介绍 - sysstat 工具包 <ul><li>sa1, sa2 这 2 个命令以配置在 cron 中定期执行,把系统当时的运行状况信息保存在磁盘上,每日存在一个文件中,因为有这个功能,因此 sar 工具不单是一个性能分析的工具,这 2 个命令的使用说明如下: </li></ul><ul><li>sa1 配置在 cron 中可以实现系统状态收集,比如 10 分钟运行一次 </li></ul><ul><li>sa2 配置在 cron 中可以实现每日状态的汇总报告 </li></ul><ul><li>你可以在系统 crontab 中添加如下配置: </li></ul><ul><li>*/10 * * * * root /usr/lib/sa/sa1 1 1 </li></ul><ul><li>53 23 * * * root /usr/lib/sa/sa2 -A </li></ul>
  56. 56. 工具介绍 - 其他 <ul><li>Iozone </li></ul><ul><li>IO 和文件系统性能测试的工具,我也习惯用它作存储系统的性能分析。 </li></ul><ul><li>Strace </li></ul><ul><li>如果我们知道一个程序执行效率很差,需要分析这个程序执行时的某个阶段或者某个系统调用的性能状况,可以使用 strace 命令。 </li></ul><ul><li>其他 </li></ul>
  57. 57. 开始第 7 个话题 <ul><li>性能分析的目的 </li></ul><ul><li>性能分析相关的人 </li></ul><ul><li>性能相关的各个环节 </li></ul><ul><li>系统使用和优化的原则 </li></ul><ul><li>典型应用对系统资源使用的特点 </li></ul><ul><li>常见的性能分析工具介绍 </li></ul><ul><li>性能分析及优化的案例 </li></ul>
  58. 58. 性能分析及优化的案例 <ul><li>动态内容为主的网站 </li></ul><ul><li>动态内容 +Cache 为主的网站 </li></ul>
  59. 59. 动态内容为主的网站 <ul><li>该网站系统结构说明 </li></ul><ul><ul><li>1 台 Dell2650 服务器 , 单颗 Xeon 3.0G CPU , 1G 内存, 2 块 72G SCSI 磁盘 </li></ul></ul><ul><ul><li>操作系统 CentOS 3.3 </li></ul></ul><ul><ul><li>应用基于 LAMP 架构,所有服务都在一台服务器上 </li></ul></ul>
  60. 60. 动态内容为主的网站 <ul><li>分析和优化的过程 </li></ul><ul><ul><li>初期性能问题及处理 </li></ul></ul><ul><ul><li>第二次优化 </li></ul></ul><ul><ul><li>第三次优化 </li></ul></ul><ul><ul><li>第四次优化 </li></ul></ul><ul><ul><li>网站结构优化 </li></ul></ul>
  61. 61. 动态内容为主的网站 <ul><li>初期性能问题及处理 </li></ul><ul><ul><li>表现:早晨和下午访问高峰时,服务器频繁宕机,重启后的一段时间内能正常服务,过一会以后又变的响应缓慢,然后又宕机。 </li></ul></ul><ul><ul><li>检查:发现宕机前系统负载高, Apache httpd.conf 配置最大用户数为 1024 </li></ul></ul><ul><ul><li>处理:修改 httpd.conf 配置文件,降到最大 512 个用户数,仍然频繁宕机,又降到 256 个用户数,系统不宕机了,但是负载很高,站点访问极慢 </li></ul></ul>
  62. 62. 动态内容为主的网站 <ul><li>初次优化 </li></ul><ul><li>深入分析系统资源使用情况 (vmstat,top,ps) </li></ul><ul><ul><li>结论: CPU 资源时常耗尽,因此造成响应缓慢或者长时间没有响应,主要是用户进程消耗资源严重。 </li></ul></ul><ul><ul><li>原因: PHP 程序没有使用代码加速,网站首页是个 PHP 程序,每次用户访问都要多次查询数据库,其他程序也没有 Cache 机制,数据库查询负荷过高。 </li></ul></ul><ul><ul><li>处理:安装配置 turck-mmcache 代码加速器,改写网站首页以及部分频繁访问的程序增加 cache 机制,减少数据库访问。 </li></ul></ul>
  63. 63. 动态内容为主的网站 <ul><li>第二次优化 </li></ul><ul><li>一段时间后,系统又开始不稳定,访问高峰时站点无法正常访问 </li></ul><ul><ul><li>分析系统资源使用状况,发现仍然是 CPU 耗尽后引起问题,但这次系统 IO 等待消耗的 CPU 资源比较大。 </li></ul></ul><ul><ul><li>原因:上次解决了 CPU 资源容易耗尽的问题,目前网站访问量增加了, apache 进程数时常达到 256 个,导致内存使用殆尽,频繁使用交换内存,最终仍然导致 CPU 资源耗尽 </li></ul></ul><ul><ul><li>处理:把 Apache 配置中的 KeepAlive 特性关闭,进程数大量减少,基本保持在 80 个进程以内,还是会使用交换内存,但是服务正常了。 </li></ul></ul>
  64. 64. 动态内容为主的网站 <ul><li>第三次优化 </li></ul><ul><li>一段时间后,系统又开始不稳定,访问高峰时站点无法正常访问 </li></ul><ul><ul><li>分析发现还是 CPU 资源耗尽导致的原因。 </li></ul></ul><ul><ul><li>原因:程序频繁访问数据库,大量的 SQL 语句中有 where, order by 等子句,而大量的表没有建索引,导致 MySQL 数据库负荷过高,消耗 CPU 资源过高。 </li></ul></ul><ul><ul><li>处理:优化程序中的 SQL 语句, where 和 order by 子句上的字段建索引,程序增加 Cache 机制,再次使服务恢复正常。 </li></ul></ul>
  65. 65. 动态内容为主的网站 <ul><li>第四次优化 </li></ul><ul><li>一段时间后,系统又开始不稳定,访问高峰时站点无法正常访问 </li></ul><ul><ul><li>分析系统资源使用状况,发现还是 CPU 耗尽造成的 </li></ul></ul><ul><ul><li>原因:数据库查询过多,大部分都是复杂查询,时常需要遍历全表 </li></ul></ul><ul><ul><li>处理:优化程序中的 SQL 语句,增加 where 子句上的匹配条件,减少遍历全部的查询。 </li></ul></ul>
  66. 66. 动态内容为主的网站 <ul><li>网站结构优化 </li></ul><ul><ul><li>鉴于程序的优化空间越来越小,避免以后仍然出现问题,增加了一台专用数据库服务器 </li></ul></ul><ul><ul><li>在后来的使用过程中,又陆续增加了 1 台 Web 前端服务器,和一台只用于读的 MySQL 数据库服务器 </li></ul></ul>
  67. 67. 动态内容 +Cache 为主的网站 <ul><li>该网站系统结构说明 </li></ul><ul><ul><li>多台 Web 前端服务器 , 配置都为单颗 Xeon 3.0G CPU , 4G 内存, 2 块 73G SCSI 磁盘 </li></ul></ul><ul><ul><li>操作系统 CentOS 3.3 </li></ul></ul><ul><ul><li>多台 MySQL 数据库服务器 </li></ul></ul><ul><ul><li>基于 PHP 开发的应用 </li></ul></ul>
  68. 68. 动态内容 +Cache 为主的网站 <ul><li>该应用的特点 </li></ul><ul><ul><li>大量内容基于数据库,需要频繁访问数据库,并且数据更新很快 </li></ul></ul><ul><ul><li>采用页面 cache 机制缓解数据库压力,但页面 cache 只有 5 分钟有效期,需要频繁生成新的 cache </li></ul></ul><ul><ul><li>Cache 以文件形式存在磁盘上,都是小文件,最小不到 1k ,最大不超过 128k </li></ul></ul>
  69. 69. 动态内容 +Cache 为主的网站 <ul><li>问题描述 </li></ul><ul><ul><li>访问高峰期时 Web 前端负载比较高,时常超过 10 </li></ul></ul><ul><ul><li>访问高峰期时 Web 前端响应很慢 </li></ul></ul><ul><li>性能分析 </li></ul><ul><ul><li>负载比较高,时常会超过 10 , CPU Idel 经常会小于 30% ,有时 Idel 为 0 , CPU io wait 很大,经常超过 30% ,磁盘读每秒不超过 100k ,磁盘写每秒 1.5M 左右,磁盘 tps 超过 100 </li></ul></ul><ul><ul><li>访问高峰期时内存也有部分空闲,用于 buffer 和 cache 的内存基本占总内存 60% 以上,没有使用交换内存 </li></ul></ul>
  70. 70. 动态内容 +Cache 为主的网站 <ul><li>原因分析 </li></ul><ul><ul><li>分析该应用的特点后发现,访问高峰期时,要频繁生成新的 cache 文件,或者更新以及过期的 cache 文件, cache 文件目录为 256x256 的哈希结构,因此读写文件时磁盘随机寻址非常频繁 </li></ul></ul><ul><ul><li>该应用磁盘写远大于磁盘读的原因是系统 cache 命中率高,大量文件读过一次就 cache 住了,因此读的开销很小 </li></ul></ul><ul><ul><li>写磁盘的量并不算很大,平均每秒 1.5M ,但都是随机写,因此写磁盘速度会稍微慢,也因此会消耗大量 CPU 时间 </li></ul></ul><ul><ul><li>对比访问高峰期和访问量小时候的系统状态,磁盘写的 tps 提高了 1 倍以上, CPU io wait 提高了 3 倍以上,因此认为主要性能瓶颈在磁盘写上 </li></ul></ul>
  71. 71. 动态内容 +Cache 为主的网站 <ul><li>优化办法 </li></ul><ul><ul><li>减少磁盘写的次数, cache 文件先写在内存中,超过一定访问次数时才写回磁盘,但由于要修改应用程序,因此执行难度大 </li></ul></ul><ul><ul><li>减少磁盘随机写的次数,前端不使用 255x255 的哈希目录,而是把多个 cache 文件写在一个大的 cache 文件中,并且只作追加写,这样就能把随机写变成了顺序写, cache 过期后,整个大的 cache 文件可以一次删除。但由于要修改应用,因此执行难度大 </li></ul></ul><ul><ul><li>上面 2 个办法结合使用,听上去性能会更好,但是执行难度更大 </li></ul></ul>
  72. 72. 动态内容 +Cache 为主的网站 <ul><li>优化办法 </li></ul><ul><ul><li>使用 tmpfs 作 cache 磁盘 (ramdisk 也可以 ) ,这样写都在访问内存,没有磁盘 IO 消耗,缺点是 cache 的空间不会很大,不能超过 2G( 该服务器是 4G 内存 ) ,但是不用修改应用程序,执行容易: </li></ul></ul><ul><ul><ul><li>Mount –bind /dev/shm /var/www/cache </li></ul></ul></ul><ul><ul><ul><li>写一个清 cache 的脚本程序,配置在 cron 中, 30 分钟执行一次,检查 /dev/shm 的使用率超过 70% 时,使用 find 命令找出太旧的 cache 文件删除掉 </li></ul></ul></ul><ul><ul><li>最终采用了这个办法,高峰期系统负载小于 5 </li></ul></ul>
  73. 73. 相关的参考资料 <ul><li>Red Hat Enterprise Linux Introduction to System Administration http://www.redhat.com/docs/manuals/enterprise/RHEL-4-Manual/admin-guide/ </li></ul><ul><li>Sysstat 工具集 </li></ul><ul><li>http://freshmeat.net/projects/sysstat/ </li></ul><ul><li>其他查看系统的 man 手册 </li></ul>
  74. 74. 结束啦! <ul><li>谢谢参与! </li></ul>

×