Nginx
PHP FPM 狀態正在完成但從未完成
我們正在使用 Nginx 和 PHP-FPM 在 Ubuntu 14.04 上執行 Symfony 應用程序
問題是個別 PHP FPM 偶爾會掛在我們的生產伺服器上。
我有狀態頁面的輸出:
pid: 13416 state: Finishing start time: 08/Sep/2014:12:35:29 +1000 start since: 10548 requests: 3 request duration: 158138427297 request method: GET request URI: /app.php?searchText=Search+term&page=2 content length: 0 user: - script: /var/projects/site_path/app.php last request cpu: 0.00 last request memory: 0
我無法弄清楚為什麼這個過程會掛起。
如果我跟踪這個過程,它只是在循環:
# strace -p 13416 gettimeofday({1410154710, 385743}, NULL) = 0
我檢查了 Nginx 訪問日誌並匹配了請求,請求很好,它返回 200 並且不能使用 url 複製錯誤)。
任何幫助將不勝感激
訪問日誌:
172.30.12.110 - - [08/Sep/2014:12:35:29 +1000] "GET /search?searchText=Search+term&page=2 HTTP/1.1" 200 11174 "/search?searchText=Search+term" "Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; MATPJS; rv:11.0) like Gecko" 172.30.12.110 - - [08/Sep/2014:12:35:32 +1000] "GET /search?searchText=Search+term&page=2 HTTP/1.1" 200 11174 "-" "Mediapartners-Google" 172.30.12.110 - - [08/Sep/2014:12:35:34 +1000] "GET /search?searchText=Search+term&page=2 HTTP/1.1" 200 11169 "-" "Mediapartners-Google" 172.30.12.110 - - [08/Sep/2014:12:35:51 +1000] "GET /search?searchText=OSearch+term&page=3 HTTP/1.1" 200 11158 "/search?searchText=Oven+baked+duck+and+shitake+rissotto&page=2" "Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; MATPJS; rv:11.0) like Gecko" 172.30.12.110 - - [08/Sep/2014:12:36:50 +1000] "GET /profile/ HTTP/1.1" 200 8108 "/search?searchText=Oven+baked+duck+and+shitake+rissotto&page=4" "Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; MATPJS; rv:11.0) like Gecko
事實證明,我們在某些情況下使用了無效的 Memcached 鍵。這導致 Memcached 沒有錯誤地死掉,而 PHP 程序仍然活著。
在我們的例子中,我們使用 Unix 域套接字和連接重用 (enablereuse=on) 配置了 mod_proxy_fastcgi,但是正如 lkraav 在https://github.com/icing/mod_h2/issues/62的評論中所述:
# UDS does not currently support connection reuse
這就是導致 FPM 子程序堆積在完成狀態的原因。去掉連接重用解決了這個問題,大大穩定了系統。