PHP-FPM 使用 40% CPU 處理單個請求
(我在這個論壇上搜尋了幾個小時,找到了一些主題,但沒有一個對我有用)
我正在使用Wordpress與:Varnish + Nginx + PHP-FPM + APC + W3 Total Cache + PageSpeed。
當我使用 Varnish 時,我第一次呼叫www.mysite.com時它只使用了 10% 的 CPU。第二次呼叫,會被記憶體。問題是在 URL中傳遞請求參數。
對於僅 1 個請求 ( www.mysite.com?1=1 ),它顯示在
top
:PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 7609 nginx 20 0 438m 41m 28m S 11.6 7.0 0:00.35 php-fpm 7606 nginx 20 0 437m 39m 26m S 10.3 6.7 0:00.31 php-fpm
頁面完全載入後,上述這些程序仍然處於活動狀態。2 秒後,它們被另外 2 個 php-fpm 程序(下)替換,這些程序活動 3 秒。
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 7665 nginx 20 0 444m 47m 28m S 20.9 7.9 0:00.69 php-fpm 7668 nginx 20 0 444m 46m 28m R 20.9 7.9 0:00.63 php-fpm
40% 的 CPU使用率僅用於 1 個未記憶體的請求!
奇怪的事情:
- 頁面載入後CPU 使用率較高
- 當我清除記憶體(W3 和 Varnish)時,只需10% 的 CPU即可載入未記憶體的頁面
- 這種高 CPU 使用率只是在傳遞請求參數或在Wordpress 管理中發生
當我嘗試執行 10 次請求(按 F5 鍵 10 次)時,伺服器停止服務並在 php-fpm 日誌中出現:
警告:
$$ pool www $$伺服器達到 max_children 設置 (10),考慮提高它
我將該值提高到 20,同樣的問題。
我正在使用
pm=ondemand
(pm.max_children=10
和pm.max_requests=500
)。最初我使用的是
pm=dynamic
(pm.max_children=10
,pm.start_servers=1
,pm.min_spare_servers=1
,pm.min_spare_servers=2
,pm.max_requests=500
) 並且發生了同樣的問題。任何人都可以幫忙,好嗎?任何幫助,將不勝感激!
PS:
- APC 開啟(98% 命中,2% 未命中)
- 伺服器是Amazon Micro (613MB RAM)
- PHP 5.3.26 (fpm-fcgi)
- Linux 版本 3.4.48-45.46.amzn1.x86_64 Red Hat 4.6.3-2(我認為是基於CentOS 5)
很難調試問題出在哪裡。
我會說精簡你的設置。
您正在使用:Varnish + Nginx + PHP-FPM + APC + W3 Total Cache + PageSpeed
為什麼需要清漆?nginx 還可以對靜態頁面進行記憶體。看一眼
fastcgi_cache
PHP-FPM 和 APC 應該沒問題,只要考慮給 APC 足夠的記憶體,以便可以記憶體所有文件而不會出現記憶體問題和碎片。
為什麼需要 W3 Total Cache?根據配置選項,這可能會佔用大量 CPU,例如用於縮小程式碼或記憶體頁面或數據庫呼叫磁碟…
與
mod_pagespeed
- 它是一個處理輸出文件並增加使用 CPU 週期的複雜性的包裝器。所以 - 如果你想要一個更快的網站,我會說解開這個混亂並簡化它:
- 擺脫 Varnish:如果您沒有強大的案例。nginx 可以很好地進行記憶體,並配置 nginx 以利用
fastcgi_cache
和使用套接字與 PHP-FPM 對話。- 擺脫 W3TC:使用
memcached
和memcache 對象記憶體外掛。這是您的數據庫記憶體和對象記憶體。對於記憶體完整頁面,如果需要,只需使用 nginx 或 Varnish。如果您使用batcache在 memcached 中記憶體整個頁面,則可以擺脫為 nginx 或 Varnish 配置整頁記憶體。還嘗試將套接字用於 memcached。- 擺脫
mod_pagespeed
. 閱讀它為您做了哪些優化,並嘗試將它們手動應用到您的部落格主題或圖像上。如果您在 nginx 中使用 gzip,那麼大多數東西都不應該很重要。- 啟用 MySQL 查詢記憶體並查找性能優化的 MySQL 設置。如果你有很多寫入(例如很多評論)考慮使用 InnoDB。
- 使用 PHP 5.4 甚至 PHP 5.5 - 這些版本對性能和記憶體進行了很多改進,應該會給您一些加速和節省記憶體。
更高級的方法:
看看xdebug profiler。這應該讓您了解哪些功能會消耗大量 cpu。該頁面詳細介紹瞭如何使用kcachegrind查看生成的數據。
您可以嘗試查看
strace
程序樹上使用的系統呼叫數量。您需要為此進行-f
標記,並且可能僅列印統計資訊-c
就足以了解可能的問題。我會說應用 KISS 原則,並且僅在您有明確的案例並且工具顯示使用分析的改進時才使用性能或調整東西。