我們有一個用 Code Igniter 編寫的基於 imagemagic 的 PHP 圖像 api。我們有 nginx/php-fpm 後面的 api。我們知道Imagemagic部分很重,但我們試著讓整體吞吐量越來越高。
我們已經閱讀了 30 多篇關於 Nginx 的最佳化文章。透過主要遵循文章並進行 TCP 最佳化,我們能夠將輸出從 300 個請求/分鐘增加到 350 個請求/分鐘。
這樣我們就嚴重影響了伺服器的載入時間。我可以告訴你沒有平均負載,因為這是一個新的盒子,而且它是基於 Nginx 的。我們過去有 Apache 工作人員(每分鐘少於 300 個請求)。現在,我們的平均負載為 350req/m,為 20。
當我們使用 htop 調查進程時,通常我們會看到大約 20 個 php-fpm 進程大量使用所有 16 個 CPU,並且內存在 24GB 中的 2GB 左右。
我們的目標是大幅減少系統負載。我希望有經驗的使用者分享他們的知識,去哪裡尋找,嘗試什麼。我會發布您所要求的任何數字,但我不想一開始就用這個來填滿帖子。
您將如何繼續減少系統負載但仍保持吞吐量。
答案1
由於我們已經確定這是一個純粹的 CPU 佔用問題(沒有 iowait),所以我真的看不到任何方法可以在不添加更多資源的情況下保持相同的吞吐量。調低 PHP 進程的最大數量或增加更多 CPU 核心。
或讓開發人員使用 ImageMagick 以外的其他東西。
答案2
如果您有重複的請求,您可以檢查 fastcgi 快取(http://wiki.nginx.org/HttpFastcgiModule) 或在 nginx 前面使用 varnish。
這將使您能夠快取處理後的映像,而不必再次執行繁重的 CPU 處理。
答案3
由於您的問題指出 PHP-FPM 進程位於 TOP cpu 中,因此我想像您正在使用 ImageMagick PHP 庫(http://php.net/imagick)。
請您的開發人員測試由 ImageMagick 二進位直接完成影像處理的場景(例如 /usr/bin/[compare、import、display ...]。
如果直接使用二進位文件,則使用 php 函數 exec() 並將呼叫封裝到 ImageMagick 二進位文件,然後看看效果如何(就 CPU 和持續時間而言)。
@附加資訊:https://stackoverflow.com/questions/4323672/how-do-i-get-imagemagick-installed
答案4
開發者之道
- 嘗試減少影像處理的 php 開銷。
- 嘗試使用較少的資源進行影像處理。使用準備好的鏡像或改變一些性能要求較低的操作
管理方式
- 使用更強大的CPU