我有一个问题。 我拥有一个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**
最令我震惊的是 我不知道 因为我总是假设一个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更多。如果我对apache / mod_php做同样的事情,第二个文件将只使用30KB的RAM(在apache服务器中)。考虑到这一点,为什么mod_php正在考虑“坏人”,如果使用的ram实际上更少...我知道我在这里错过了大图。
答案 0 :(得分: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更多。如果我对apache / mod_php做同样的事情,第二个文件将只使用30KB的RAM(在apache服务器中)。考虑到这一点,为什么mod_php正在考虑“坏人”,如果使用的ram实际上更少...我知道我在这里错过了大图。
特别是在linux上,很多报告内存使用情况的东西都会产生误导。但是想一想:30kb可以忽略不计。这是因为当一些httpd进程启动时,已经分配了大部分PHP的内存。
128MB VPS相当紧凑,但应该能够处理多个php进程。
如果您想进行优化,请执行以下操作:
对于PHP:
pm = static
pm.max_children=4
对于nginx,弄清楚如何控制进程和线程数(无论等同于apache的MaxClients,StartServers,MinSpareServers,MaxSpareServers)
然后弄清楚如何生成一些真实的负载(apachebench,siege,jmeter等)。使用vmstat
,free
和top
来观察您的内存使用情况。调整pm.max_children和nginx的内容尽可能高,而不会导致任何重大交换(根据vmstat
)