PHP5-FPM with Nginx 效能調教 (2)

承上篇PHP5-FPM with Nginx 效能調教 (1)

PHP5-FPM

最近觀察到許多次 php5-fpm 突然不工作的狀況,即連上網站吃到 502 response status。最後於 nginx 的 error log 中找到這樣的錯誤訊息:

[14-Dec-2014 12:20:45] ERROR: failed to ptrace(PEEKDATA) pid 13305: Input/output error (5)
[14-Dec-2014 12:20:45] NOTICE: finished trace of 13305
[14-Dec-2014 12:20:45] NOTICE: child 14008 stopped for tracing
[14-Dec-2014 12:20:45] NOTICE: about to trace 14008
[14-Dec-2014 12:20:45] ERROR: failed to ptrace(PEEKDATA) pid 14008: Input/output error (5)
[14-Dec-2014 12:20:45] NOTICE: finished trace of 14008
[14-Dec-2014 12:20:45] NOTICE: child 20877 stopped for tracing
[14-Dec-2014 12:20:45] NOTICE: about to trace 20877
[14-Dec-2014 12:20:45] ERROR: failed to ptrace(PEEKDATA) pid 20877: Input/output error (5)

原因是由於檔案同時開啟數量的限制:

In your case, the stack trace (to determine what the script is doing) is failing. If you're running out of processes, it is because either:

After php-fpm stops the process to trace it, the process fails to resume because of the error tracing it
The process is resuming but continues to run forever.

唯一辦法即是關掉 slow_log 以及 request_slowlog_timeout,網站便恢復穩定正常!強烈建議實際上線 production 的伺服器不要開啟 php5-fpm 的 slowlog 功能。

PHP5-FPM 參數調教

另外,最近也透過htop觀察到,雖然我們 php5-fpm 的 child process 數量給到破百,但常常同時在執行的數量只有1~3個。

應是因為一般的網站只有在使用者連進來的那一瞬間需要做頁面呈現上的處理,處理完便沒事了,故當然不可能隨時都一直有破百人同時進來,需要這麼多的 php5-fpm process。

所以,除透過自身伺服器可用資源(RAM, # of CPU Core)去調整 child process 數量外,也可透過自身網站的需求去做評估。若網站執行效率不會一直卡著(正常有這狀況也不會讓網站上線吧XDDD),也沒有類似 socket / long polling 之類的需求(即使用者需一直跟伺服器發出 request),那其實 php5-fpm 預設的設定就很足夠惹~

Memcached

通常我們架設 php 網站,例如:wordpress,都會使用 memcached 來做快取,以加快整體網站速度,與降低伺服器與資料庫的承載(loading)。

建議可利用htop觀察 memcached 的使用量,並做適當的調整,如不夠則可以給予 memcached 更多的 memory 供使用。如:

5874 nobody 20 0 246M 121M 2256 S 0.0 1.5 0:00.00 /usr/bin/memcached -m 1536 -p 11211 -u nobody -l 127.0.0.1

可看到目前 memcached 使用了 121MB,而我們實際上給予 1536MB,還有相當充裕的使用空間。

Reference######