基于php-fpm的应用服务器如何提升curl的处理能力

  • 环境
    • 16vCpu;32G (虚机)
    • centos7.5
    • nginx1.20
    • php-fpm7.3
  • 压力测试目标
    • 1000qps 1秒响应
  • php-fpm优化如下
    • opcache enable
    • pm: static
    • pm.max_children: 32*1024/50≈650
    • pm.max_requests: 10240
    • rlimit_files: 65535
    • request_terminate_timeout: 5
  • linux内核已优化
  • 系统句柄已优化(65535)

当前应用服务器主要实现调用(使用curl函数)内部服务重新组装数据提供出网接口,内部服务响应时间在50毫秒以内。

nginx的qps达到700左右之后,php-fpm active proacess为650,nginx的qps小于active connect,出网的接口响应为2-3秒,此时cpu的使用率为50%左右,内存使用了25%左右。

将php-fpm的tcp的方式改成socket方式,性能没有明显提升。

增加php-fpm的进程数750,nginx的qps控制在700左右,出网接口响应时间仍然为2-3秒,甚至有5秒的。

应用服务器安装多个版本的php,使用upstream负载多个端口,php-fpm进程总个数为1200,cpu使用率为70%左右,内存使用了30%左右,出网接口性能没有明显改善。

额外增加一台服务器,使用两台进行负载,每台都开启500个php-fpm进行,出网接口响应时长在1秒之内。

猜测:一台服务器达到瓶颈后,即使增加cpu和内存也无效,将一台16核CPU+32G内存虚机拆成两台8核CPU+16G内存的虚拟机性能会更好

不考虑多台服务器负载,如何提高单台服务器的处理能力,望社区里的大神指导一二,如果能说明瓶颈点的原理就更好了,发点相关资料也可以。

补充说明:
此次优化是对旧业务系统的优化,新技术的改造短时间内是无法实施的,至于为何要用php来中转接口是历史遗留问题了,短时间内可能是无法采用其他技术实现网关的。正在准备增加新的虚拟机,不过单台的性能还应该继续努力下。。。

– 2021.11.25 –
之前服务器里安装了性能监控(tideways+xhgui),将其屏蔽后重新测试,qps达到950之后才出现异常(应该是压力测试机达到瓶颈了),后续准备增加压力测试机或者是云平台的压力测试服务。

未完待续。。。

《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 20

你应该先从业务入手 看看业务那边是不是有同步阻塞的代码

2年前 评论

单个接口响应时间过长 就不怎么像并发的问题了,可以在服务器上监控一下服务的状态 实在还是不行的 可以用性能分析的扩展分析一下

2年前 评论

@arvin-hermit 业务是接收前端参数,然后使用curl调用服务接口(应用服务到瓶颈后,使用Linux的curl命令请求服务接口,响应时间为20毫秒左右,那服务提供的接口就不是瓶颈了)
已使用 tideways 进行性能监测,耗时主要在 curl 请求上

2年前 评论
arvin-hermit 2年前

既然是掉用第三方服务接口,前端直接调用不就行了,为什么还要服务器中转?服务器最多给前端返回一下第三方接口的授权认证信息。浪费资源啊。

2年前 评论
杨柳岸 (作者) 2年前
杨柳岸 (作者) 2年前
aa24615 2年前

显然你的瓶颈在宽带,可以看看宽带利用率

2年前 评论
杨柳岸 2年前

我个人觉得,只能用负载均衡的方式来实现,或者,用go+php组合

2年前 评论
thebestxt

既然已经问出这个问题了,说明该上 swoole 了。

2年前 评论

@91it 有没有什么手段可以在服务器中看出瓶颈,或者有依据说明curl已经到服务器瓶颈了,怎么优化也没用了,我现在都是猜想。

2年前 评论
91it 2年前
91it 2年前

php-fpm 性能就不是很好 :joy:,上swoole和workman吧 性能杠杠的,甩隔壁java一条街
直接用swoole imi吧

2年前 评论
aa24615 2年前
哪吒的狗腿子 (作者) 2年前
随波逐流

如果追求性能, 无非两个方向, 负载均衡TCP开发

负载均衡 无非就是加机器, 一台不行就, 两台, 三台...百台

没有 毛爷爷 可以考虑 单机 TCP开发, 在PHP领域 swoole / workman 大家应该都不算陌生

2年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!