標籤:
在很多企業中,一些Web應用,在前期啟動並執行時候由於使用者量較小,系統壓力不大,系統運營狀態良好。隨著時間的推移,可能由於企業內某項制度的變化,使得原本並不熱門的系統,變成了大家日常都需要去使用的,由於使用者量激增,原本系統設計和實現中存在的缺陷大量的暴露,而最不能讓人容忍的是,系統的回應時間變長,甚至在某時段使用者集中訪問時,這一現象會變得讓人難以忍受。這往往會導致相關業務部門和負責系統營運的技術人員承受很大的壓力。本文將介紹如何針對這些的系統進行相應的最佳化和改進,即使沒有相關的系統需要最佳化,也可以在系統設計和開發階段避免相應的問題。
對Web系統的最佳化可以從三方面入手:頁面、資料庫和應用程式。
頁面最佳化
我們可以通過FireBug、httpwatch等頁面分析統計,對主要頁面進行分析,查看這些頁面需要載入到的圖片、css樣式、JavaScript指令碼耗時多少時間,有沒有載入失敗的,或者無效的指令碼、樣式和圖片。
針對分析結果,進行相應的最佳化,如:去除掉無效的圖片、css樣式、JavaScript指令碼,根據工具顯示的訪問時間,找出載入耗時較長的圖片,判斷該圖片是否過大。可以針對圖片進行最佳化,比如採用圖片壓縮技術。這樣能有效減少頁面載入時間。還有一種最佳化方式,是將多個樣式圖片拼接在一張大圖上,頁面中的樣式通過遮罩使用同一張圖片不通的位置達到顯示效果。
還可以採取的方式是對主要頁面進行靜態化處理。很多網站類的系統,首頁承擔著資訊發布、使用者登入和相關連結展示等多種功能,在訪問量大的時候,有的系統首頁載入都需要很長的時間,直接給使用者造成較差的體驗。解決這種問題單純使用ajax消極式載入不能解決問題。建議採用網頁爬蟲,為首頁和其他主要頁面定時產生靜態頁面。http伺服器會為系統中的靜態頁面體統代理,使用者不需要請求應用伺服器就可以直接存取首頁,並進行登入等相關操作,對首頁的靜態化操作會大大減輕後台系統的壓力。
資料庫最佳化
針對資料庫的最佳化主要是針對Sql查詢語句的最佳化。這項工作相比起頁面的最佳化工作難度要大一些,需要良好的sql功底和對系統業務的瞭解,但是有些系統的瓶頸就是存在於資料庫。在系統設計階段就需要對資料庫表進行合理的規劃,進來避免一個業務需要查詢多張資料庫表的設計方式。從系統最佳化的角度,我們需要檢查系統內部是否存在多層嵌套的子查詢,或者是大量使用in、like等作為條件匹配的命令。低效的查詢語句會大量消耗伺服器的CPU資源,造成系統響應緩慢。往往會出現某一個查詢操作進行中,會導致業務請求無法得到響應,當該查詢操作完成後,系統響應恢複正常,如果系統再運行中出現在使用者量一定的情況下,響應時快時慢,那麼很肯能是由於資料庫原因造成的。可以通過命令查詢最耗時的sql語句,然後根據抓取結果對系統中的sql進行最佳化。
現在互連網公司在系統實現時都會減小對資料庫的依賴,早期設計的很多系統都會基於資料庫指令碼進行批量處理,現在設計的系統大都基於應用程式進行處理,採用一些NoSql的資料庫部分替代關係型資料庫,只有對事務性較強的資料才會存放在關聯式資料庫中。目前應用程式的擴充性要遠高於關係型資料庫。
應用程式最佳化
程式員大都聽過這樣一句話:“用空間換時間”,這句話體現在編程中就是對緩衝的應用,“空間”指的就是記憶體,同樣是擷取資料,從本地記憶體中讀取所耗費的時間要遠遠小於從資料庫、網路和硬碟中擷取所需的時間。目前程式中的緩衝大都是基於記憶體作為儲存載體。可以將程式中一些很少發生變化的值存放在緩衝中。主流的緩衝經常使用索引值對的方式存放資料,包括:memcache、redis等。
一些大型的電商網站,在遇到大型促銷活動的時候,為了提高系統處理能力,在redis中實現對商品庫存的同步減操作,使用大量的記憶體操作代替資料庫操作,可以避免系統再大訪問量的環境下出現資料庫瓶頸。當前,互連網公司的系統大都部署在PC Server上,相比小型機,PC Server在配置和處理能力上並不遜色,只是機器發生故障的機率要高於小型機。解決這個問題的方式就是“以量取勝”,將資料和應用程式部署在多台PC Server上,這些PC Server互為主備,即使其中一台出現的問題,照樣有其他機器負責提供服務,出現問題的機器上的資料和應用程式很快會被遷移到其他機器上,接著提供服務。近些年虛擬機器技術的成熟,進一步降低了PC Server叢集的部署成本。相對而言,擴充java虛擬機器要比擴充資料庫成本低(特別是Oracle)
Java Web系統常用效能最佳化方式