forecho 的独立博客

把生命浪费在美好的事物上

性能优化第一篇

2019年04月19日

引言

说来惭愧,搞了这么多年 PHP 开发,最近才正儿八经的搞性能优化。打算把这些经验记录并且分享出来,这会是一系列文章,这是第一篇。

性能测试

性能优化的第一步就是要发现系统的性能瓶颈。这部分一般都会有专门的 QA 去测试,输出报告。性能测试大多都是并发测试,推荐使用 Apache JMeter™ ,免费并且功能强大,支持多系统平台。至于使用教程,我就不贴了,网上一搜一大把。

监控统计

除了 QA 给的测试报告,作为开发人员我们也要收集系统的性能数据,并且能输出性能报告。我目前主要的工作是接口开发,所以下面我就来谈谈自己是如何收集系统性能的。

EFK

之前我就分享过《使用 Docker 搭建 EFK》,我们通过记录日志的方式来统计每个接口请求的耗时。基本思路就是记录请求开始时间戳和结束时间戳,算出耗时,然后记录到日志里,时间目前用的是毫秒级别。

  • 如果是 Laravel 我们可以写一个中间件,然后去修改路由或者 App\Http\Kernel.php文件比较方便的去实现。
  • 如果是 Yii2 ,由于目前不支持中间件,就麻烦一点了,只能通过 behavior 的形式来实现。

收集数据之后,我们可以在 Kibana 里面使用 Visualize 来方便查看数据,主要步骤:

  • 在 Kibana 菜单找到 Visualize 。
  • 然后点击 Create a visualization,选择 Vertical Bar,选择你之前创建的索引(如果没有创建索引,你要去 Management 里面去创建)。
  • Metrics 下面的 Y-Axis 的 Aggregation 你可以选择 AverageMax 等,Field 就选你记录到日志里面的耗时时间的 Key (记录日志的时候 Key 建议英文)。
  • Buckets 下面的 X-Axis 的 Aggregation 一半选择 Date Histogram,剩下的默认就好。
  • 参数设置好之后,你可以点一个▶️图标就会有统计结果了。

然后我们就可以得到自己想要的数据了,直接记录结果就可以了。同样的可以根据情况记录项目中 Curl 请求其他接口的耗时情况。

有了 EFK 可以让性能统计更加方便,但是如果没有也可以使用这种方式,只是要自己写脚本去分析日志文件。

xhprof && xhgui

我之前有分享过《使用 Laradock》 的情况,里面有记录如何安装 PHP xhprof 扩展,有了这个扩展可以针对具体的一个请求进行性能分析。它会收集函数方法执行的耗时和数据库耗时,清晰明了,甚至还可以看火焰图。

我使用的是公司内部基于 laynefyc/xhgui-branch 改造的库。这个项目只要分两个模块,一个是收集数据到 MongoDB ,一个是 web 页面读取 MongoDB 的数据。

这个工具只能看具体的某个请求耗时,不能方便的做统计,所以我觉得可以和上面的 EFK 方式结合使用,效果更好。

优化性能

通过上面两个方式,进行大量的收集数据和分析之后,找到问题点就可以进行优化了。分享几个点:

  • 框架自带的优化方式,一般框架都会给出官方文档,找着做一遍。
  • 能用缓存的尽量用缓存,并且使用 redis 缓存。
  • 减少不必要的网络请求(网络请求和 io 都是非常耗时的)。
  • MySQL SQL 的优化,检查索引是否触发什么。
  • 考虑是不是可以使用异步队列的方式处理。(异步队列虽然能优化接口响应时间,但是增加了复杂度,所以还是要考虑业务场景。)

最后

最后总结一下这次性能优化的几个经验:

  • 性能优化之前不能靠猜测性能慢的地方,一定要拿出数据。
  • 记录好优化之前的测试报告数据,比对优化之后的测试报告数据。
  • 性能优化更考验一个人对底层知识的储备。
  • 在架构的选型上尽量选择社区、文档活跃的类库。
扫码关注我的个人公众号