提升網站效能優化
阿新 • • 發佈:2018-12-17
##
一 、 前端優化
- 一般來說Web前端指網站業務邏輯之前的部分,包括瀏覽器載入,網站檢視模型,圖片服務,CDN服務等,主要優化手段有優化瀏覽器訪問,使用反向代理,CDN等。
- 優化手段
- 瀏覽器訪問優化
- 減少http請求:
- HTTP協議是無狀態的應用層協議,意味著每次HTTP請求都需要簡歷通訊鏈路,進行資料傳輸,而在伺服器端,每個HTTP都需要啟動獨立的執行緒去處理,這些通訊和服務的開銷都很昂貴,減少HTTP請求的數目可有效提高訪問效能。
- 減少HTTP請求的主要手段是合併CSS,合併JavaScript,合併圖片。將瀏覽器一次訪問需要的JavaScript,CSS合併成一個檔案,這樣瀏覽器就只需要一次請求。多張圖片合併成一張,如果每張圖片都有不同的超連結,可通過CSS偏移響應滑鼠點選操作,構造不同的URL。
- 使用瀏覽器快取
- 對一個網站而言,CSS,JavaScript,Logo,圖示等這些靜態資原始檔更新的頻率都比較低,而這些檔案又幾乎是每次HTTP請求都需要的,如果將這些檔案快取在瀏覽器中,可以極好地改善效能。通過設定HTTP頭中Cache-Control和Expires屬性,可設定瀏覽器快取,快取時間可以是數天甚至是幾個月。有時候,靜態資原始檔變化需要及時應用到客戶端瀏覽器,這種情況可以通過改變檔名實現,比如一般會在JavaScript後面加上一個版本號,使瀏覽器重新整理修改的檔案。
- 啟用壓縮
- 在伺服器端對檔案進行壓縮,在瀏覽器端對檔案解壓縮,可有效較少通訊傳輸的資料量。文字檔案的壓縮效率科大80%以上。
- 優化資源載入順序
- CSS放在頁面最上面,JavaScript放在頁面最下面
- 瀏覽器會在下載完全部CSS之後對整個頁面進行渲染,因此最好的做法是將CSS放在頁面最上面,讓瀏覽器儘快下載CSS。JS則想法,瀏覽器在載入JS後立即執行,有可能會阻塞整個頁面,造成頁面顯示緩慢,因此JS最好放在頁面最下面。
- 減少Cookie傳輸
- 一方面,Cookie包含在每次請求和響應中,太大的Cookie會嚴重影響資料傳輸,因此哪些資料需要寫入Cookie需要慎重考慮,儘量減少Cookie中傳輸的資料量。另一方面,對於某些靜態資源的訪問,如CSS,JS等,傳送Cookie沒有意義,可以考慮靜態資源使用獨立域名訪問,避免請求靜態資源時傳送Cookie,減少Cookie傳輸的次數。
- CDN 加速
- CDN(Content Distribute Network,記憶體分發網路)的本質上仍然是一個快取,而且將資料快取在離使用者最近的地方,是使用者以最快速度獲取資料,即所謂網路訪問第一跳。CDN一般快取的是靜態資源,如圖片,檔案,CSS,Script指令碼,靜態網頁等,但是這些檔案訪問頻率很高,將其快取在CDN可極大改善網頁的開啟速度。
- 反向代理
- 傳統代理伺服器位於瀏覽器一側,代理瀏覽器將HTTP請求傳送到網際網路上,而反向代理伺服器位於網站機房一側,代理網站Web伺服器接收HTTP請求。和傳統代理伺服器可以保護瀏覽器安全一樣,反向代理伺服器也具有保護網站安全的作用,來自網際網路的訪問請求必須經過代理伺服器,相當於在Web伺服器和可能的網路攻擊之間建立了一個屏障。
- 除了安全功能,代理伺服器也可以通過配置快取功能加速Web請求,當用戶第一次訪問靜態內容的時候,靜態內容就被快取在反向代理伺服器上,這樣當其他使用者訪問該靜態內容的時候,就可以直接從反向代理伺服器返回,加速Web請求響應速度,減輕伺服器負載。
- 減少http請求:
- 應用伺服器效能優化
- 應用伺服器就是處理網站業務的伺服器,網站的業務程式碼都部署在這裡,是網站開發最複雜,變化最多的地方,優化手段主要有快取,叢集,非同步等。
- 優化手段
- 分散式快取
- 當網站遇到效能瓶頸時,第一個想到的解決方案就是使用快取。在整個網站應用中,快取幾乎無所不在,既存在於瀏覽器,也存在於應用伺服器和資料庫伺服器,既可以對資料快取,也可以對檔案快取,還可以對頁面片段進行快取。合理使用快取,對網站效能優化意義重大。
- 快取的本質是一個記憶體Hash表,網站應用中,資料快取以一對Key,Value的形式儲存在記憶體Hash表中。快取主要用來存放那些讀寫比很高,很少變化的資料,如商品的類目資訊,熱門詞的搜尋列表資訊,熱門商品資訊等。應用程式讀取資料時,先到快取中讀取,如果讀取不到或資料已失效,再訪問資料庫,並將資料寫入快取。
- 使用快取對提高系統性能有很多好處,但是不合理使用快取非但不能提高系統的效能,還會成為系統的累贅,甚至風險。
- 頻繁修改的資料:如果快取中儲存的是頻繁修改的資料,就會出現資料寫入快取後,應用還來不及讀取快取,資料就已經失效的情形,徒增系統負擔。
- 沒有熱點的訪問:快取使用記憶體作為儲存,記憶體資源寶貴而有限,不可能將所有資料都快取起來,只能將最新訪問的資料快取起來,而將歷史資料清理出快取。如果應用系統訪問資料沒有熱點,不遵循二八定律,那麼快取就沒有意義。
- 資料不一致與髒讀:一般會對快取的資料設定失效時間,一旦超過失效時間,就要從資料庫中重新載入。因此應用要容忍一定時間資料的不一致。如賣家已經編輯了商品屬性,但是需要過一段時間才能被買家看到。還有一種策略是資料更新時立即更新快取,不過這也會帶來更多系統開銷和事務一致性的問題。
- 快取可用性:一般來說,快取作為提升系統性能的方法,即使快取資料丟失或者不可用也不會影響系統的可用性。但是隨著業務的發展,快取會承擔大部分資料訪問的壓力,資料庫已經習慣了有快取的日子,所以當快取服務崩潰時,資料庫會因為完全不能承受如此大的壓力而宕機,進而導致整個網站不可用,這種情況被稱作快取雪崩。實踐中,有的網站通過快取熱備等手段提高快取可用性。通過分散式快取伺服器叢集,將快取資料分佈到叢集多臺伺服器上可在一定程度上改善快取的可用性。
- 快取預熱: 快取中存放的是熱點資料,熱點資料又是快取系統利用LRU(最近最久未使用演算法)對不斷訪問的資料篩選淘汰出來的,這個過程需要花費較長的時間。新啟動的快取系統如果沒有任何資料,在重建快取資料的過程中,系統的效能和資料庫負載都不太好,那麼最好在快取系統啟動時就把熱點資料載入好,這個快取預載入手段叫做快取預熱。
- 快取穿透: 如果因為不恰當的業務,或者惡意攻擊持續高併發地請求某個不存在的資料,由於快取沒有儲存該資料,所有的請求都會落到資料庫上,會對資料庫造成很大壓力,甚至崩潰。一種簡單的對策是將不存在的資料也快取起來(其value值為null)。
- 非同步操作:
- 使用訊息佇列將呼叫非同步化,可改善網站的擴充套件性。事實上,使用訊息佇列還可以改善網站系統的效能。在不使用訊息佇列的情況下,使用者的請求資料直接寫入資料庫,在高併發的情況下,會對資料庫造成巨大的壓力,同事也是的響應延遲加劇。在使用訊息佇列後,使用者請求的資料傳送給訊息佇列後立即返回,再由訊息佇列的消費者程序從訊息佇列中獲取資料,非同步寫入資料庫。由於訊息佇列伺服器處理速度遠快於資料庫,因此使用者的相應延遲可得到有效改善。此外訊息佇列還具有很好的削峰作用,即通過非同步處理,將短時間高併發產生的事務訊息儲存在訊息佇列中,從而削平高峰期的併發事務。
- 使用叢集
- 在網站高併發訪問的場景下,使用負載均衡技術為一個應用構建一個由多臺伺服器組成的伺服器叢集,將併發訪問請求分發到多型伺服器上處理,避免單一伺服器因負載壓力過大而響應緩慢,使使用者請求具有更好的相應延遲特性。
- 程式碼優化
- 使用多執行緒技術提升相應速度,目前主要的Web應用伺服器都採用多執行緒的方式響應併發使用者請求,因此網站開發天然就是多執行緒程式設計。有一個問題就是,在多執行緒任務中,如何設定合理的執行緒數呢?這個主要看我們的任務時什麼型別,如果任務都是CPU計算型任務(我們稱之為CPU密集型),那麼執行緒數最多不超過CPU核心數,因為啟動再多執行緒,CPU也來不及排程;相反如果是任務需要等待磁碟操作,網路響應(我們稱之為IO密集型),那麼多啟動執行緒有助於提高任務併發度,調系統吞吐能力,改善系統性能。
- 資源複用,常見的資源複用情況有單例物件和物件池,物件池包括常見的執行緒池和資料庫連線池這種情況。
- 分散式快取
- 瀏覽器訪問優化