不斷地重新載入 PHP-FPM
我們有一個執行 nginx 和 PHP-FPM 的負載相當大的伺服器。我們在這台伺服器上有 6 個網站,執行 PHP-FPM 和 nginx。軟體都是 vBulletin 3.8 和 WordPress。數據庫位於單獨的伺服器上。
現在,因為這些是非常受歡迎的網站,我們通常一次有 7-8,000 名訪問者線上,每個頁面大部分都訪問數據庫。我相信這是我們問題的根源。
因為我們在 MySQL 伺服器上有這麼多大型數據庫,而且因為查詢在軟體中可以,老實說,要好得多,我認為 MySQL 偶爾會無法及時將結果返回給 PHP,從而產生級聯效應,最終導致一切都停止,直到我們重新載入 PHP-FPM。在我們這樣做之後,事情又開始正常工作了。
我在解決此問題時遇到問題的原因是因為我無法從日誌中真正辨別出任何東西。在 MySQL 慢查詢日誌中,當停機發生時,我看不到任何有趣的東西。在 nginx 日誌中,我看到數以千計的條目說讀取請求超時或連接超時(到 PHP-FPM)。在 PHP-FPM 日誌中,我看到很多行說“執行超時(31 秒),終止
所以在這一點上,我完全不知道在哪裡尋找問題。顯然,無論發生什麼都在發生,因為這些腳本有時執行得不夠快(通常它們會在一秒鐘內載入,但發生的事情會導致載入時間飆升)。這一天發生很多次,對我們來說已經成為一個相當大的問題。
現在我只是有一個 crontab 來服務 php5-fpm 每 10 分鐘重新載入一次,它可以解決崩潰問題。當然,當 PHP 重新載入時,nginx 會拋出 502 網關錯誤,所以解決不了多少。
PHP 正在執行 APC 記憶體,如果這很重要的話。我在一些地方讀到 APC 在某些情況下會導致掛起。
任何指針都會有所幫助。我真的不想一直擔心這台機器。
當然可以提供更多資訊。讓我知道你需要什麼。
**更新:**我剛剛將 apc.php 複製到 Web 根目錄並訪問它以查看我們的統計資訊。事情看起來不錯。然後我點擊連結轉到使用者統計資訊,然後 BOOM 伺服器立即掛起。我重新載入了 php-fpm,然後重新載入了使用者統計頁面,一切正常。等了一分鐘,再次重新載入,伺服器再次掛起。
所以這肯定似乎與 APC 有關。問題是 - 我們如何解決它?
APC 配置:
[apc] apc.enabled="1" apc.stat = "1" apc.max_file_size = "2M" apc.localcache = "1" apc.localcache.size = "256" apc.shm_segments = "1" apc.ttl = "3600" apc.user_ttl = "7200" apc.gc_ttl = "3600" apc.cache_by_default = "1" apc.filters = "" apc.write_lock = "1" apc.num_files_hint= "10000" apc.user_entries_hint="10000" apc.shm_size = "1G" apc.mmap_file_mask=/tmp/apc.XXXXXX apc.include_once_override = "0" apc.file_update_protection="2" apc.canonicalize = "1" apc.report_autofilter="0" apc.stat_ctime="0"
更新 2:我們在這方面取得了一些進展。事實證明,WordPress 記憶體外掛(W3 Total Cache)是導致崩潰的原因。我們仍然不知道為什麼,但禁用它後,我們已經執行 PHP 近 4 個小時了,沒有重新載入、沒有減速、沒有崩潰。我們仍在 vBulletin 論壇上使用 APC,完全沒有問題。有什麼方法可以確定為什麼APC 會崩潰?我很想在我們的 WordPress 安裝上使用它,但不會以脆弱的系統為代價。
您正在使用 php-fpm,所以我建議對允許 php-fpm 的孩子存活多長時間更加積極。您需要在短期執行緒/子執行緒和穩定性之間找到最佳位置。恕我直言,php-fpm 預設值對於任何生產系統來說都是慷慨的。
我會為您的生產池減少**pm.max_requests的數量。**我認為預設值是 200。我會從 50 開始,看看會帶你去哪裡。
失敗/補充,您還可以嘗試這些全域選項(AFAIK 預設情況下它們都被禁用):
emergency_restart_threshold=3 emergency_restart_interval=1m process_control_timeout=5s
這是什麼意思?如果 3 個 PHP-FPM 子程序在 1 分鐘內以 SIGSEGV 或 SIGBUS 退出(即崩潰),那麼 PHP-FPM 應該會自動重新啟動。子程序等待 5 秒等待對來自主程序的信號作出反應。
這應該讓您的 PHP 工作執行緒池保持良好、新鮮和乾淨。允許工人提供請求的時間越長,它就會變得越不穩定。記憶體洩漏的風險也更高。
這是我在這裡提到的所有配置選項以及其他選項的一個很好的概述:http: //myjeeva.com/php-fpm-configuration-101.html
希望這些提示對您有所幫助!記得調整和觀察,不幸的是,這一切似乎沒有一個經驗法則,有太多的變數會影響 PHP 的行為和穩定性。