這是一篇我們運營JavaEye網站將近半年時間所得到經驗的總結。目前在整個rails社區,都極少有運營rails大訪問量網站經驗的人詳細的談這個話題。至於國內,rails應用都停留在學習和嘗試階段,真正投入商業運營的基本找不到,所以談這個話題為時太早,頗有對牛彈琴的感覺。所以權當是個人的總結性文章吧,也不會很詳細的展開談論,能對大家有所啟發就好。
一、硬體
1、CPU
ruby解析器相對於JVM,PHP解析器來說,比較低效,可能會導致比較多的context switch,因此提高CPU和記憶體之間的匯流排頻寬和傳輸速度會對ruby應用有比較大的效能提升。在目前主流的x86_64 CPU當中,AMD Opteron在CPU晶片內建記憶體控制器,可以有效提高CPU和記憶體資料交換速度,提高context switch能力。所以用AMD Opteron比Intel Xeon EM64T效能要好很多。
2、實體記憶體
ruby是以進程方式啟動並執行,rails應用的並發響應能力主要取決於ruby進程的數量。一個最簡單的rails應用,一個ruby進程佔用的實體記憶體一般不過30-40MB,但是對於真正複雜的,而且資料庫訪問頻繁,資料量大的rails應用來說,ruby進程穩定的實體記憶體佔用至少100多MB,經常達到200多MB,甚至300MB。以開10個ruby進程計算,那麼實體記憶體使用上限就是3GB,所以4GB實體記憶體是起碼的。
二、作業系統
1、Linux distro
對於AMD x86_64的CPU來說,SLES要比RHEL有更多的最佳化。
2、32位版本還是64位版本
應該使用64位版本作業系統,以充分發揮x86_64 CPU的效能,並且x86_64的Linux很多Kernel參數也大很多,代價就是需要更多的實體記憶體。所以記憶體多多益善。
3、檔案系統
rails會對每個瀏覽器會話在硬碟產生session檔案,一個繁忙的網站,臨時檔案目錄下面有上萬乃至幾萬個session檔案是很常見的現象。對於這種目錄下面幾萬個小檔案的存取,reiserfs要比ext3效能好很多倍。
三、Web Server
主流的選擇是apache2.2,lighttpd,litespeed。apache2.2可以首先排除,lighttpd和litespeed都不錯,但我會選擇開源免費的lighttpd。至於lighttpd的各種最佳化參數這裡不談。
四、ruby的部署
1、ruby GC
可以使用railsbench提供的GC patch,以最佳化ruby記憶體使用量,降低GC頻率,提高throughput,代價就是ruby進程的實體記憶體佔用加倍。所以實體記憶體越多越好,4G根本不夠用,8G,16G絕對不嫌多。
2、FCGI還是mongrel
ruby進程可以以FCGI方式來運行,以FastCGI協議和Web Server通訊,也可以以HTTP Server方式來運行(即Mongrel),以HTTP協議和Web Server通訊,這兩種方式效能上沒有什麼差異。FCGI方式,在單機上面通過Unix Socket和Web Server通訊,效率比走TCP Port要高。
3、開多少個ruby進程
ruby進程數量和web server的connection數量的比例沒有定規,少了多了都會降低效能,要靠實踐去摸索,也要參考CPU和記憶體資源的使用狀況。