Update(2008/7/8): 推薦Topfunky’s bong搭配使用,非常簡單。
做網站效能調校,一件重要的事情就是量測(measure)。調之前測一次,調之後再測一次才知有沒有藥效。
“Server 回應 requests 的速度有多快?” 就是一個最基本的問題。這技巧也叫做黑箱分析(Block-box analytic)。Advanced Rails 一書中給了幾點特別要注意的事項:
- 有台 front end server (Apache,Nginx等)先測試 static files,這個數據是一個上限。Rails 不會比這更快了。
- 找近一點的地方測,減少網路 latency 的變異性
- 不要用 server 同一台測試,雖然 CPU 不太會是問題,但是 I/O 可能會有影響。
觀測的數據除了平均,更要看標準差跟計算信賴區間,因為除了平均之外,低變異也很重要。基本的統計學告訴我們,相差平均一個標準差可以涵蓋 68% 的資料,相差兩個標準差就可以涵蓋 95% 的資料。因此我們可以算出 95% 的信賴區間,也就是 95% 發出的 requests 中,可以在幾秒到幾秒內回應。基本的統計知識是做 analytic 必備,Zed Shaw 為此還寫了篇Programmers Need To Learn Statistics Or I Will Kill Them All。
在 Mac 上透過 MacPorts 安裝 httperf 很簡單,輸入 `sudo port install httperf` 即可。
httperf 的用法
基本用法是指定 Server、Port、URL和總共要發出多少個 requests:
httperf --server project1.local --port 3000 --uri /events --num-conns 1000
其中最重要的 output 資訊就是 Reply rate 有平均和標準差的那一行。要注意的是 httperf 是每五秒抓一次樣本(sample),根據 httperf 的建議是希望至少有 30 個樣本數才能得到準確的標準差,因此當 sample 數太少的時候,要記得把 –num-conns 往上加。
另一種算壓力測試,也就是去測試“Server 每秒可以承受多少 requests?”。請再加上 –rate 跟 –hog 參數:
httperf --server project1.local --port 3000 --uri /events --num-conns 5000 --rate 500 --hog
逐步把 rate 往上調,直到 server 超過極限時,就會開始少 replies (有 requests 被 drop off 了) 並出現 Errors。
Rails 的相關設定
有幾項設定可以增加更多相對比較數據:
- 透過 config.action_controller.perform_caching = false 的設定可以在 production mode 也把所有 caching Page, Action, Fragment 暫時關掉
- 暫時註解掉 before_filter 中的權限檢查
- 透過 session :off 關掉 session
本文參考資料
- Advanced Rails Chap.6 Performance
- Peepcode httperf screencast