2012-05-21 81 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