一個(gè)RoR的站點(diǎn)性能優(yōu)化的故事(4)原文鏈接: http:///articles/2006/04/03/the-adventures-of-scaling-stage-4 中文鏈接: http:///2009/08/01/00/17/一個(gè)ror的站點(diǎn)性能優(yōu)化的故事4.html 第四篇 速度快和穩(wěn)定 在2005年的11月至2006年的3月,許多優(yōu)化的工作都在這期間完成。這里面不少工 作都不得不變成了配置的一部分(比如第三篇提到的請(qǐng)求分發(fā)的監(jiān)控腳本)。最終經(jīng)過了幾周的運(yùn)行,這個(gè)網(wǎng)站被證明是穩(wěn)定且速度快的。另外,我們也已經(jīng)能完成 一點(diǎn)從用戶和社區(qū)運(yùn)營(yíng)人員那里的需求。 完成過程中的閃光點(diǎn) 二月份,一些小的調(diào)整讓系統(tǒng)性能變得更好。 第一,當(dāng)用戶編寫個(gè)人消息和在論壇發(fā)帖時(shí),我們利用AJAX來對(duì)其內(nèi)容進(jìn)行預(yù)覽。雖然這不是性能的殺手,但把這因素剔除來減輕壓力是有意思的。呃,在AOL瀏覽器中prototype會(huì)崩潰。 另外,將作為lighttpd守護(hù)進(jìn)程對(duì)待。這樣崩潰的現(xiàn)象在1.4.8及以后的版本就很少出現(xiàn)了,但仍然需要監(jiān)控進(jìn)程的情況。要知道如果lighttpd down了整個(gè)網(wǎng)站就down了。所以得看好它。(譯者評(píng):這里可能會(huì)出現(xiàn)單點(diǎn)失敗的情況,clear & dirty) 將lighttpd作為daemontools 來跑是非常簡(jiǎn)單的。簡(jiǎn)單配置以后(具體配置這些寫得很清楚 http://www./daemontools.html)你在ROR的service樹下面用一行腳本來用damontools 配置lighttpd服務(wù)。你會(huì)知道并且愛上Rails最初的script/server。 #!/bin/sh /usr/sbin/lighttpd -D -f /etc/lighttpd/lighttpd.conf 這樣就啟動(dòng)好就運(yùn)行了。你可以通過lighttpd的配置來簡(jiǎn)單的設(shè)置一下,發(fā)送 lighttpd的進(jìn)程ID或這信號(hào)SIGINT到你后臺(tái)的監(jiān)控中。然后需要注意的是如果你的網(wǎng)站流量非常大就需要把那些不能再完成了服務(wù)請(qǐng)求通過 SIGKILL殺死。新發(fā)布的lighttpd1.4.11分發(fā)請(qǐng)求時(shí)候的僵死越來越少了,似乎這種情況完全沒了。但我們將繼續(xù)通過腳本監(jiān)控它。 到此是這一些列文章的結(jié)束了?,F(xiàn)在服務(wù)器每天支撐1.2M的PV(100GB的流量)。
總結(jié)以及以后的計(jì)劃 以下是這四個(gè)月被證明是非常有用的優(yōu)化手段: 系統(tǒng)優(yōu)化: >使用Linux 2.6代替2.4 >使用自己編譯的Ruby 1.8.4 >使用Mysql官方的二進(jìn)制版本 >使用lighttpd 1.4.11代替以前的 >使用memcache-client代替Ruby-MemCache >使用了更少數(shù)量的dispatchers >并且監(jiān)控你的dispathchers 代碼優(yōu)化: >避免使用ROR的組建 components >用memcached儲(chǔ)存費(fèi)時(shí)的計(jì)算 >用memcached來存儲(chǔ)session >如果你的站點(diǎn)很受歡迎就不要使用live-previews >使用異常通知exception notification來捕捉可能的異常 另外不要完全相信這些總結(jié)。優(yōu)化是一個(gè)發(fā)展中的東西。 你需要一直對(duì)網(wǎng)站進(jìn)行監(jiān)控,包括你的服務(wù)器和所有相關(guān)的軟件。 強(qiáng)烈建議不僅僅只監(jiān)控服務(wù)是否起來了,還好監(jiān)控服務(wù)器的壓力,響應(yīng)時(shí)間等等。用Nagios和Cacti結(jié)合起來做這些工作被我們證明是很有用的。 提 醒注意的是,需要讀讀所有你使用的軟件包的改變?nèi)罩荆纯葱碌陌姹局薪鉀Q了什么已經(jīng)存在的問題,可能產(chǎn)生哪些新問題。不需要強(qiáng)制升級(jí)所有的更新,但對(duì)你正 困擾的問題在新版本中別解決了,你就一定要升了。你可以在測(cè)試環(huán)境中進(jìn)行測(cè)試,減少當(dāng)機(jī)時(shí)間,避免升級(jí)帶來的潛在問題。 請(qǐng)留心你網(wǎng)站代碼的變化。一般來說,應(yīng)該多想想我要做什么。一個(gè)像Rails這樣聰明的框架會(huì)讓你有機(jī)會(huì)去思考,而不是每天寫些重復(fù)性的代碼。要聰明的使用時(shí)間。 一條SQL語句或單個(gè)循環(huán)可能在你開發(fā)用的筆記本上跑的很快,但是在產(chǎn)品環(huán)境中同時(shí)并發(fā)執(zhí)行成百上千次或產(chǎn)品中數(shù)據(jù)量比較大都有可能導(dǎo)致網(wǎng)站變慢。 性能調(diào)優(yōu)準(zhǔn)則 寫大文件的日志意味這你整個(gè)系統(tǒng)的IO補(bǔ)償糟糕,如果你在產(chǎn)品環(huán)境中不要寫太多太詳細(xì)的日志,系統(tǒng)將會(huì)比你測(cè)試的結(jié)果跑得好得多。 使用過的工具: 把這些都準(zhǔn)備好需要一些時(shí)間、耐心和知識(shí),也偶爾需要Google搜索一下。 將來還要處理的事情 隨著memcache-client庫的發(fā)布,Robot Coop公司又發(fā)布了另一個(gè)小的庫,名字叫做cached_model ,這是基于memcached用于減輕數(shù)據(jù)庫重復(fù)查詢,原理就是在查詢之前通過子類Active::Base來檢查memcached中的內(nèi)容。 我在1.0版本它出現(xiàn)的時(shí)候,看過一下,覺得還是很有發(fā)展的。那個(gè)時(shí)候它不能很好的集成,經(jīng)常胡亂拋錯(cuò)。由于當(dāng)時(shí)我們忙于調(diào)試其它的問題,就沒有仔 細(xì)地去 解決這些問題。在此期間,cached_model版本升級(jí)到了1.1.0,也修復(fù)了多個(gè)bug。這個(gè)東西也將包括與我們將來優(yōu)化的路線圖當(dāng)中了。 在第三篇的時(shí)候我們碰到了一個(gè)“分發(fā)請(qǐng)求僵住”的問題,我們將回來再看看FastCGI ,更通常的辦法是用lighttpd也支持的SCGI。 有Zed Shaw發(fā)布了新的軟件Mongrel 已經(jīng)開始出售了。它作為“比WEBrick”更好的應(yīng)用服務(wù)器,將純HTTP放到FastCGI中,非常值得多看看。在讀者評(píng)論中 有人說早期Dan Kubb提到用Canditional GET ,它的潛在好處是在緩存頁面不變時(shí)它可以用瀏覽器來緩存頁面。我只是簡(jiǎn)單地看了一下它的標(biāo)題,Rails插件看上去還不錯(cuò),很容易集成進(jìn)來。 有個(gè)比較大的變化,盡管我曾經(jīng)提倡使用Mysql的全文檢索,但現(xiàn)在我正在基于Rails的一個(gè)搜索插件工作,它很容易無縫滴集成到Hyper Estraier 搜索引擎中。如果它跑的很好(性能好和數(shù)據(jù)保護(hù)),我們將丟掉全文檢索,弄一個(gè)純InnoDB的數(shù)據(jù)庫配置,并且向鎖表和非事務(wù)的測(cè)試說再見了,同時(shí)這樣 也不能使用ROR的schema.rb了。 說道這里,我們升級(jí)到了了最近的Rails1.1。盡管這次升級(jí)對(duì)于性能并沒有太大的必要,但是它有另外受歡迎的地方,它使得我們代碼變得漂亮簡(jiǎn)介了。 謝謝看過這一系列文章的人們。我真誠的希望我對(duì)我們案例的詳細(xì)描述能夠避免再去做我們已經(jīng)做好了的一些研究和調(diào)試工作。如果你需要任何幫助,只要記下我的email,通過聯(lián)系limited overload我可以作為咨詢顧問來幫助你。 一個(gè)RoR的站點(diǎn)性能優(yōu)化的故事(4)原文鏈接: http:///articles/2006/04/03/the-adventures-of-scaling-stage-4 中文鏈接: http:///2009/08/01/00/17/一個(gè)ror的站點(diǎn)性能優(yōu)化的故事4.html 第四篇 速度快和穩(wěn)定 在2005年的11月至2006年的3月,許多優(yōu)化的工作都在這期間完成。這里面不少工 作都不得不變成了配置的一部分(比如第三篇提到的請(qǐng)求分發(fā)的監(jiān)控腳本)。最終經(jīng)過了幾周的運(yùn)行,這個(gè)網(wǎng)站被證明是穩(wěn)定且速度快的。另外,我們也已經(jīng)能完成 一點(diǎn)從用戶和社區(qū)運(yùn)營(yíng)人員那里的需求。 完成過程中的閃光點(diǎn) 二月份,一些小的調(diào)整讓系統(tǒng)性能變得更好。 第一,當(dāng)用戶編寫個(gè)人消息和在論壇發(fā)帖時(shí),我們利用AJAX來對(duì)其內(nèi)容進(jìn)行預(yù)覽。雖然這不是性能的殺手,但把這因素剔除來減輕壓力是有意思的。呃,在AOL瀏覽器中prototype會(huì)崩潰。 另外,將作為lighttpd守護(hù)進(jìn)程對(duì)待。這樣崩潰的現(xiàn)象在1.4.8及以后的版本就很少出現(xiàn)了,但仍然需要監(jiān)控進(jìn)程的情況。要知道如果lighttpd down了整個(gè)網(wǎng)站就down了。所以得看好它。(譯者評(píng):這里可能會(huì)出現(xiàn)單點(diǎn)失敗的情況,clear & dirty) 將lighttpd作為daemontools 來跑是非常簡(jiǎn)單的。簡(jiǎn)單配置以后(具體配置這些寫得很清楚 http://www./daemontools.html)你在ROR的service樹下面用一行腳本來用damontools 配置lighttpd服務(wù)。你會(huì)知道并且愛上Rails最初的script/server。 #!/bin/sh /usr/sbin/lighttpd -D -f /etc/lighttpd/lighttpd.conf 這樣就啟動(dòng)好就運(yùn)行了。你可以通過lighttpd的配置來簡(jiǎn)單的設(shè)置一下,發(fā)送 lighttpd的進(jìn)程ID或這信號(hào)SIGINT到你后臺(tái)的監(jiān)控中。然后需要注意的是如果你的網(wǎng)站流量非常大就需要把那些不能再完成了服務(wù)請(qǐng)求通過 SIGKILL殺死。新發(fā)布的lighttpd1.4.11分發(fā)請(qǐng)求時(shí)候的僵死越來越少了,似乎這種情況完全沒了。但我們將繼續(xù)通過腳本監(jiān)控它。 到此是這一些列文章的結(jié)束了?,F(xiàn)在服務(wù)器每天支撐1.2M的PV(100GB的流量)。
總結(jié)以及以后的計(jì)劃 以下是這四個(gè)月被證明是非常有用的優(yōu)化手段: 系統(tǒng)優(yōu)化: >使用Linux 2.6代替2.4 >使用自己編譯的Ruby 1.8.4 >使用Mysql官方的二進(jìn)制版本 >使用lighttpd 1.4.11代替以前的 >使用memcache-client代替Ruby-MemCache >使用了更少數(shù)量的dispatchers >并且監(jiān)控你的dispathchers 代碼優(yōu)化: >避免使用ROR的組建 components >用memcached儲(chǔ)存費(fèi)時(shí)的計(jì)算 >用memcached來存儲(chǔ)session >如果你的站點(diǎn)很受歡迎就不要使用live-previews >使用異常通知exception notification來捕捉可能的異常 另外不要完全相信這些總結(jié)。優(yōu)化是一個(gè)發(fā)展中的東西。 你需要一直對(duì)網(wǎng)站進(jìn)行監(jiān)控,包括你的服務(wù)器和所有相關(guān)的軟件。 強(qiáng)烈建議不僅僅只監(jiān)控服務(wù)是否起來了,還好監(jiān)控服務(wù)器的壓力,響應(yīng)時(shí)間等等。用Nagios和Cacti結(jié)合起來做這些工作被我們證明是很有用的。 提 醒注意的是,需要讀讀所有你使用的軟件包的改變?nèi)罩荆纯葱碌陌姹局薪鉀Q了什么已經(jīng)存在的問題,可能產(chǎn)生哪些新問題。不需要強(qiáng)制升級(jí)所有的更新,但對(duì)你正 困擾的問題在新版本中別解決了,你就一定要升了。你可以在測(cè)試環(huán)境中進(jìn)行測(cè)試,減少當(dāng)機(jī)時(shí)間,避免升級(jí)帶來的潛在問題。 請(qǐng)留心你網(wǎng)站代碼的變化。一般來說,應(yīng)該多想想我要做什么。一個(gè)像Rails這樣聰明的框架會(huì)讓你有機(jī)會(huì)去思考,而不是每天寫些重復(fù)性的代碼。要聰明的使用時(shí)間。 一條SQL語句或單個(gè)循環(huán)可能在你開發(fā)用的筆記本上跑的很快,但是在產(chǎn)品環(huán)境中同時(shí)并發(fā)執(zhí)行成百上千次或產(chǎn)品中數(shù)據(jù)量比較大都有可能導(dǎo)致網(wǎng)站變慢。 性能調(diào)優(yōu)準(zhǔn)則 寫大文件的日志意味這你整個(gè)系統(tǒng)的IO補(bǔ)償糟糕,如果你在產(chǎn)品環(huán)境中不要寫太多太詳細(xì)的日志,系統(tǒng)將會(huì)比你測(cè)試的結(jié)果跑得好得多。 使用過的工具: 把這些都準(zhǔn)備好需要一些時(shí)間、耐心和知識(shí),也偶爾需要Google搜索一下。 將來還要處理的事情 隨著memcache-client庫的發(fā)布,Robot Coop公司又發(fā)布了另一個(gè)小的庫,名字叫做cached_model ,這是基于memcached用于減輕數(shù)據(jù)庫重復(fù)查詢,原理就是在查詢之前通過子類Active::Base來檢查memcached中的內(nèi)容。 我在1.0版本它出現(xiàn)的時(shí)候,看過一下,覺得還是很有發(fā)展的。那個(gè)時(shí)候它不能很好的集成,經(jīng)常胡亂拋錯(cuò)。由于當(dāng)時(shí)我們忙于調(diào)試其它的問題,就沒有仔 細(xì)地去 解決這些問題。在此期間,cached_model版本升級(jí)到了1.1.0,也修復(fù)了多個(gè)bug。這個(gè)東西也將包括與我們將來優(yōu)化的路線圖當(dāng)中了。 在第三篇的時(shí)候我們碰到了一個(gè)“分發(fā)請(qǐng)求僵住”的問題,我們將回來再看看FastCGI ,更通常的辦法是用lighttpd也支持的SCGI。 有Zed Shaw發(fā)布了新的軟件Mongrel 已經(jīng)開始出售了。它作為“比WEBrick”更好的應(yīng)用服務(wù)器,將純HTTP放到FastCGI中,非常值得多看看。在讀者評(píng)論中 有人說早期Dan Kubb提到用Canditional GET ,它的潛在好處是在緩存頁面不變時(shí)它可以用瀏覽器來緩存頁面。我只是簡(jiǎn)單地看了一下它的標(biāo)題,Rails插件看上去還不錯(cuò),很容易集成進(jìn)來。 有個(gè)比較大的變化,盡管我曾經(jīng)提倡使用Mysql的全文檢索,但現(xiàn)在我正在基于Rails的一個(gè)搜索插件工作,它很容易無縫滴集成到Hyper Estraier 搜索引擎中。如果它跑的很好(性能好和數(shù)據(jù)保護(hù)),我們將丟掉全文檢索,弄一個(gè)純InnoDB的數(shù)據(jù)庫配置,并且向鎖表和非事務(wù)的測(cè)試說再見了,同時(shí)這樣 也不能使用ROR的schema.rb了。 說道這里,我們升級(jí)到了了最近的Rails1.1。盡管這次升級(jí)對(duì)于性能并沒有太大的必要,但是它有另外受歡迎的地方,它使得我們代碼變得漂亮簡(jiǎn)介了。 謝謝看過這一系列文章的人們。我真誠的希望我對(duì)我們案例的詳細(xì)描述能夠避免再去做我們已經(jīng)做好了的一些研究和調(diào)試工作。如果你需要任何幫助,只要記下我的email,通過聯(lián)系limited overload我可以作為咨詢顧問來幫助你。 |
|
|