引言
说来惭愧,搞了这么多年 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 你可以选择Average
、Max
等,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 的优化,检查索引是否触发什么。
- 考虑是不是可以使用异步队列的方式处理。(异步队列虽然能优化接口响应时间,但是增加了复杂度,所以还是要考虑业务场景。)
最后
最后总结一下这次性能优化的几个经验:
- 性能优化之前不能靠猜测性能慢的地方,一定要拿出数据。
- 记录好优化之前的测试报告数据,比对优化之后的测试报告数据。
- 性能优化更考验一个人对底层知识的储备。
- 在架构的选型上尽量选择社区、文档活跃的类库。
- 原文作者: forecho
- 原文链接: https://blog.forecho.com/performance-optimization-01.html
- 版权声明:本作品采用 署名-非商业性使用 4.0 国际 (CC BY-NC 4.0)进行许可,非商业转载请注明出处(作者,原文链接),商业转载请联系作者获得授权。