title: "性能优化第一篇" date: 2019-04-19T10:58:00+08:00 tags: ["经验分享", "性能优化"] draft: false
说来惭愧,搞了这么多年 PHP 开发,最近才正儿八经的搞性能优化。打算把这些经验记录并且分享出来,这会是一系列文章,这是第一篇。
性能优化的第一步就是要发现系统的性能瓶颈。这部分一般都会有专门的 QA 去测试,输出报告。性能测试大多都是并发测试,推荐使用 Apache JMeter™ ,免费并且功能强大,支持多系统平台。至于使用教程,我就不贴了,网上一搜一大把。
<!--more-->除了 QA 给的测试报告,作为开发人员我们也要收集系统的性能数据,并且能输出性能报告。我目前主要的工作是接口开发,所以下面我就来谈谈自己是如何收集系统性能的。
之前我就分享过《使用 Docker 搭建 EFK》,我们通过记录日志的方式来统计每个接口请求的耗时。基本思路就是记录请求开始时间戳和结束时间戳,算出耗时,然后记录到日志里,时间目前用的是毫秒级别。
App\Http\Kernel.php
文件比较方便的去实现。收集数据之后,我们可以在 Kibana 里面使用 Visualize 来方便查看数据,主要步骤:
Create a visualization
,选择 Vertical Bar
,选择你之前创建的索引(如果没有创建索引,你要去 Management 里面去创建)。Y-Axis
的 Aggregation 你可以选择 Average
、Max
等,Field
就选你记录到日志里面的耗时时间的 Key (记录日志的时候 Key 建议英文)。X-Axis
的 Aggregation 一半选择 Date Histogram
,剩下的默认就好。然后我们就可以得到自己想要的数据了,直接记录结果就可以了。同样的可以根据情况记录项目中 Curl 请求其他接口的耗时情况。
有了 EFK 可以让性能统计更加方便,但是如果没有也可以使用这种方式,只是要自己写脚本去分析日志文件。
我之前有分享过《使用 Laradock》 的情况,里面有记录如何安装 PHP xhprof 扩展,有了这个扩展可以针对具体的一个请求进行性能分析。它会收集函数方法执行的耗时和数据库耗时,清晰明了,甚至还可以看火焰图。
我使用的是公司内部基于 laynefyc/xhgui-branch 改造的库。这个项目只要分两个模块,一个是收集数据到 MongoDB ,一个是 web 页面读取 MongoDB 的数据。
这个工具只能看具体的某个请求耗时,不能方便的做统计,所以我觉得可以和上面的 EFK 方式结合使用,效果更好。
通过上面两个方式,进行大量的收集数据和分析之后,找到问题点就可以进行优化了。分享几个点:
最后总结一下这次性能优化的几个经验: