高性能MySQL:测量PHP 应用程序

高性能MySQL:测量PHP 应用程序,第1张

测量PHP 应用程序

如果不使用New Relic 也有其他的选择 尤其是对PHP 有好几款工具都可以帮助进行性能剖析 其中一款叫做xhprof(//pecl php net/package/xhprof) 这是Facebook开发给内部使用的 在 年开源了 xhprof 有很多高级特性 并且易于安装和使用 它很轻量级 可扩展性也很好 可以在生产环境大量部署并全天候使用 它还能针对函数调用进行剖析 并根据耗费的时间进行排序 相比xhprof 还有一些更底层的工具 比如xdebug Valgrind 和cachegrind 可以从多个角度对代码进行检测注 有些工具会产生大量输出 并且开销很大 并不适合在生产环境运行 但在开发环境却可以发挥很大的作用

下面要讨论的另外一个PHP 性能剖析工具是我们自己写的 基于本书第二版的代码和原则扩展而来 名叫IfP(instrumentation for php) 代码托管在Goole Code 上(//code google /p/instrumentation for php/) Ifp 并不像xhprof 一样对PHP 做深入的测量 而是更关注数据库调用 所以当无法在数据库层面进行测量的时候 Ifp 可以很好地帮助应用剖析数据库的利用率 Ifp 是一个提供了计数器和计时器的单例类 很容易部署到生产环境中 因为不需要访问PHP 配置的权限(对很多开发人员来说 都没有访问PHP配置的权限 所以这一点很重要)

Ifp 不会自动剖析所有的PHP 函数 而只是针对重要的函数 例如 对于某些需要剖析的地方要用到自定义的计数器 就需要手工启动和停止 但Ifp 可以自动对整个页面的执行进行计时 这样对自动测量数据库和memcached 的调用就比较简单 对于这种情况就无须手工启动或者停止 这也意味着 Ifp 可以剖析三种情况 应用程序的请求(如page view) 数据库的查询和缓存的查询 Ifp 还可以将计数器和计时器输出到Apache 通过Apache 可以将结果写入到日志中 这是一种方便且轻量的记录结果的方式 Ifp 不会保存其他数据 所以也不需要有系统管理员的权限

使用Ifp 只需要简单地在页面的开始处调用start_request() 理想情况下 在程序的一开始就应当调用

require_once( Instrumentation php )

Instrumentation::get_instance() >start_request()

这段代码注册了一个shutdown函数 所以在执行结束的地方不需要再做更多的处理

IFP会自动对SQL添加注释 便于从数据库的查询日志中更灵活地分析应用的情况 通过SHOW PROCESSLIST也可以更清楚地知道性能低的查询出自何处 大多数情况下 定位性能低下查询的来源都不容易 尤其是那些通过字符串拼接出来的查询语句 都没有办法在源代码中去搜索 那么IFP的这个功能就可以帮助解决这个问题 它可以很快定位到查询是从何处而来的 即时应用和数据库中间加了代理或者负载均衡层 也可以确认是哪个应用的用户 是哪个页面请求 是源代码中的哪个函数 代码行号 甚至是所创建的计数器的键值对 下面是一个例子

File: index php Line: Function: fullCachePage request_id: ABC session_id: XYZ

SELECT * FROM …

如何测量MySQL 的调用取决于连接MySQL 的接口 如果使用的是面向对象的mysqli接口 则只需要修改一行代码 将构造函数从mysqli 改为可以自动测量的mysqli_x 即可 mysqli_x 构造函数是由Ifp 提供的子类 可以在后台测量并改写查询 如果使用的不是面向对象的接口 或者是其他的数据库访问层 则需要修改更多的代码 如果数据库调用不是分散在代码各处还好 否则建议使用集成开发环境(IDE)如Eclipse 这样修改起来要容易些 但不管从哪个方面来看 将访问数据库的代码集中到一起都可以说是最佳实践

Ifp 的结果很容易分析 Percona Toolkit 中的pt query digest 能够很方便地从查询注释中抽取出键值对 所以只需要简单的将查询记录到MySQL 的日志文件中 再对日志文件进行处理即可 Apache 的mod_log_config 模块可以利用Ifp 输出的环境变量来定制日志输出 其中的宏%D 还可以以微秒级记录请求时间

也可以通过LOAD DATA INFILE 将Apache 的日志载入到MySQL 数据库中 然后通过SQL 进行查询 在Ifp 的网站上有一个PDF 的幻灯片 详细给出了使用示例 包括查询和命令行参数都有

或许你会说不想或者没时间在代码中加入测量的功能 其实这事比想象的要容易得多 而且花在优化上的时间将会由于性能的优化而加倍地回报给你 对应用的测量是不可替代的 当然最好是直接使用New Relic xhprof Ifp 或者其他已有的优化工具 而不必重新去发明 轮子

MySQL 企业监控器的查询分析功能

MySQL 的企业监控器(Enterprise Monitor)也是值得考虑的工具之一 这是Oracle 提供的MySQL 商业服务支持中的一部分 它可以捕获发送给服务器的查询 要么是通过应用程序连接MySQL 的库文件实现 要么是在代理层实现(我们并不太建议使用代理层) 该工具有设计良好的用户界面 可以直观地显示查询的剖析结果 并且可以根据时间段进行缩放 例如可以选择某个异常的性能尖峰时间来查看状态图 也可以查看EXPLAIN 出来的执行计划 这在故障诊断时非常有用

       返回目录 高性能MySQL

       编辑推荐

       ASP NET开发培训视频教程

数据仓库与数据挖掘培训视频教程

lishixinzhi/Article/program/MySQL/201311/29717

通过sysbench的oltp_read_write测试来模拟业务压力、以此来给指定的硬件环境配置一份比较合理的MySQL配置文件。

环境介绍

硬件配置

请点击输入图片描述

软件环境

请点击输入图片描述

优化层级与指导思想

优化层级

MySQL数据库优化可以在多个不同的层级进行,常见的有:

SQL优化

参数优化

架构优化

本文重点关注:参数优化

指导思想

日志先行 -- 一个事务能否成功提交的关键是日志是否成功落盘,与数据没有太大的关系;也就是说对写的优化可以表述为各方面的资源向写 *** 作倾斜。

瓶颈分析 -- 通过show global status 的各个计数器的值基本上就能分析出当前瓶颈所在,再结合一些简单的系统层面的监控工具如top iostat 就能明确瓶颈。

整体性能是“读”&“写”之间的再平衡。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/6105086.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-03-14
下一篇 2023-03-14

发表评论

登录后才能评论

评论列表(0条)

保存