varnish知識點介紹

導讀:互聯網的發展使用戶不斷的增加,歷史數據不斷積累,業務不斷增長,系統的響應速度、請求的處理能力開始下降,CPU和磁盤IO處理能力會成爲瓶頸。如果在有限的硬件投入前提下,提高系統性能就成了主要解決問題的手段。爲此,可採用包括負載均衡、頁面靜態化、數據庫集羣、緩存等多種技術方案。目前,緩存方案是目前主流的性能優化方式。如我們所知,對於網站來說,有很多特定信息系統的請求都是重複冗餘的,可通過緩存技術在不影響用戶訪問的前提下,減輕後臺服務器的負擔。

那麼什麼是緩存技術呢?緩存又稱加速器,用於加速運行速度較快的設備與較慢設備之間的通信。對於在特定時間內重複訪問的資源,可以集中存儲的緩存工具上,在用戶訪問的時候,只需要通過緩存器就能直接獲取資源,而不經過後臺服務器。

互聯網業務優化三大黃金法則

(1)把所有的請求儘可能在架構前層階段交付,儘可能減少後端交互(push ahead

(2)對於重複類的業務,盡最大程度的去做緩存策略(cache is king

(3)服務能用內存響應的,堅決不用硬盤(memory is king

1,在瞭解緩存工具之前,先來了解以下關於緩存方面的知識點:

1)緩存命中率:即終端用戶訪問加速節點時,如果該節點有緩存住了要被訪問的數據時就叫命中,如果沒有的話就需要回原服務器取,就是沒有命中。其計算方式爲:hits/(hits+misses),即命中率/(命中的+沒有命中的)。

2)緩存之所以能夠生效是程序的運行具有局部性特徵:

時間局部性:一個數據被訪問過之後,可能很快會被再次訪問到;

空間局部性:一個數據被訪問時,其周邊的數據也有可能被訪問到;

(3)時效性:

緩存空間耗盡:LRU,最近最少使用(Least recently used),指在空間即將滿的時候,將最近最少使用的緩存清除掉;

緩存過期:到了緩存時間後失效;

(4)緩存的數據類型

資源緩存:page cache(高速緩衝存儲器) , static cache;

數據緩存:data cache;

2,除了特定的緩存工具,瀏覽器也具有緩存。

如圖,爲工作流程:

 

db7f6969c3c605aaa8de968b7ba40bbb.png-wh_

5f91bbd782b4d88940327d74a3970bb9.png-wh_

 

圖解:當第一次訪問時,沒有緩存,返回一個200的狀態值,產生一個校驗碼etag,這時設置的過期時間爲5

  當第二次訪問時,假如說是2秒(沒有超過過期時間),如果緩存裏面有要訪問的內容,且緩存沒有過期,校驗碼也相同,則返回一個200的狀態值

  當第三次訪問的時候,時間是6秒(超過了過期時間),但緩存裏有用戶要訪問的內容,但緩存已經過期,這時就要檢查校驗碼etag和資源內容有沒有發生變化,如果都沒有發生變化,則返回一個304Not Modified)的狀態值;如果任何一個發生了變化,則重新去服務器找到,並緩存在緩存工具中,供用戶訪問,並返回一個200的值。

  補充:Etagweb服務器響應請求時,告訴瀏覽器當前資源在服務器的唯一標識(生成規則由服務器決定)。Apache中,Etag的值,默認是對文件的索引節(Inode),大小(Size)和最後修改時間(Mtime)進行HASH後得到的。

瀏覽器的緩存機制:

瀏覽器是基於http的緩存,1.0的版本使用的緩存策略是Expires,它是web服務器響應消息頭字段,在響應http請求時告訴瀏覽器在過期時間前瀏覽器可以直接從瀏覽器緩存取數據,而無需再次請求。Expires的缺點就是,返回的到期時間是服務器端的時間,如果客戶端的時間與服務器的時間不一致(如時鐘不同步,或者跨時區),那麼就會產生誤差。所在從HTTP 1.1開始,使用Cache-Control:max-age=秒,來替代Expires.

Cache-ControlExpires的作用一致,都是指明當前資源的有效期,控制瀏覽器是否直接從瀏覽器緩存取數據還是重新發請求到服務器取數據。只不過Cache-Control的選擇更多,設置更細緻,如果同時設置的話,其優先級高於Expires.

其值有:

 

72a6c8c4b7190c9bc42aa09a19c8730a.png-wh_

169278babbf742fcc764bd5cd1c956cd.png-wh_

 

F12可以直接調出以下頁面,點到Network,然後隨便點南一個選項,就能看到關於這個頁面的頭部信息,如圖所示:

23152619a1f2000431af746c8cc88138.png-wh_ 

現在我們介紹幾個重要的知識點:

Last-Modified:標示這個響應資源的最後修改時間。Web服務器在響應請求時,告訴瀏覽器資源的最後修改時間

If-Modified-Since:當資源過期時(使用Cache-Control標識的max-age),發現資源具有Last-Modified聲明,則再次向web服務器請求時帶上頭If-Modified-Since,表示請求時間。Web服務器收到請求後發現有關If-Modified-Since則與被請求資源的最後修改時間進行比對。若最後修改時間較新,說明資源又被改動過,則響應整片資源內容(寫在響應消息包體內),HTTP 200;若最後修改時間較舊,說明資源無新修改,則響應HTTP 304(無需包體,節省瀏覽),告知瀏覽器繼續使用所保存的cache

If-None-Match:當資源過期時(使用Cache-Control標識的max-age),發現資源具有Etage聲明,則再次向web服務器請求時帶上頭If-None-MatchEtag的值)。Web服務器收到請求後發現有關If-None-Match則與被請求資源的相應校驗串進行比對,決定返回200304.

既然有了Last-Modified,那麼有Etag什麼用呢?

Etag解決了以下Last-Modified不能解決的問題:

(1)Last-Modified標註的最後修改只能精確到秒級,如果某些文件在1秒鐘以內,被修改多次的話,它將不能準確標註文件的修改時間

(2)如果某些文件會被定期生成,當有時內容並沒有發生任何變化,但Last-Modified卻改變了,導致文件沒法使用緩存

(3)有可能存在服務器沒有準確獲取文件修改時間,或者與代理服務器時間不一致等情形,

Etag是服務器自動生成或者由開發者生成的對應資源在服務器端的唯一標識符,能夠更加準確的控制緩存。

4Last-ModifiedEtag是可以一起使用的,服務器會優先驗證Etag,一致的情況下,纔會繼續比對last-ModifiedEtag是可以一起使用的,服務器會優先驗證Etag ,一致的情況下,纔會繼續比對Last-Modified,最後才決定是否返回200或者304.

 

實現緩存的方式有很多,比如nginx , squid , varnish。今天着重講varnish,以下是varnish的優點:

(1)Varnish的穩定性很高,兩者在完成 相同負荷的工作時,Squid服務器發生故障的機率要高於Varnish,因爲使用Squid要經常重啓;

(2)Varnish訪問速度更快,因爲採用了“Page Cache”技術,所有緩存數據都直接從內存讀取(映射),而squid是從硬盤讀取,因而varnish在訪問速度方面會更快;

(3)Varnish可以通過管理端口,使用正則表達式批量的清除部分緩存,而Squid是做不到的;

(4)Squid屬於是單進程使用單核CPU,但Varnish 是通過fork形式打開多進程來做處理,所以可以合理的使用所有核來處理相應的請求

 

Varnish主要運行兩個進程:Management進程和Child進程(也叫Cache進程)。

Management進程主要實現應用新的配置、編譯VCL、監控varnish、初始化varnish以及提供一個命令行接口等。Management進程會每隔幾秒鐘探測一下Child進程以判斷其是否正常運行,如果在指定的時長未得到Child進程的迴應,Management將會重啓此Child進程。

Child進程包含多種類型的線程,varnish依賴“工作區(workspace)”以降低線程在申請或修改內存時出現競爭的可能性。在varnish內部有多種不同的工作區,其中最關鍵的當屬用於管理會話數據的session工作區。

Acceptor線程:接收新的連接請求並響應;

Worker線程:child進程會爲每個會話啓動一個worker線程,此worker線程真正來管理緩存,構建響應報文,因此,在高併發的場景中可能會出現數百個worker線程甚至更多;

Expiry線程:從緩存中清理過期內容;

 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章