注意到某台 web server 反應速度非常慢, 依序檢查相關資訊如下:
- tail -f /var/log/apache2/access.log 可知 request per second 頗高, 但不確定有多少
- vmstat 回報 ram, cpu, io 都沒什麼 load
- 用 chrome developer tool 看 (Network 頁), 幾乎都耗在 waiting, 傳資料時間仍然很短
- 家裡電腦 ping web server < 200ms
- wget localhost 也要等個數秒以上
綜合以上資訊可知, 機器應該可以負擔, 不是 CPU / RAM / disk IO / 頻寬 / 連線不穩等問題。
依照以前寫 network programming 的經驗, 當 concurrent new connection 量很高, 高出接收 connection 的 daemon 能負擔的量時, 得等一陣子才能連上線, 剩下的處理時間到不會增加多少。所以推測此時 web server 應該是類似的情況, 所以要從縮短受理新 connection 的時間下手。
參考 Apache Performance Tuning 的說明, 最後提高 MaxClients, 縮短 KeepAliveTimeout, 情況就變正常了。
文中提到計算 MaxClients 的相關指令挺方便的:
ps -ylC httpd --sort:rss: 得知 httpd 用的 memory free -k: 得知目前記憶體用量
MaxClients = 可用記憶體 / 單一 httpd 用的記憶體
沒有留言:
張貼留言