任何時候你都需要知道這個原理!你不會把商品數據都放內存吧!

今天分享學習關於計算機存儲。說到存儲,會想到以前的光盤,u盤,大點的機械硬盤,到現在更加普遍使用的固態硬盤。這些也算是IO設備了,說到IO,不得不想起很多時候系統的瓶頸會出現的IO上。這一篇和大家分享存儲器的層次結構

1 我們不凡先看看這幾個價格

1990~2020隨着硬件設備發展,訪問延時的變化圖 https://colin-scott.github.io/personal_website/research/interactive_latency.html

從這個圖我們可以知道,L1 cache訪問延時是1ns,到了內存就已經100ns,自然也就會貴很多。再看SSD和HDD,訪問延時也不是一個量級。

假設將CPU比喻爲計算機中的"大腦",那存儲器就是其附身了,存儲空間有限但是非常的快。爲了記憶部分數據就出現了CPU Cache,它用的是一種叫做SRAM的芯片,下面看看什麼是SRAM和DRAM

SRAM

SRAM是英文Static RAM的縮寫。靜態存儲器,它是一種具有靜止存取功能的內存,不需要刷新電路即能保存它內部存儲的數據。意味着斷電了,裏面的數據就會丟失。它的缺點也比較明顯,缺點,集成度低,功耗較大,積較大,價格較高,少量用於關鍵性系統以提高效率,主要用於高速緩存。

每個cpu核心中存在一個L1cache,一個L2cache高速緩存,存儲指令和數據。L2cache相對L1cache訪問速度更慢,而且L1cache通常會嵌入CPU內部。L3cache通常作爲cpu核心的共享資源,容量更大,訪問速度更慢

DRAM

動態存儲器:DRAM也叫做"動態"存儲器,數據存儲在電容裏面,通過定時刷新的方式保證電容不會因爲漏電而導致數據丟失。

SRAM與DRAM

SRAM與DRAM
SRAM與DRAM

現在我們一起看了從cache,內存再到SSD和HDD。當我們需要從硬盤加載數據的時候,不會直接從硬盤加載到Cpu cache中,而是先將數據加載到內存,然後再從內存加載到cache中。所以,這麼多不同的存儲設備,之和緊挨着的鄰居直接打交道,而不會誇鄰居將人家壞話。從上(寄存器)到下(機械硬盤)呈現價格越來越便宜,容量越來越大,訪問速度越來越慢。所以,通常我們配置電腦的時候,不是直接去買cache而是會考慮買機械硬盤或者固態硬盤,確實便宜不少。最後,小藍講這個總結花了一張圖。(需要一章性價比圖)

存儲結構
存儲結構

2 時間與空間局部性

我們知道,在進行服務端開發的時候,下面說幾個緩存的案例

(1) Linux內存管理中通過MMU的硬件實現虛擬地址到物理地址的轉換,但是每次都這樣轉換勢必造成性能的損耗,所以採用了緩存組件TLB來緩存最近使用的虛擬地址到物理地址的映射。

(2) 在計算機網絡中,DNS尋址的過程中,先在本地看看有沒有映射關係,有就直接進行訪問,沒有再去遞歸/迭代查詢。

(3) 再比如通過redis緩存熱點數據,這樣不需要每次直接和數據庫打交道,從而降低數據庫IO,另外一位緩存的數據的告訴查詢,也能加快整個系統的響應速度,從而在一定的程度上提高併發量。

(4) 再比如我們在看短視頻的時候,難道官方是一個視頻一個視頻的給你推薦?通常不會,在我們播放其中一個視頻的時候,播放器已經給我們緩存了幾個視頻,這樣對於用戶而言,使用時也感覺更加的流暢。

好了,這幾個例子基本上可以說明緩存還是很牛X的,那麼是不是加了緩存就一定很牛X?非也,事事都有兩面性。緩存通常應用於讀多寫少的業務上,從而提高其緩存的命中率另外緩存通常使用內存作爲介質,內存也不是無限大,所以也需要對存儲量進行評估。

從上面我們知道越靠近cpu越香,容量小价格貴速度高,那麼我們能想辦法讓其容量大,價格便宜,速度快都滿足呢。聰明的人類提出了局部性原理

局部性原理分爲時間和空間上的局部性

時間局部性

將已經訪問過而且在短間還會訪問的進行緩存。比如我們登陸網站的時候,爲了下一次登陸不用輸入用戶名密碼,先暫存,下次就可以直接登陸進入。

空間局部性

如果一個數據被訪問了,它的相鄰數據也很可能被訪問。比如看了一部不錯的電影會考慮看看是否有連載

這樣一來,我們不需要把所有的數據都存放在內存中,而是可以考慮將訪問次數比較多的放在貴一點但是快一點的存儲器中,將暫時不用的放在容量更大的存儲器中。這樣也實現了我們的願望,結合內存,SSD使得只需要用更低的成本滿足存儲的需求。

來個問題,如何使用最少的錢裝下淘寶的所有商品

假設此時網站網站有4億件,每一件假設5M存儲空間,那麼一共需要4 * 5=2000T的數據存儲。假設內存1M=0.015美元,那此時就是2000TB/1M * 0.015=3000w美元。可是所有的商品中,有一部分季節性產品不一定會被經常訪問。

如果我們只將其中百分之1的熱門(400w)產品放入內存,其他的放在HDD中。那麼我們算算多少錢,3000w美元 * 1% + 2000TB/1M * 0.00004 美元=30.08W美元,相比原來的3000w省下不止一個級別

這裏就用到了時間局部性原理。將經常訪問的放在更貴的內存中,如果放不下了,可以考慮將內存中最久沒有訪問的數據移除,這是不是很熟悉,這就是LRU緩存算法,嘗試大廠的小夥伴需要考慮考慮如何實現。

那麼到底怎麼評估有多少請求是在內存中,這裏就有個叫做"緩衝命中率"的概念。我們需要儘量的去保證緩存的命中率,這樣也能更好地支撐後端請求硬盤的訪問次數。

3 總結

線上環境複雜多變,只是通過簡單舉例的方式讓大家能意識到局部性的重要性以及能較好的和成本掛鉤,畢竟我們不只是純寫代碼,嘻嘻。當然,也不是加了緩存就一定會達到很好的效果,後續會繼續探討這個問題。有點收穫請點贊,

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