基於Web應用的效能分析及最佳化案例

來源:互聯網
上載者:User

標籤:http   io   os   使用   java   strong   檔案   資料   sp   

一、 基於動態內容為主的網站最佳化案例

1.網站運行環境說明
硬體環境:1台IBM x3850伺服器, 單個雙核Xeon 3.0G CPU,2GB記憶體,3塊72GB SCSI磁碟。
作業系統:CentOS5.4。
網站架構:Web應用是基於LAMP架構,所有服務都在一台伺服器上部署。
2.效能問題現象及處理措施
   現象描述
網站在上午10點左右和下午3點左右訪問高峰時,網頁無法開啟,重啟服務後,網站能在一段時間內能正常服務,但過一會又變得響應緩慢,最後網頁徹底無法開啟。
   檢查配置
首先檢查系統資源狀態,探索服務出現故障時系統負載極高,記憶體基本耗盡,接著檢查Apache設定檔httpd.conf,發現“MaxClients”選項值被設定為2000,並且開啟了Apache的KeepAlive特性。
   處理措施
根據上面的檢查,初步判斷是Apache的”MaxClients“選項配置不當引起的,因為系統記憶體僅有2GB大小,而“MaxClients”選項被配置為2000,過多的使用者訪問進程耗盡了系統記憶體;然後,修改httpd.conf設定檔的“MaxClients”選項,將此值由2000降到1500;繼續觀察發現,網站還是頻繁宕機,於是又將“MaxClients”選項值降到1024,觀察一段時間發現,網站服務宕機時間間隔加長了,不像以前那麼頻繁,但是系統負載還是很高,網頁訪問速度極慢。
3.第一次分析最佳化
   既然是由系統資源耗盡導致的網站服務失去響應,那麼就深入分析系統資源的使用方式,通過uptime、vmstat、top、ps等命令的聯合使用,得出如下結論:
   結論描述
系統平均負載很高,通過uptime輸出的系統“load average”值都在10以上,而CPU資源也消耗嚴重,這是造成網站響應緩慢或長時間沒有響應的主要原因,而導致系統資源消耗過高的主要依據是使用者進程消耗資源嚴重。
   原因分析
通過top命令發現,每個Apache子進程消耗將近6~8MB左右記憶體,這是不正常的。根據經驗,在正常情況下每個Apache子進程消耗的記憶體在1MB左右,結合Apache輸出日誌發現,網站首頁訪問頻率最高,也就是說首頁程式碼可能存在問題。於是檢查首頁的PHP代碼,發現首頁的頁面非常大,圖片很多,並且由全動態程式組成,這樣每次使用者訪問首頁都要多次查詢資料庫,而查詢資料庫是個非常耗費CPU資源的過程,並且首頁PHP代碼也沒有相應的緩衝機制,每個使用者請求都要重新進行資料庫查詢操作,資料庫查詢負荷有多高可想而知。
   處理措施
修改首頁PHP代碼,縮減頁面大小,並且對訪問頻繁的操作增加緩衝機制,盡量減少程式對資料庫的訪問。
4.第二次分析最佳化
   通過前面簡單最佳化,系統服務宕機現象出現次數減少很多,但是在訪問高峰時網站偶爾還會無法正常訪問。這次仍然從分析系統資源使用狀況入手,發現系統記憶體資源消耗過大,並且磁碟I/O有等待問題,於是得出如下結論:
   原因分析
記憶體消耗過大,肯定是使用者訪問進程數過多導致的,在沒有最佳化PHP代碼之前,每個Apache子進程消耗6~8MB記憶體,如果設定Apache的最大使用者數為1024,那麼記憶體耗儘是必然的,當實體記憶體耗盡時,虛擬記憶體就會啟用,頻繁地使用虛擬記憶體,肯定會出現磁碟I/O等待問題,最終導致CPU資源耗盡。
   處理措施
通過上面對PHP代碼的最佳化,每個Apache子進程消耗的記憶體資源基本維持在1~2MB左右,因此修改Apache設定檔httpd.conf中的”MaxClients”選項值為“600”,同時把Apache配置中的“KeepAlive”特性關閉,這樣Apache進程數大量減少,基本維持在500~600之間,雖然偶爾也會使用虛擬記憶體,但是Web服務正常了,服務宕機問題也很少出現了。
5.第三次分析最佳化
經過前兩次的最佳化,網站基本運行正常,但是在訪問高峰時偶爾還會出現網站無法訪問得現象,繼續進行問題分析,通過命令查看系統資源,發現仍是CPU資源耗盡導致的,但是與前兩次又有所不同:
   原因分析
通過觀察後台日誌,發現PHP程式有頻繁訪問資料庫的操作,大量的SQL語句中有where, order by等子句;同時,資料庫查詢過多,大部分都是複雜查詢,一般都需要遍曆全表,而大量的表沒有建立索引,這樣的程式碼導致MySQL資料庫負荷過高,而MySQL資料庫和Apache部署在同一台伺服器上,這也是導致伺服器消耗CPU資源過高的原因。
   處理措施
最佳化程式中的SQL語句,增加where子句上的匹配條件,減少遍曆全部的查詢,同時在where和order by子句的欄位上建立索引,並且增加程式緩衝機制,通過這次最佳化,網站運行基本處於正常狀態,再也沒有出現宕機的現象。

6.第四次最佳化分析
通過前面三次最佳化以後,網站在程式碼、作業系統、Apache等方面的最佳化空間越來越小,要避免出現服務氣宕機現象,並且保證網站穩定、高效、快速地運行,可以從網站結構上進行最佳化,也就是將Web和資料庫分離部署,可以增加一台專用的資料庫伺服器,單獨部署MySQL資料庫。隨著訪問量的增加,如果前端無法滿足訪問請求,還可以增加多台Web伺服器,Web伺服器之間進行負載平衡部署,解決前端效能瓶頸;如果在資料庫端還存在讀寫壓力,還可以繼續增加一台MySQL伺服器,將MySQL進行讀寫分離部署,這樣一套高效能、高可靠的網站系統就構建起來了。

二、  基於動態、靜態內容結合的網站最佳化案例

1.網站運行環境說明
硬體環境:兩台IBM x3850伺服器, 單個雙核Xeon 3.0G CPU,4GB記憶體,3塊72GB SCSI磁碟。
作業系統:CentOS5.4。
網站架構:Web應用是基於J2EE架構的電子商務應用,Web端應用伺服器是Tomcat,採用MySQL資料庫,Web和資料庫獨立部署在兩台伺服器上。

2.效能問題現象以及處理措施
   現象描述
網站訪問高峰時,網頁無法開啟,重啟Java服務後,網站可以正常運行一段時間,但過一會又變得響應緩慢,最後網頁徹底無法開啟。
   檢查配置
首先檢查系統資源狀態,探索服務出現故障時系統負載極高,CPU滿負荷運行,Java進程佔用了系統99%的CPU資源,但記憶體資源佔用不大;接著檢查應用伺服器資訊,發現只有一個Tomcat在運行Java程式;接著查看Tomcat設定檔server.xml,發現server.xml檔案中的參數都是預設配置,沒有進行任何最佳化。
   處理措施
server.xml檔案的預設參數需要根據應用的特性進行適當的修改,例如可以修改“connectionTimeout“、“maxKeepAliveRequests”、“maxProcessors”等幾個Tmcat設定檔的參數,適當加大這幾個參數值。修改參數值後,繼續觀察發現,網站服務宕機時間間隔加長了,不像以前那麼頻繁,但是Java進程消耗CPU資源還是很嚴重,網頁訪問速度極慢。

3.第一次分析最佳化
既然Java進程消耗CPU資源嚴重,那麼需要查看到底是什麼導致Java消耗資源嚴重,通過lsof、netstat命令發現有大量的Java請求等待資訊,然後查看Tomcat日誌,發現大量報錯資訊、日誌提示和資料庫連接逾時,最終無法串連到資料庫,同時,訪問網站靜態資源,也無法訪問,於是得出如下結論:
   原因分析
Tomcat本身就是一個Java容器,是使用串連/執行緒模式處理業務請求的,主要用於處理Jsp、servlet等Live App,雖然它也能當作HTTP伺服器,但是處理靜態資源的效率很低,遠遠比不上Apache或Nginx。從前面觀察到的現象分析,可以初步判斷是Tomcat無法及時響應用戶端的請求,進而導致請求隊列越來越多,直到Tomcat徹底崩潰。對於一個正常的訪問請求來說,伺服器接收到請求後,會把請求交給Tomcat去處理,Tomcat接著執行編譯、訪問資料庫等操作,然後把資訊返回給用戶端,用戶端接收到資訊後,Tomcat就關閉這個請求連結,這樣一個完整的訪問過程就結束了。而在高並發訪問狀態下,很多的請求瞬間都交給Tomcat處理,這樣Tomcat還沒有完成第一個請求,第二個請求就來了,接著是第三個,等等,這樣越積越多,Tomcat最終失去響應, Java進程就會處於僵死狀態,資源無法釋放,這就是根本原因。
   處理措施
要最佳化Tomcat效能,需要從結構上進行重構,首先,加入Apache支援,由Apache處理靜態資源,由Tomcat處理動態請求,Apache伺服器和Tomcat伺服器之間使用Mod_JK模組進行通訊。使用Mod_JK模組的好處是:它可以定義詳細的資源處理規則,根據動態、靜態網站的特點,將靜態資源檔案全部交給Apache處理,而動態請求通過Mod_JK模組傳給Tomcat去處理,通過Apache+JK+Tomcat的整合,可以大幅度提高Tomcat應用的效能。

4.第二次分析最佳化
經過前面的最佳化措施,Java資源偶爾會增高,但是一段時間後又會自動降低,這屬於正常狀態,而在高並發訪問情況下,Java進程有時還會出現資源上升無法下降的情況,通過查看Tomcat日誌,綜合分析得出如下結論:
要獲得更高、更穩定的效能,單一的Tomcat應用伺服器有時會無法滿足需求,因此要結合Mod_JK模組運行基於Tomcat的負載平衡系統,這樣前端由Apache負責使用者請求的調度,後端又多個Tomcat負責Live App的解析操作,通過將負載均分配給多個Tomcat伺服器,網站的整體效能會有一個質的提升。

基於Web應用的效能分析及最佳化案例

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.