使用 httperf 做網站效能分析

Update(2008/7/8): 推薦Topfunky’s bong搭配使用,非常簡單。

做網站效能調校,一件重要的事情就是量測(measure)。調之前測一次,調之後再測一次才知有沒有藥效。

“Server 回應 requests 的速度有多快?” 就是一個最基本的問題。這技巧也叫做黑箱分析(Block-box analytic)。Advanced Rails 一書中給了幾點特別要注意的事項:

  1. 有台 front end server (Apache,Nginx等)先測試 static files,這個數據是一個上限。Rails 不會比這更快了。
  2. 找近一點的地方測,減少網路 latency 的變異性
  3. 不要用 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 的相關設定

有幾項設定可以增加更多相對比較數據:

  1. 透過 config.action_controller.perform_caching = false 的設定可以在 production mode 也把所有 caching Page, Action, Fragment 暫時關掉
  2. 暫時註解掉 before_filter 中的權限檢查
  3. 透過 session :off 關掉 session

本文參考資料

  1. Advanced Rails Chap.6 Performance
  2. Peepcode httperf screencast

% sudo make 上線

你的腦海裡是否曾經出現這樣的聲音:

「這東西太酷了,誰趕快來做一下。」

你是否有很多點子,卻又沒有做事的動力?

sudomake.com 這個地方,每個人都可以成為英雄。無論是需要超人來幫你,亦或你行有餘力能夠助人,都可以來此。

不如就用這則漫畫來解釋它的功能吧:

sudo make(出處)

還是不懂嗎?沒關係,立刻登入開始玩玩看,一切都很簡單明瞭。

前往 sudomake.com

本篇文章共同發佈於Handlino網站

少就是多) Ruby on Rails 簡介

知名的 Web design 線上雜誌 A List apart No.257期少見地刊出 Rails 入門介紹,心血來潮來做翻譯,斷斷續續翻潤了好幾次,覺得文章看起來沒什麼,翻起來好長啊。
終於再度體會 text.plain 果然是最難寫的格式。寫投影片,做翻譯比寫程式還辛苦…orz

以下翻譯自 Creating More Using Less Effort with Ruby on Rails by MICHAEL SLATER

如果你開發網站,想必應該聽過 Ruby on Rails (RoR) 的大名。但是如果是網頁設計師或前端工程師,或除了PHP沒有用過其他框架,那麼採用 Ruby on Rails 方案似乎會是一個很大的改變。在這篇文章中,我希望能夠除去 Ruby on Rails 神秘的面紗,並說服你採取行動,這將會非常值得如果你的需求符合下述的 Ruby on Rails 甜蜜點。

學新方法去做本來就會做的事情,還要同時學新觀念和新技巧,確實會花你一點時間。直接了當地說,即使是 Ruby on Rails,轉換技術都將會摧毀你的生產力。然而,我相信網站開發者如果開始採用 Ruby on Rails,將變得更有生產力做出更好的網站,以及從中獲得更多的樂趣。

Rails樂趣

Ruby on Rails(簡稱Rails)是一個完整的框架,意思是說他包含了前端跟後端。它讓 “要做多種不同工作的人” 開發者能擁有極強有力的工具。即使基本上你只是前端或後端工程師,你仍可以有效率的使用 Ruby on Rails。我們可以清楚定義前端(瀏覽器HTML、CSS和JavaScript)和後端(Ruby和Rails框架)的介面,所以如果你只想要專注在其中一端的話,不需要全盤了解。

如果你是網頁設計師或前端工程師,你會學到如何使用 Ruby on Rails 樣板系統,而且學一點內嵌Ruby程式碼在 View 檔案。這將讓你成為後端開發者更好的夥伴,因為你可以直接操作 Rails 應用程式,而不是讓某人去整合HTML和CSS。

因此無論你用前端或後端工程師的角度採用 Ruby on Rails,可以想想看有哪些專案可以考慮採用?

閱讀全文〈少就是多) Ruby on Rails 簡介〉

使用 Passenger (a.k.a mod_rails) 當做開發環境

Update(2008/6/25): 提昇 MacOS 開發爽度請裝 Pane Putting the pane back into deployment

Update(2008/5/24): 更多參考連結 28 mod_rails / Passenger Resources To Help You Deploy Rails Applications Faster

mod_rails(學名是 Passenger) 出來一段時間了,陸續開始有些使用經驗分享出來,在 production 上還蠻適合RAM有限的 VPS 環境,而這篇 Ask Your Doctor About mod_rails則介紹 mod_rails 也十分適合拿來當做 development 環境,也讓我十分心動:

  1. 厭倦每次都得 mongral_rails start 或 script/server?而且還要佔 terminal tabs。像我手上同時間好幾個案子(?!),常常要切來切去還挺麻煩的。有了 mod_rails 設定好之後,每個網站都隨時 ready 可以用。(怕 memory 浪費?mod_rails 可以經由設定 RailsPoolIdleTime, RailsMaxPoolSize 來限制 process 存在的時間跟數量)
  2. 單一 mongrel process 沒辦法平行處理 requests,當網站圖片東西比較多的時候,速度就慢了。而 mod_rails 在有額外的 request 需求時,會 new process 來支援。
  3. 有 Apache 就可以設定 SSL,只用 mongrel 沒辦法測試 HTTPS 連線。

心動了當然得馬上行動,參考了這篇 Using Passenger on OSX for Rails development,我很順利地在我的 Mac Leopard 上架了起來:

1.安裝 Passenger:

gem install passenger
passenger-install-apache2-module

2.設定 Apache,編輯 /etc/apache2/httpd.conf 或 /etc/apache2/users/ihower.conf,以下是一個範例 (前三行請參考執行 passenger-install-apache2-module 時顯示的訊息) :


LoadModule passenger_module /opt/local/lib/ruby/gems/1.8/gems/passenger-2.0.1/ext/apache2/mod_passenger.so
PassengerRoot /opt/local/lib/ruby/gems/1.8/gems/passenger-2.0.1
PassengerRuby /opt/local/bin/ruby
PassengerMaxPoolSize 3
PassengerPoolIdleTime 300
RailsEnv development

<Directory "/Users/ihower/RailsCode">
Order allow,deny
Allow from all
</Directory>

NameVirtualHost *:80

<VirtualHost *:80>
DocumentRoot "/Users/ihower/RailsCode/project1/public"
ServerName project1.local
</VirtualHost>

<VirtualHost *:80>
DocumentRoot "/Users/ihower/RailsCode/project2/public"
ServerName project2.local
</VirtualHost>

  1. 設定 /etc/hosts 指定本地端 domain:

    127.0.0.1 project1.local
    127.0.0.1 project2.local

4.打開 Mac 上的 System Preferences ➔ Sharing ➔ Web Sharing,啟動 Apache。
5.打開你的瀏覽器,輸入 project1.local, project2.local 順利的話就可以看到啦。

問: 修改了 /vendor/ 下面的東西要重新載入怎麼辦?
答:mod_rails 的用法挺有趣的,請執行:

touch tmp/restart.txt

如果要一直修改 vendor 的話(在寫plugin嗎?),可以下載 Automation with RStakeout,然後執行:

ruby rstakeout.rb "touch tmp/restart.txt" "vendor/**/*"

這樣一有更動就會reload了,cool。

Github 分散式版本控制的殺手級應用

最近常常推薦人家去玩 Github,到底有用在哪裡? 就來寫一篇廣告文吧。

GitHub 是基於 Git 這套分散式版本控制系統的 Repository hosting 應用,一開始我也沒聽過 Git ,覺得用 Subversion 好好的為什麼這些人要換。抱著嚐鮮的念頭用了之後,發現實在好玩極了。目前已經有非常多的 Rails 相關應用都已經在上面進行開發,包括Ruby on Rails coreRSpecwill_paginate pluginattachment fu_plugin等等,幾乎所有我用到的 Rails plugins 在上面都可以找的到。

到底有那些特色呢?

  1. 你可以 watch 你所關注的專案,Github 提供 private RSS 訂閱。有了這個功能,我有用到的 plugins 的進度我都可以掌握。
  2. 可以看到哪個專案最多人 watch,比較哪個比較多人用(比較多人用比較保險?)。
  3. 你可以 follow 你所關注的開發者動態(例如ihower),看看又有什麼新的好東西 :p
  4. 你可以對專案 fork 出自己的版本進行開發,甚至最後發 pull request 要求 merge。
  5. 根據 fork 我就可以看到這個專案的分支 Network 狀態。有時候可能本來的程式不好用或爛掉了,你就可以查看看有沒有人寫做 patch 改進。
  6. 漂亮的 Source code browser,並可以針對 commit 來做留言討論,甚至標明是 source code 的哪一行(請把滑鼠移到原始碼的行數旁)。
  7. 提供 tarball 下載,即使沒裝 git command 也十分方便下載。
  8. GitHub 可以直接當做 Ruby gem server
  9. 針對 Repository 可以搜尋 code, commit message, author 等
  10. Git (我的感覺)比 SVN 又快又穩,用 SVN 常常會因為檔案太多中途失敗。

Github 根本就是 Open source developer 的 social networking 啊,聽說這股浪潮已經從 Ruby/Rails 圈吹到 JavaScript 跟 Perl 了(?),這都要歸功於 Git 這套優異的分散式版本控制系統。

BTW,幫忙宣傳 Jserv 在這週二的演講:我愛 Git – 有效使用分散式版本控制系統

Ruby & Rails on Rails 進階書單

都2008年了,還看我前年列的書單讓我有點不安,只好再整理一次。這次不列”所有”了,紅了之後入門書太多。而是整理我覺得值得一念的書及PDF。

Ruby

Ruby on Rails