2012-05-21 49 views
4

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

 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脚本(网页)通常在100毫秒内处理 - ...毫无疑问,但如果您的页面每个可能运行大约10秒,并且我有10个访问者使用php-fpm与5台服务器,只会接受每次同时有5个请求?他们会全部排队还是会遇到超时?

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

这也引出了另一个问题。如果我的file_1.php中有sleep(20)和file_2.php,只有echo,如果我用fastcgi机器运行file_1和file_2,则第二个文件将请求创建另一个服务器,以使用4MB RAM处理php请求。如果我对ap​​ache/mod_php执行相同的操作,则第二个文件将只使用30KB的RAM(在apache服务器中)。考虑到这个原因,为什么mod_php正在考虑“坏人”,如果使用的RAM实际上更少......我知道我错过了这里的大图。

回答

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和apache-worker或nginx这样的智能Web服务器架构相比较。现在你有一些更大的线程池(仍然可以配置!)来处理http请求,并且有一个独立的php-fpm进程池来处理需要PHP的请求。它基本上是一样的,如果你不设置限制多少进程/线程可以被创建,你是在寻求麻烦。但是如果你确实调整好了,你就会提前发布,因为只有一小部分请求使用PHP。所以基本上,每个http请求所需的平均内存量较低 - 因此您可以使用相同的内存量处理更多的请求。

但是将数字设置为“1”太过于极端。在“1”处,如果您选择静态或动态,则无关紧要,因为无论哪种方式,您都只需要一个php-fpm进程。

所以,要尽量给予明确的回答特定问题:

你可能会想:-duh!一个PHP脚本(网页)通常在100毫秒内处理 - ...毫无疑问,但如果您的页面每个可能运行大约10秒,并且我有10个访问者使用php-fpm与5台服务器,只会接受每次同时有5个请求?他们会全部排队还是会遇到超时?

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

我老实说用Apache和mod_php在Windows上运行网站我从来没有遇到过这些问题,因为显然这些限制并不适用于使用PHP的不同方式。

他们确实适用。您可以像使用nginx/php-fpm一样设置apache/mod_php服务器 - 只需将apache的MaxClients设置为1即可!

这也引出了另一个问题。如果我的file_1.php中有sleep(20)和file_2.php,只有echo,如果我用fastcgi机器运行file_1和file_2,则第二个文件将请求创建另一个服务器,以使用4MB RAM处理php请求。如果我对ap​​ache/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等)。使用vmstatfreetop来观察您的内存使用情况。根据vmstat调整pm.max_children和nginx的内容尽可能地高,不会造成任何显着的交换(根据vmstat

+0

完美的解释 –

+0

您是否愿意提供您的意见?谢谢http://stackoverflow.com/questions/10703976/why-does-apachemod-php-on-windows-require-low-ram-usage –

+0

@timdev感谢您的详细解释:) – conceptdeluxe