Scaling Nginx, PHP-FPM and MongoDB



我正在寻找使用PHP-FPM在Nginx下扩展PHP应用程序的最佳方法。我看到的是大约1200的并发性。目前,任何超过400的东西的响应时间都开始变慢。响应大小通常很小,但也有一些可能相当大。请求大小通常很小,只有少数请求除外。

事情进展得很快,直到它承受了沉重的负荷。响应时间缓慢下降到2到50秒之间。在轻负载下,响应时间在100到300毫秒之间变化。

服务器设置为2台服务器。前面是负载均衡器,两个盒子上都有PHP-FPM、Nginx和MongoDB。一台服务器运行mongod-master和仲裁器,另一台运行slave(除非发生故障转移)。我知道Mongo的最佳实践,但我没有足够的服务器来拥有专用的数据库服务器。

仍然有相当多的ram空闲,最后1分钟的平均负载从未超过0.7。它们是8个核心盒子,每个盒子有16个公羊,所以这不应该是瓶颈。Mongo一点也不出汗,Nginx和PHP-FPM似乎也不出汗。我已经使用db.serverStatus().检查了顶级统计数据和MongoDB

我的问题是,考虑到我的并发性,我的Nginx fastcgi设置看起来正确吗?即使与Nginx设置无关,我是否还缺少其他东西?

fastcgi_connect_timeout 60;
fastcgi_send_timeout 180;
fastcgi_read_timeout 180;
fastcgi_buffer_size 128k;
fastcgi_buffers 4 256k;
fastcgi_busy_buffers_size 256k;
fastcgi_temp_file_write_size 256k;
fastcgi_intercept_errors on;

低"ulimit-n"会减慢速度吗?Mongo在高负载下使用大约500到600个连接。Ulimit设置如下:

core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 147456
max locked memory       (kbytes, -l) 32
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 10240
cpu time               (seconds, -t) unlimited
max user processes              (-u) 147456
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

仅供参考,当负载测试1200并发时,我将增加"ulimit-n"。

提前谢谢。

似乎只需要一点计算。由于我有8个核心可用,我可以生成更多的nginx工作进程:

nginx.conf

worker_processes 4;
events {
    worker_connections 1024;
}

16gb的ram将为静态数量的php fpm工作人员提供一些腿部空间。

php-fpm.conf

pm = static
pm.max_children = 4096

Nginx的fastcgi设置保持不变。我可能需要做更多的调整,因为随着设置的改变,可接受的并发性在服务器负载下降时保持不变,但这似乎起到了作用,至少是一个起点。

在负载变得相当高之前,单个服务器似乎可以处理大约2000个并发。ApacheBench开始在500并发左右出现错误,因此应该在多个服务器上进行AB测试。

正如大卫所说,理想情况下,这将以更容易扩展的方式编写,但考虑到目前不可行的时间框架。

我希望这能帮助其他人。

MongoDB不是这里的瓶颈。如果您需要1200+个并发连接,PHP-FPM(以及一般的PHP)可能不是该作业的工具。事实上,抓一下。这不是适合这份工作的工具。许多基准测试断言,在200-500个并发连接之后,nginx/PHP-FPM开始动摇(见此处)。

去年我也遇到过类似的情况,我没有尝试扩展不可扩展的应用程序,而是使用Kilim(我也参与了这个项目)用Java重写了应用程序。另一个很好的选择是用Erlang编写(这也是Facebook使用的)。我强烈建议您在这里重新评估您选择的语言,并在为时已晚之前进行重构。

假设您让PHP-FPM在1200甚至1500个并发连接的情况下"正常"工作。2000年怎么样?5000?10000?绝对,明确,毫无疑问的不可能。

最新更新