運維派 » 你有自己的Web緩存知識體系嗎?

你有自己的Web緩存知識體系嗎?

趙舜東:江湖人稱趙班長,曾在武警某部負責指揮自動化的架構和運維工作,2008年退役後一直從事互聯網運維工作。曾帶團隊負責國內某電商的運維工作,《saltstack入門與實踐》作者,某學院高級講師。

一、引言

學技術一定要成體系,這是我個人的學習目標,也就是在一個特定的範圍內,把與此相關的技術都儘量的搞清楚、搞明白。
我把與Web緩存相關的內容從我編寫的《Web運維知識體系》(鏈接1)中拿了出來,進行完善後,形成了一個單獨的《Web緩存知識體系》(鏈接2),分享給大家,僅供參考。
備註:

鏈接1 : https://www.unixhot.com/page/ops
鏈接 2 : https://www.unixhot.com/page/cache

二、Web緩存知識體系

Web架構中,我們經常會聽到分級或者分層這個詞,這就是架構中比較重要的一個理念:分層設計(分級設計)。
那麼對於一個Web站點來說,從一個HTTP請求產生到服務器返回數據,會經過非常多不同層次的緩存,我整理了一個“相對”完善的Web緩存分層體系。

你有自己的Web緩存知識體系嗎?

本體系從全局七個層面列舉了各個層面涉及到的緩存技術和方法,此體系結構僅包含讀緩存(Cache),不包含寫緩衝(Buffer),所以很多緩衝區沒有列舉,請見諒。

  • 用戶層:主要是相對於用戶端可以使用到的緩存技術,最常用的就是瀏覽器緩存。
  • 代理層:目前業內主要以使用CDN爲主。
  • Web層: Web服務器的自身的緩存技術,以及操作碼緩存“OPCache”。
  • 應用層:應用層面例如框架級別的動態緩存內容輸出,以及業務相關的本地緩存和頁面靜態化,例如大型電商的商品頁面幾乎都是使用的頁面靜態化技術。
  • 數據層:主要列舉了分佈式緩存和數據庫本身的緩存,如果從存儲角度考慮可能還有更多。
  • 系統層:操作系統層面的緩存技術,主要涉及CPU、內存、IO。
  • 物理層:僅列舉了存儲設備的RAID卡和磁盤上的高速緩存區,當然也有寫緩存的作用了。

三、Buffer與Cache

由於緩存分級體系的內容比較多,很難在微信文章中深入闡述,那麼我們下面來聊聊大家最熟悉,也是經常討論的Buffer與Cache。
什麼是Buffer?什麼是Cache?我相信這個也是困擾很多初學者很久的問題。而且很多時候我們把一個區域會叫做Buffer Cache,就讓大家更懵了,到底是Buffer還是Cache。
首先從字面上理解Buffer指的是緩衝、Cache指的是緩存。我個人的總結是:

  • Buffer:一般用於寫操作,可以稱之爲寫緩衝。
  • Cache:一般用於讀操作,可以稱之爲讀緩存。

1、Cache

我們先來說說Cache(緩存),這個是我們最容易理解的。Cache是爲了提高數據的讀取速度。
比如我們把經常用的數據從遠處讀取到一個離自己最近最快的緩存區後,這樣再次使用這個數據,就可以直接從離自己最近最快的這個緩存區讀取,這顯然提高了性能。
這裏我們拿CPU來舉例說明,作爲運維工程師我相信大家都知道CPU讀取文件是要從內存來讀取的,而且CPU的速度是遠遠高於內存的,那麼如果每次CPU都從內存來讀取顯然是比較慢的。
於是CPU現在增加了緩存,一般服務器的CPU都支持三級緩存:

L1 Cache
L2 Cache
L3 Cache

你有自己的Web緩存知識體系嗎?

CPU Cache是位於CPU與內存之間的臨時存儲器,它的容量比內存小的多但是交換速度卻比內存要快得多,CPU Cache中保存着CPU剛用過或循環使用的一部分數據。
當CPU再次使用該部分數據時可從Cache中直接調用,而不用去讀取內存,這樣就減少了CPU的等待時間,提高了系統的效率。
所以我們在實際的運維的一些場景中(例如KVM調優)也會使用taskset命令來將進程綁定到一個固定的CPU上,其實就是爲了降低CPU的Cache Miss,從而提高性能。

2、Buffer

我們理解了Cache,再來說說Buffer。目前Buffer和Cache之間是爭議還是比較多的,主要是概念上。我準備拿生活中的一個例子來解釋Buffer。
目前在中國,汽車的普及率很高,很多的朋友都有駕照,所以對於交規應該都很熟悉。我們先放下技術來做一個交規考試:
看下面這個圖,請回答下圖中白色虛線的區域叫做什麼?

Web緩存知識體系

左轉彎待轉區

答案:這個白色的區域叫做左轉彎待轉區,我們先放下技術,來複習一下交規,保證大家上路行駛的安全性。
左轉彎的車道增加了數米長的白色虛線框,直接連接到了馬路中間。

這些白色虛框線就是設置的“左轉彎待轉區”,供同向直行道綠燈亮起時,左轉彎車道的車輛越過停止線,提前進入這個區域等待轉彎,等到左轉彎信號燈變成綠色時再通過路口。

左轉彎待轉區的作用

此舉將有效地提高路口機動車通過量,減少車輛滯留,也就是讓車輛更快的轉彎。從圖中我們可以看到這個待轉區是一個彎曲的,離轉彎的目的地更近。
這個左轉彎待轉區其實就是我們要討論的Buffer(緩衝區)的一個生活例子。

這個待轉區這就是一個緩衝區,這個緩衝區可以讓我們把車輛停到離目的地更近的一個地方。就像我們把數據寫到一個離目的更近的地方一樣。

什麼是Buffer?

Buffer:緩衝區,一個用於存儲速度不同步的設備或優先級不同的設備之間傳輸數據的區域。

這次我們拿內存和磁盤來舉例,剛纔我們說了CPU速度比內存的速度要快很多,那麼拿內存和硬盤相比呢?

內存的速度要比硬盤的速度快非常多。但是我們知道內存是易失性的存儲,我們持久化的數據最終要保存到硬盤上。
但是硬盤又那麼的慢,CPU要是等待數據完全寫到硬盤上,那顯然是不現實的。

所以就拿我們的Linux系統來說,會在內存設置一個緩衝區叫做“磁盤緩衝區”,更準確點稱之爲“內存的磁盤緩衝區”。

CPU把數據寫入到“內存的磁盤緩衝區”之後就認爲自己寫完,然後轉去做別的事情,而不用等數據最終寫到硬盤。

然後linux有一個內核線程叫做pdflush,用來把緩存區的“相關”數據寫入到磁盤。這顯然提升了CPU處理的速度。當然這其中還有很多的奧祕,有興趣的朋友可以深入研究。

你真的明白了嗎?

回顧起我曾經對於Buffer和Cache的探索經歷,大家讀到這裏,肯定心中還有很多疑惑,那麼內存到底是Cache還是Buffer呢?

答案:又是Cache又是Buffer,因爲它確實同時擔任着兩個角色的功能,所以我們經常把這些即擔任的Cache角色又擔任Buffer角色的稱之爲:Buffer Cache。
當然也有別的稱謂,我們不要太糾結,最簡單的是我們能夠按照他們的作用來區分。

好的,以後別人再問你什麼是Buffer?什麼是Cache的時候,你可以自信的回答:

首先Cache和Buffer解決的都是速度不一致有關的問題,他們都有一塊存儲區域。

但是:

  • Cache:一般用於讀緩存,用於將頻繁讀取的內容放入緩存,下次再讀取相同的內容,直接從緩存中讀取,提高讀取性能,緩存區可以有多級。
  • Buffer:一般用於寫緩衝,用於解決不同介質之間存儲速度的不同,將數據寫入到比自己相對慢的不是很多的中間區域就返回,然後最終再寫入到目標地址,提高寫入性能。緩衝區也可以有多級。

注意:在很多時候我們把Buffer和Cache的名字混着用。也有統一叫做Cache的。

3、Cache的相關指標

我們這次主要是關注在Web架構中,各個層級的Cache,即便有些層級不僅僅是Cache的功能還有Buffer的功能。那麼既然使用Cache,我們就需要關注Cache幾個特別重要的指標。
3.1 Cache存放位置
對於我們Web架構中的緩存存放可以分爲三種位置:

  • 客戶端(瀏覽器緩存)
  • 內存(本機內存、遠程服務器內存)
  • 硬盤(本機硬盤、遠程服務器硬盤)

很明顯存儲在用戶瀏覽器中的速度最快,其次是Web服務器的內存中,最後是硬盤中。

內存快,但是畢竟價格貴、空間有限,所以我們也可以通過網絡將數據寫入到其它服務器的內存中,例如Memcached和Redis。

硬盤慢,但是價格低、空間相對充足。所以在設計緩存的時候經常會遇到分級設置,就像CPU的三級緩存。同時我們也可以將數據通過網絡寫入到其它服務器的硬盤中,例如NFS。

3.2 Cache過期時間

Cache既然是一個區域,那麼這個區域的存儲空間肯定是有限的,所有的緩存肯定有一個過期時間,不能一直存放。

在不同的層次,可以使用不同的方法設置緩存的過期時間

3.3 Cache強制過期

既然Cache有過期時間,那麼在沒有到達過期時間,我們又想讓Cache馬上過期,怎麼辦?

這個也是我們在使用和設計Cache的時候需要關注的問題,如何在源數據發生變化以後,讓緩存強制過期。

3.4 Cache命中率

緩存最重要的指標就是命中率了!也就是每次緩存查找的時候是否能在緩存區域,找到已經被緩存的內容。

Cache的命中率越高,效果越好!

我們可以想象如果加入了Cache層,命中率很低,先不說我們要在管理Cache增加的工作量,數據讀寫路徑多了一層,理論上就會影響性能。
所以說一個完全沒有命中率的緩存除了“極特殊”的需求外是不應該存在的。

四、留下一個面試題

最後,留下一個緩存相關的面試題:我們日常手機上使用的雲服務,例如雲通訊錄、雲短信、雲圖片(也就是可以同步你的通訊錄、短信和圖片到雲上)需要使用CDN嗎?

五、結束語:

也許,你和我有一樣的習慣就是每天在上下班途中閱讀各類技術公衆號,那麼,我建議對於別人的分享,要善於總結和沉澱,只有這樣才能成爲自己的知識。

在此,感謝高效運維社區給我們提供了一個學習和交流的平臺。

文章出處:高效運維公衆號

轉載請註明:運維派 » 你有自己的Web緩存知識體系嗎?

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