PHP-FPM性能调整-流量激增

djt*_*djt 5 php performance laravel

我有一个用Laravel / PHP编写的Web应用程序,该应用程序处于早期阶段,通常服务于大约500-600 reqs / min。我们使用Maria DB和Redis进行缓存,一切都在AWS上进行。

对于我们要在平台上推广的活动,我们向所有用户发送推送通知(移动平台),这导致大约2分钟的长时间流量爆发,使我们的速度达到3.5k reqs / min

在我们当前的服务器规模上,这完全使应用服务器的CPU陷入瘫痪,而这些服务器通常以10%左右的CPU运行。在此突发期间,数据库和Redis群集似乎正常。

查看日志,似乎所有PHP-FPM工作池进程都被占用,并开始从Nginx上游排队请求。

我们目前有:

  • 三台 m4.large服务器(2核,每个8GB RAM)

  • 动态PHP-FPM流程管理,每个框上最多包含120个子流程(服务器)

我的问题:

1)我们应该增加FPM池吗?似乎在内存方面,我们可能已接近极限

2)我们应该减少 FPM池吗?看来我们正在处理太多的进程,以至于CPU陷入瘫痪,无法真正完成其中的任何一个。我想知道我们是否因此能以更少的花费获得更好的结果。

3)我们是否应该简单地使用带有更多RAM和CPU的较大包装盒,这将允许我们添加更多FPM工作人员?

4)我们应该考虑进行FPM性能调整吗?我们使用Opcache,但是,我们是否应该切换到FPM的静态流程管理,以减少流程旋转的开销?

Bee*_*oon 6

与内核数量相关的子进程太多。

首先,您需要了解正常突发时间的服务器状态。

1)检查php-fpm进程数。

ps -ef | grep 'php-fpm: pool' | wc -l
Run Code Online (Sandbox Code Playgroud)

2)检查平均负载。在 2 个内核中,2 个或更多意味着工作的启动延迟。

top
htop
glances
Run Code Online (Sandbox Code Playgroud)

3)根据服务的不同,我们从核心数的两倍开始调整。

; Example
;pm.max_children = 120       ; normal) pool 5, load 0.1 / burst) pool 120, load 5  **Bad**
;pm.max_children = 4    ; normal) pool 4, load 0.1 / burst) pool 4, load 1
pm.max_children = 8    ; normal) pool 6, load 0.1 / burst) pool 8, load 2  **Good**
Run Code Online (Sandbox Code Playgroud)

负载 2 = 最高性能 2 个内核


通过apache benchmark(ab)测试负载与实际负载相近的web服务器更准确。

ab -c100 -n10000 http://example.com

Time taken for tests:   60.344 seconds
Requests per second:    165.72 [#/sec] (mean)
 100%    880 (longest request)
Run Code Online (Sandbox Code Playgroud)