PHP压测优化
概述 一个产品的编码完成,并不能代表产品能够给用户体验,其中还必须包含测试、压测分析等,而往往我们的产品上线前却忽略掉压测分析。既然压测分析很重要那么我们应该如何进行呢? 本文章主要通过实践经验来学习了解压测过程,并且提出一些在 PHP 端可以进
概述
一个产品的编码完成,并不能代表产品能够给用户体验,其中还必须包含测试、压测分析等,而往往我们的产品上线前却忽略掉压测分析。既然压测分析很重要那么我们应该如何进行呢?
本文章主要通过实践经验来学习了解压测过程,并且提出一些在PHP端可以进行优化的功能点,从而帮助后续开发过程中应用最优方式去编码。
工具
有道是磨刀不误砍柴工,要有好的工具才能做事更有效率,要学会工具的应用才能更进一步的优化系统项目。
关于PHP的工具性能检测工具的话,可以应用xhprof工具或者CI的原生时间打印工具。Xhprof工具的使用方法大家可以参考:http://blog.snsgou.com/post-278.html。
CI原生工具打印时间则了解CI中Benchmark类库中关于mark方法的应用,其主要是针对mark中包含*_start和*_end的所有标记时间添加到CI的debug页面信息中。因此如果我希望查看某个类库的加载时间,我只需要做例如下面的处理方式:
$BM =& load_class('Benchmark', 'core'); $BM->mark('base_classes_start'); // load base classes $BM->mark('base_classes_end);
如果这样一个个添加会让你觉得很蛋疼,因为类库太多了,那么这里就可以应用小技巧,你只需要在load model和load library处添加该处理功能,那如果使用的是原生的require时,则会相对较为麻烦。
在调整如上代码时,切记要备份一份完整的代码。将如上的工具都应用到项目代码中后,我们接下来就是来分析需要优化的接口。
代码压测前优化
在压测前首先你需要解决那些很明显的问题,比如说一个请求会多次加载类库、一个请求会多次请求memcached中相同数据、一个请求会多次请求redis中相同的数据、一个请求会多次的new一个类库等等。而这些问题都可以在压测前分析解决。以下是一个自我检测表格,如果大家以后有需要可以进行相应的检查并优化。
优化问题 |
分析 |
优化方向 |
备注 |
多次加载类库 |
在创建类似redis、memcached以及mongodb的类库时,都会在构造函数中创建连接,而如果处理不当时则会加载多次创建多个句柄,导致服务端句柄连接非常多,加大每个连接处理的时间。 |
如果有长连接方式则尽量使用长连接,如果没有则在每次连接时,应用静态变量保存,下次需要重新创建连接时则进行判断,避免一个请求产生多个句柄。 |
一般经常性使用的类库都有做这种处理,但也不排除未做处理的,因此在压测前可以好好的查看一下。 |
单个数据多次请求缓存 |
在正常情况下,大家都会觉得既然是读取缓存那么效率上应该很高,所以一般情况下需要数据时都直接读取缓存内容。这样会导致一个情况是单个数据的缓存可能被请求了多次。 |
首先需要知道哪些数据被请求了多次,因此可以在缓存的get方法中添加日志,记录每一次读取缓存的key值,最后再分析查看哪些数据被读取了多次。从而来进一步优化,在缓存读取完成后,使用一个静态数组保存读取完成的数据,如果读取过则直接从本地内存中获取,而无需远程缓存数据。 |
如果缓存在静态变量中相当于读取本地内存,而如果应用其他缓存工具,则会在创建连接以及算法上有细微的差距。而如果在高并发的情况下,这种对比就会被无限的放大。 |
关闭debug日志 |
一般PHP系统都会存在debug日志,在压测并非时可能会存在影响,因此最好是关闭debug模拟现网只有info和error日志内容。 |
关闭debug日志,保留info和error,与现网保持一致。 |
这部分在低并发时也时也很难看出问题,但在高并发时可以明显看出这会影响到系统性能,因此在压测前以及现网必须要进行关闭。 |
对以上三个方向进行了优化后,我们接下来就开始准备对系统进行压测分析。
压测分析
压测前需要注意以下几点:
1、压测前必须要保证去除登录逻辑,并能够进入正常的数据请求;
2、压测将接口分析以便同一类接口,可以避免修改逻辑一起压测;
3、压测数据表格设计,尽量能够设计分析出系统的极限处理能力,例如下面表格;
压测并发 |
压测请求量 |
压测服务器 |
吞吐量 |
Xhprof标准 |
20 |
10000 |
236 |
510 |
http://xxx |
50 |
10000 |
236 |
550 |
http://xxx |
4、应用xhprof工具打点分析,为了xhprof不影响现网的运行,可以使用概率打点方法。
压测
如果前期准备完善的话,接下来的压测就较为简单了,只需要跑一下流程,然后查看一下xhprof打印的数据,并且记录下xhprof页面url以及压测结果的吞吐量。这部分需要注意的一点是必须要等被压测服务器的负载降低时才能进行下一次压测,避免压测未达到最佳性能。
压测数据分析
1、压测数据分析
如果前期压测数据都已经完成后,再将压测表格数据做成一个折线图(绘制折线图的方法,可以使用execl)。通过折线图分析出系统服务器的最佳并发以及最佳并发下的最大吞吐量,例如下面的折线图。
分析完成以后,就可以看到服务器在大概100并非时是最大的性能,因此我们接下来就可以分析在100并发以后系统代码运行的异常问题。
2、xhprof性能分析
从上面的数据分析后,对于100并发前的性能就无需进行查看,而对100并非后的xhprof结果进行分析,细致的查看每个函数的处理时间以及请求次数。再记录完这些数据后,在通过源码对比,查看是否有部分接口可以再进行优化,或者说再进一步降低请求次数从而达到优化的目的。
压测优化点
在进行压测后发现,mongodb的连接和读取都会对系统产生一个非常大的影响,因此我记录下了其优化方案(加大缓存时间,并整改代码,在拥有缓存数据时则不加载mongodb类库,如果没有缓存则加载类库,即修改基类,在构造函数中不直接加载mongodb类库,而是单独的添加一个方法来加载mongodb类库)。
优化后再进行压测
完成压测后,对代码进行部分的整个优化(整改前请注意备份),优化完成后再跑一遍代码逻辑,避免整改后服务异常,从而未达到压测逻辑的目的。
代码完成以后再进行下一轮的压测对比,而这时的对比就可以看出优化后的明显变化,这也会让我们的信息进一步提升,让我们对压测过程更加充满一种满足的感觉。
总结
在PHP压测优化过程中整体学到了很多知识,在后续的开发过程中则会更加有经验,我也希望通过这个简短的总结能够让大家了解更多学习更多。
关于更多请查看我的个人资讯
http://blog.lovedan.cn/

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

热门话题

PHP 8.4 带来了多项新功能、安全性改进和性能改进,同时弃用和删除了大量功能。 本指南介绍了如何在 Ubuntu、Debian 或其衍生版本上安装 PHP 8.4 或升级到 PHP 8.4

如果您是一位经验丰富的 PHP 开发人员,您可能会感觉您已经在那里并且已经完成了。您已经开发了大量的应用程序,调试了数百万行代码,并调整了一堆脚本来实现操作

Visual Studio Code,也称为 VS Code,是一个免费的源代码编辑器 - 或集成开发环境 (IDE) - 可用于所有主要操作系统。 VS Code 拥有针对多种编程语言的大量扩展,可以轻松编写

JWT是一种基于JSON的开放标准,用于在各方之间安全地传输信息,主要用于身份验证和信息交换。1.JWT由Header、Payload和Signature三部分组成。2.JWT的工作原理包括生成JWT、验证JWT和解析Payload三个步骤。3.在PHP中使用JWT进行身份验证时,可以生成和验证JWT,并在高级用法中包含用户角色和权限信息。4.常见错误包括签名验证失败、令牌过期和Payload过大,调试技巧包括使用调试工具和日志记录。5.性能优化和最佳实践包括使用合适的签名算法、合理设置有效期、

本教程演示了如何使用PHP有效地处理XML文档。 XML(可扩展的标记语言)是一种用于人类可读性和机器解析的多功能文本标记语言。它通常用于数据存储

字符串是由字符组成的序列,包括字母、数字和符号。本教程将学习如何使用不同的方法在PHP中计算给定字符串中元音的数量。英语中的元音是a、e、i、o、u,它们可以是大写或小写。 什么是元音? 元音是代表特定语音的字母字符。英语中共有五个元音,包括大写和小写: a, e, i, o, u 示例 1 输入:字符串 = "Tutorialspoint" 输出:6 解释 字符串 "Tutorialspoint" 中的元音是 u、o、i、a、o、i。总共有 6 个元

静态绑定(static::)在PHP中实现晚期静态绑定(LSB),允许在静态上下文中引用调用类而非定义类。1)解析过程在运行时进行,2)在继承关系中向上查找调用类,3)可能带来性能开销。

PHP的魔法方法有哪些?PHP的魔法方法包括:1.\_\_construct,用于初始化对象;2.\_\_destruct,用于清理资源;3.\_\_call,处理不存在的方法调用;4.\_\_get,实现动态属性访问;5.\_\_set,实现动态属性设置。这些方法在特定情况下自动调用,提升代码的灵活性和效率。
