nginxphp-fpm配置過程中最大問題是內泄漏出問題:伺服器的負載不大,但是記憶體佔用迅速增加,很快吃掉記憶體接著開始吃交換分區,系統很快掛掉。
google了一天,終於發現些有用的東西,其實根據官方的介紹,php-cgi不存在記憶體流失,每個請求完成後php-cgi會回收記憶體,但是不會釋放給作業系統,這樣就會導致大量記憶體被php-cgi佔用。
官方的解決辦法是降低PHP_FCGI_MAX_REQUESTS的值,我用的是php-fpm,對應的php-fpm.conf中的就是max_requests,該值的意思是發送多少個請求後會重啟該線程,我們需要適當降低這個值,用以讓php-fpm自動的釋放記憶體,不是大部分網上說的51200等等,實際上還有另一個跟它有關聯的值max_children,這個是每次php-fpm會建立多少個進程,這樣實際上的記憶體消耗是max_children*max_requests*每個請求使用記憶體,根據這個我們可以預估一下記憶體的使用方式,就不用再寫指令碼去kill了。
下面其實是重啟指令碼的過程,並不是什麼很嚴重的事情,但是我們要小心,不是說一直重啟就是好的,因為重啟會導致cpu的使用率飆升,系統負載巨大,所以還是平衡上面的資料比較重要。
Mar 08 16:13:33.113138 [NOTICE] fpm_got_signal(), line 48: received SIGCHLD
Mar 08 16:13:33.113202 [WARNING] fpm_children_bury(), line 215: child 23051 (pool default) exited on signal 11 SIGSEGV after 747.428492 seconds from start
Mar 08 16:13:33.113622 [NOTICE] fpm_children_make(), line 352: child 24511 (pool default) started