php5-fpm儿童和请求

San*_*cci 4 php

我有个问题.我拥有一个128mb的vps,一个简单的博客,每天只有一百次点击.我安装了nginx + php5-fpm.考虑到低访问量和内存,我决定将fpm设置为静态,并运行1台服务器.虽然我正在进行随机测试,例如通过http运行php脚本,持续30多分钟,我试图在同一台机器上打开博客,并注意到该网站基本上无法访问.所以我去配置并阅读:

     The number of child processes to be created when pm is set to 'static' and the
; maximum number of child processes to be created when pm is set to 'dynamic'.
; **This value sets the limit on the number of simultaneous requests that will be
; served**
Run Code Online (Sandbox Code Playgroud)

令我震惊的是我不知道因为我总是假设一个php孩子会同时处理数百个请求,就像http服务器一样!它做对了吗?例如,如果我启动2个php-fpm子项并同时启动2个"长脚本"所有使用相同php后端的站点将无法访问?这怎么可用?你可能会想:-duh!一个PHP脚本(网页)通常在100ms处理 - ...毫无疑问,但如果你的页面可以运行大约10秒,我会有10个访客使用php-fpm和5个服务器,所以只会接受每次同时5个请求?他们都将排队或​​将经历超时?

我老实说习惯于在Windows中使用Apache和mod_php运行网站我从未遇到过这些问题,因为显然这些限制并不适用于使用PHP的不同方式.

这也提出了另一个问题.如果我有file_1.php with sleep(20)和file_2.php只有一个echo,如果我运行file_1然后file_2使用fastcgi机器,第二个文件将请求创建另一个服务器来处理php请求使用4MB RAM更多.如果我对ap​​ache/mod_php做同样的事情,第二个文件将只使用30KB的RAM(在apache服务器中).考虑到这一点,为什么mod_php正在考虑"坏人",如果使用的ram实际上更少...我知道我错过了这里的大图.

tim*_*dev 18

你基本上做对了.您配置了静态工作人员数(并且该数字为"一") - 这正是您所获得的.

但你不明白事情通常是如何运作的,因为你说:

我总是假设一个php孩子会像http服务器那样同时处理数百个请求!

我对nginx并不熟悉,但考虑一下apache中典型的mod_php设置.如果你正在使用mod_php,那么你正在使用prefork mpm for apache.因此,每个并发的http请求都由不同的httpd进程处理(无线程).如果您正在调整apache/mod_php服务器以获得低内存,那么您将不得不调整apache设置以限制它将产生的进程数(特别是MaxClients).

未能调整这些东西意味着当你遇到大量的流量峰值时,apache开始产生大量繁重的进程(记住,它是mod_php,所以你在每个httpd进程中嵌入了整个PHP解释器),并且你的内存不足,然后一切都开始交换,你的服务器开始冒烟.

正确调整(意思是:调整以便忽略请求而不是分配更多进程所没有的内存),客户端会超时,但是当流量消退时,事情会恢复正常.

与fpm相比,以及更智能的Web服务器架构,如apache-worker或nginx.现在你有一些更大的线程池(仍然是可配置的!)来处理http请求,还有一个独立的php-fpm进程池来处理需要PHP的请求.它基本上是一样的,如果你没有设置可以创建多少进程/线程的限制,你就是在寻找麻烦.但是如果你做了调整,那么你就会领先,因为只有一小部分请求使用PHP.基本上,每个http请求所需的平均内存量较低 - 因此您可以使用相同的内存量处理更多请求.

但是将数字设置为"1"太极端了.在"1",如果你选择静态或动态,它甚至无关紧要,因为无论哪种方式,你只需要一个php-fpm进程.

因此,尝试给出特定问题的明确答案:

你可能会想:-duh!一个PHP脚本(网页)通常在100ms处理 - ...毫无疑问,但如果你的页面可以运行大约10秒,我会有10个访客使用php-fpm和5个服务器,所以只会接受每次同时5个请求?他们都将排队或​​将经历超时?

是的,他们都会排队,并最终超时.不过,你经常拥有需要10秒钟运行的脚本这一事实才是真正的罪魁祸首.有很多方法来构建(缓存,工作队列等),但正确的解决方案完全取决于您尝试做什么.

我老实说习惯于在Windows中使用Apache和mod_php运行网站我从未遇到过这些问题,因为显然这些限制并不适用于使用PHP的不同方式.

他们确实适用.您可以使用与nginx/php-fpm相同的方式设置apache/mod_php服务器 - 只需将apache的MaxClients设置为1即可!

这也提出了另一个问题.如果我有file_1.php with sleep(20)和file_2.php只有一个echo,如果我运行file_1然后file_2使用fastcgi机器,第二个文件将请求创建另一个服务器来处理php请求使用4MB RAM更多.如果我对ap​​ache/mod_php做同样的事情,第二个文件将只使用30KB的RAM(在apache服务器中).考虑到这一点,为什么mod_php正在考虑"坏人",如果使用的ram实际上更少...我知道我错过了这里的大图.

特别是在Linux上,很多报告内存使用情况的东西都会产生误导.但是想一想:30kb可以忽略不计.这是因为当一些httpd进程启动时,已经分配了大部分PHP的内存.

128MB VPS相当紧凑,但应该能够处理多个php进程.

如果要进行优化,请执行以下操作:

对于PHP:

pm = static
pm.max_children=4
Run Code Online (Sandbox Code Playgroud)

对于nginx,弄清楚如何控制进程和线程数(无论等同于apache的MaxClients,StartServers,MinSpareServers,MaxSpareServers)

然后弄清楚如何生成一些真实的负载(apachebench,围攻,jmeter等).使用vmstat,freetop观察你的内存使用情况.调整pm.max_children和nginx的内容尽可能高,而不会导致任何重大交换(根据vmstat)