1. 程式人生 > >提高網站性能

提高網站性能

沒有 消息 popu 改變 雪崩 熱點 本質 track otto

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

提高網站性能