服务器性能剖析
常见问题:
- 如何确认服务器是否达到性能最佳状态
- 找出某条语句为什么执行不够快
- 诊断被描述成“停顿”“堆积”或”卡死“的某些间歇性疑难故障
一、性能优化简介
- 1、性能:为了完成某件任务所需要的时间度量,度量即响应时间,这是非常重要的原则
- 2、如果目标是降低响应时间,就需要理解为什么服务器执行查询需要这么多时间,然后去减少或者消除那些对获得查询结果来说不必要的工作,无法测量就无法有效的优化。
- 3、性能剖析说测量和分析时间花费在哪里的主要方法,一般有两个步骤:测量所花费的时间,对结果进行统计和排序,测量是一项很有挑战性的工作,甚至有百分之90的时间来测量时间花在哪里,如果测量了系统中完整而且正确的数据,性能问题一般都能暴露出来,对症下药的解决方案也就比较明了。
二、对应用程序进行性能剖析
1、性能瓶颈可能的影响因素
- 外部资源
- 应用需要处理大量数据
- 在循环中执行昂贵的操作
- 使用了低效的算法
2、PHP性能剖析工具:New Relic、xhprof、lfp
三、剖析MySQL查询
1、剖析服务器负载
- 慢查询日志:5.1后long_query_time为0可以补货所有的查询,查询的响应时间单位可以做到微秒级
- 生成剖析报告:pt-query-digest
2、剖析单条语句
- SHOW PROFILES:mysql用来分析当前绘画SQL语句执行的资源消耗情况
- SHOW [GLOBAL] STATUS;返回一些计数器
四、诊断间接性问题
1、系织偶尔停顿或慢查询
1、系织偶尔停顿或慢查询,无法确认如何重现,很难诊断,诊断这样的问题往往花费很多时间,甚至好几个月。
尽量不要用试错的方式来解决问题,这种方式有很大的风险,如果一时无法定位,可能是测量的方式不正确,或者测量的点选择有误,或者使用的工具不合适。
常见案例
- 1、缓存中重要数据过期,导致大量查询落到MYSQL上以重新生成缓存
- 2、DNS偶尔会有超时
- 3、互斥锁争用
- 4、并发度超过某个阔值时, InnoDB的扩展性限制导致查询计划的优化需要很长时间
2、确定单条询问题还是服务器问题
如果问题不停的周期性出现,那么可以在某种活动中规察到;或者整夜运行脚本收集数据,第二天来分析结果。大多数情况下都可似通过三种技术来解决
- 使用 SHOW GLOBAL STATUS(列出服务器运行各种状态值,不停执行存数据)
- 使用 SHOW PROCESSLIST
- 使用查询日志
理解发现的问题,可选 gnuplot成R,或其他绘图工具将结果给制成图形
3、捕获诊断数据
- 诊断触发器:在问题出现时能够捕获数据的基础,有两个常见问题可能导致无法达到预期的结果:误报( false positive)或漏检( false negative),pt-stak工具
- 收集数据:尽可能收集所有能收集的数据,但只在需要的时间段内收集, oprofile、 strace、 tcpdump、GDB堆栈跟踪、pt- collect、 prestalk
- 计时结果数据:pt-mysql-summary、pt-summary输出结果打包,pt-sift得到样本汇总信息,pt-pmp。
- 解释数据结果:pt-mysql-summary、pt-summary输出结果打包,pt-sift得到样本汇总信息,pt-pmp
五、其他剖析工具
1、使用USER_STATISTICS表
2、使用strace,可以调查系统调用的情况。