日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

Memcached深入理解 – memcached究竟是如何運(yùn)作

系統(tǒng) 2501 0

網(wǎng)上其實(shí)有很多文章說(shuō)明了memcached是如何運(yùn)作的,特別是底層的內(nèi)存分配是如何運(yùn)作的。我參考過(guò)很多資料,比較有啟發(fā)意義的有幾個(gè):

  • 首先是官方的英文資料,雖然文章太多、很難看懂,我個(gè)人覺(jué)得說(shuō)得也不是太清晰,不夠直觀(附上 官方wiki地址 )。還有g(shù)it上memcached原作者的 protocol.txt 也值得一讀,有時(shí)間的話,我會(huì)翻譯一下。
  • 其次是mixi網(wǎng)站的核心技術(shù)人員寫(xiě)的5篇全面剖析,這5篇文章寫(xiě)得很實(shí)用,從各方面徹底解剖了memcached,可惜的是這一系列文章對(duì)于核心的內(nèi)存分配邏輯描述還不夠詳細(xì)(個(gè)人覺(jué)得),而且很多監(jiān)控方面的guide都是基于mixi站點(diǎn)已經(jīng)有的一套框架,對(duì)于從頭開(kāi)發(fā)的人來(lái)說(shuō)只能是用來(lái)指明方向的,實(shí)際指導(dǎo)意義不大(附上我轉(zhuǎn)載的帖子 入口 )。
  • 此外還有Mike Perham的 一篇博客 ,寫(xiě)得不錯(cuò),很詳細(xì)地舉例說(shuō)明了memcached內(nèi)部的內(nèi)存分配邏輯,以及內(nèi)存浪費(fèi)現(xiàn)象。
  • 還有梁子的 一篇博客 ,也是一篇很好的博客,從他的角度非常詳細(xì)地描述了memcached內(nèi)部的內(nèi)存分配邏輯。我個(gè)人覺(jué)得他的文章解釋的是最清楚的,雖然在文筆和錯(cuò)別字上實(shí)在是。。。。

1. 幾個(gè)關(guān)鍵概念

Page為內(nèi)存分配的單位
Memcached的內(nèi)存分配以page為單位,默認(rèn)情況下一個(gè)page是1M,可以通過(guò)-I參數(shù)修改,最小1K,最大128M。如果需要申請(qǐng)內(nèi)存時(shí),memcached會(huì)劃分出一個(gè)新的page并分配給需要的slab區(qū)域。page一旦被分配在memcached重啟前不會(huì)被回收或者重新分配(page ressign已經(jīng)從1.2.8版移除了)。

Slabs劃分?jǐn)?shù)據(jù)空間
Memcached并不是將所有大小的數(shù)據(jù)都放在一起的,而是預(yù)先將數(shù)據(jù)空間劃分為一系列大小的slabs,每個(gè)slab只負(fù)責(zé)一定大小范圍內(nèi)的數(shù)據(jù)存儲(chǔ)。每個(gè)slab只存儲(chǔ)大于其上一個(gè)slab的size并小于或者等于自己最大size的數(shù)據(jù)。例如:slab 3只存儲(chǔ)大小介于137 到 224 bytes的數(shù)據(jù)。如果一個(gè)數(shù)據(jù)大小為230byte的數(shù)據(jù)進(jìn)行存儲(chǔ),它將被分配到slab 4中。每個(gè)slab負(fù)責(zé)的空間其實(shí)是不等的,memcached默認(rèn)情況下下一個(gè)slab的最大值為前一個(gè)的1.25倍,這個(gè)可以通過(guò)修改-f參數(shù)來(lái)修改增長(zhǎng)比例。

Memcached深入理解 – memcached究竟是如何運(yùn)作的

Chunk才是存放緩存數(shù)據(jù)的單位
Chunk是一系列固定的內(nèi)存空間,這個(gè)大小就是管理它的slab的最大存放大小。例如:slab 1的所有chunk都是104byte,而slab 4的所有chunk都是280byte。chunk是memcached實(shí)際存放緩存數(shù)據(jù)的地方,因?yàn)閏hunk的大小固定為slab能夠存放的最大值,所以所有分配給當(dāng)前slab的數(shù)據(jù)都可以被chunk存下。如果實(shí)際的數(shù)據(jù)大小小于chunk的大小,空余的空間將會(huì)被閑置,這個(gè)是為了防止內(nèi)存碎片而設(shè)計(jì)的。舉例來(lái)說(shuō),如果chunk size是224byte,而存儲(chǔ)的數(shù)據(jù)只有200byte,剩下的24byte將被閑置。此外,memcached允許配置的最小的chunk空間為48個(gè)字節(jié)(key+value+flags),通過(guò)-n參數(shù)可以調(diào)節(jié)這個(gè)數(shù)值。

Memcached深入理解 – memcached究竟是如何運(yùn)作的

2. 理解這三者之間的關(guān)系

要理解memcached是如何分配內(nèi)存的就要從理解上述三個(gè)東西之間的關(guān)系開(kāi)始。
page 是memcached在收到內(nèi)存不夠的請(qǐng)求,并進(jìn)行內(nèi)存分配的單位。舉例來(lái)說(shuō),slab2的所有空間都用完了,又有大小適合slab2的數(shù)據(jù)過(guò)來(lái)了,那么slab2就會(huì)向memcached請(qǐng)求新的內(nèi)存空間,memcached就會(huì)劃分一個(gè)page大小的內(nèi)存量到slab2。page的默認(rèn)大小是1M,這個(gè)數(shù)值可以通過(guò)參數(shù)-I來(lái)修改。
slab 是memcached用來(lái)劃定存儲(chǔ)空間的大小概念,每當(dāng)memcached啟動(dòng)的時(shí)候,它會(huì)按照-n參數(shù)配置的值(如果有的話,否則為默認(rèn)值)來(lái)決定第一個(gè)slab的大小,然后根據(jù)-f參數(shù)的值來(lái)決定后續(xù)slab大小的增長(zhǎng)速率,一個(gè)一個(gè)地決定后續(xù)的slab的大小,直到slab的大小達(dá)到設(shè)定的page大小(一般是1M)。
chunk 是實(shí)際用來(lái)存儲(chǔ)數(shù)據(jù)的內(nèi)存空間,它的大小和包含它的slab的大小是一致的。當(dāng)page大小的內(nèi)存分配到slab的時(shí)候,slab會(huì)根據(jù)自身的大小將page大小的內(nèi)存分割成 page / slabsize 個(gè)chunk。

memcached啟動(dòng)時(shí)候,slab創(chuàng)建以及chunk分配的細(xì)節(jié)可以參照下面的數(shù)據(jù)(使用-vv命令查看的詳細(xì)內(nèi)存分配過(guò)程)。

        
          /
        
        
usr
        
          /
        
        
bin
        
          /
        
        
memcached 
        
          -
        
        
u nobody 
        
          -
        
        
m 
        
          64
        
        
          -
        
        
p 
        
          11211
        
        
          -
        
        
l 127.0.0.1 
        
          -
        
        
vv
slab class   
        
          1
        
        
          :
        
        
 chunk size        
        
          96
        
        
 perslab   
        
          10922
        
        

slab class   
        
          2
        
        
          :
        
        
 chunk size       
        
          120
        
        
 perslab    
        
          8738
        
        

slab class   
        
          3
        
        
          :
        
        
 chunk size       
        
          152
        
        
 perslab    
        
          6898
        
        

slab class   
        
          4
        
        
          :
        
        
 chunk size       
        
          192
        
        
 perslab    
        
          5461
        
        

slab class   
        
          5
        
        
          :
        
        
 chunk size       
        
          240
        
        
 perslab    
        
          4369
        
        

slab class   
        
          6
        
        
          :
        
        
 chunk size       
        
          304
        
        
 perslab    
        
          3449
        
        

slab class   
        
          7
        
        
          :
        
        
 chunk size       
        
          384
        
        
 perslab    
        
          2730
        
        

slab class   
        
          8
        
        
          :
        
        
 chunk size       
        
          480
        
        
 perslab    
        
          2184
        
        

slab class   
        
          9
        
        
          :
        
        
 chunk size       
        
          600
        
        
 perslab    
        
          1747
        
        

slab class  
        
          10
        
        
          :
        
        
 chunk size       
        
          752
        
        
 perslab    
        
          1394
        
        

slab class  
        
          11
        
        
          :
        
        
 chunk size       
        
          944
        
        
 perslab    
        
          1110
        
        

slab class  
        
          12
        
        
          :
        
        
 chunk size      
        
          1184
        
        
 perslab     
        
          885
        
        

slab class  
        
          13
        
        
          :
        
        
 chunk size      
        
          1480
        
        
 perslab     
        
          708
        
        

slab class  
        
          14
        
        
          :
        
        
 chunk size      
        
          1856
        
        
 perslab     
        
          564
        
        

slab class  
        
          15
        
        
          :
        
        
 chunk size      
        
          2320
        
        
 perslab     
        
          451
        
        

slab class  
        
          16
        
        
          :
        
        
 chunk size      
        
          2904
        
        
 perslab     
        
          361
        
        

slab class  
        
          17
        
        
          :
        
        
 chunk size      
        
          3632
        
        
 perslab     
        
          288
        
        

slab class  
        
          18
        
        
          :
        
        
 chunk size      
        
          4544
        
        
 perslab     
        
          230
        
        

slab class  
        
          19
        
        
          :
        
        
 chunk size      
        
          5680
        
        
 perslab     
        
          184
        
        

slab class  
        
          20
        
        
          :
        
        
 chunk size      
        
          7104
        
        
 perslab     
        
          147
        
        

slab class  
        
          21
        
        
          :
        
        
 chunk size      
        
          8880
        
        
 perslab     
        
          118
        
        

slab class  
        
          22
        
        
          :
        
        
 chunk size     
        
          11104
        
        
 perslab      
        
          94
        
        

slab class  
        
          23
        
        
          :
        
        
 chunk size     
        
          13880
        
        
 perslab      
        
          75
        
        

slab class  
        
          24
        
        
          :
        
        
 chunk size     
        
          17352
        
        
 perslab      
        
          60
        
        

slab class  
        
          25
        
        
          :
        
        
 chunk size     
        
          21696
        
        
 perslab      
        
          48
        
        

slab class  
        
          26
        
        
          :
        
        
 chunk size     
        
          27120
        
        
 perslab      
        
          38
        
        

slab class  
        
          27
        
        
          :
        
        
 chunk size     
        
          33904
        
        
 perslab      
        
          30
        
        

slab class  
        
          28
        
        
          :
        
        
 chunk size     
        
          42384
        
        
 perslab      
        
          24
        
        

slab class  
        
          29
        
        
          :
        
        
 chunk size     
        
          52984
        
        
 perslab      
        
          19
        
        

slab class  
        
          30
        
        
          :
        
        
 chunk size     
        
          66232
        
        
 perslab      
        
          15
        
        

slab class  
        
          31
        
        
          :
        
        
 chunk size     
        
          82792
        
        
 perslab      
        
          12
        
        

slab class  
        
          32
        
        
          :
        
        
 chunk size    
        
          103496
        
        
 perslab      
        
          10
        
        

slab class  
        
          33
        
        
          :
        
        
 chunk size    
        
          129376
        
        
 perslab       
        
          8
        
        

slab class  
        
          34
        
        
          :
        
        
 chunk size    
        
          161720
        
        
 perslab       
        
          6
        
        

slab class  
        
          35
        
        
          :
        
        
 chunk size    
        
          202152
        
        
 perslab       
        
          5
        
        

slab class  
        
          36
        
        
          :
        
        
 chunk size    
        
          252696
        
        
 perslab       
        
          4
        
        

slab class  
        
          37
        
        
          :
        
        
 chunk size    
        
          315872
        
        
 perslab       
        
          3
        
        

slab class  
        
          38
        
        
          :
        
        
 chunk size    
        
          394840
        
        
 perslab       
        
          2
        
        

slab class  
        
          39
        
        
          :
        
        
 chunk size    
        
          493552
        
        
 perslab       
        
          2
        
        

slab class  
        
          40
        
        
          :
        
        
 chunk size    
        
          616944
        
        
 perslab       
        
          1
        
        

slab class  
        
          41
        
        
          :
        
        
 chunk size    
        
          771184
        
        
 perslab       
        
          1
        
        

slab class  
        
          42
        
        
          :
        
        
 chunk size   
        
          1048576
        
        
 perslab       
        
          1
        
      

?

3. 舉個(gè)例子來(lái)分析

首先,是memcached啟動(dòng)時(shí)候的情況:
商人A很有錢,他有100個(gè)大小一摸一樣的倉(cāng)庫(kù)(100M的memcached服務(wù)器,每個(gè)page大小1M,就是一個(gè)倉(cāng)庫(kù))。商人A根據(jù)自己的商品尺寸,將自己的倉(cāng)庫(kù)分成了42種(42個(gè)slab),定義為最小一種的倉(cāng)庫(kù)是專門(mén)用來(lái)存放尺寸為96的貨物的(slab1大小為96個(gè)字節(jié)),然后每種倉(cāng)庫(kù)存放的貨物大小都是之前一種的1.25倍(增長(zhǎng)因子-f為1.25)。商人預(yù)先將42個(gè)倉(cāng)庫(kù)按照預(yù)定義的42種貨物大小整理、裝修了下(memcached啟動(dòng)時(shí)候的42個(gè)slab預(yù)分配、chunk分割)。1號(hào)倉(cāng)庫(kù)(slab1)中有10922個(gè)(1M * 1024 * 1024 / 96)貨物存儲(chǔ)空間(chunk),后續(xù)的倉(cāng)庫(kù)類型的裝修、空間分配都以此類推。

其次,來(lái)看下slab滿了的時(shí)候的情況:
商人A進(jìn)了一批尺寸是150的貨物,共6899個(gè)。貨物按大小分配,進(jìn)入3號(hào)倉(cāng)庫(kù)( slab3)。因?yàn)?號(hào)倉(cāng)庫(kù)是倉(cāng)庫(kù)類型3,其大小只有6898個(gè)位置(6898個(gè)chunk),6898個(gè)貨物被安置到倉(cāng)庫(kù)類型3(slab3)的3號(hào)倉(cāng)庫(kù)里去。然后還多出來(lái)一個(gè)貨物沒(méi)地方放,商人就安排了一個(gè)新的倉(cāng)庫(kù)裝修成倉(cāng)庫(kù)類型3(1M的空間分配給slab3,大小為152個(gè)字節(jié),含6898個(gè)chunk),然后將多余的一個(gè)貨物放入到新的倉(cāng)庫(kù)里。

這個(gè)例子看過(guò)以后,相信大家都已經(jīng)很明白前述的三個(gè)概念之間的關(guān)系以及memcached是如何分配內(nèi)存空間的了。

4. memcached里的內(nèi)存浪費(fèi)

讀過(guò)上文之后大家應(yīng)該很明白memcached的內(nèi)存分配方式了。memcached這樣分配內(nèi)存的好處是不會(huì)存在內(nèi)存碎片,但是壞處也很明顯,就是內(nèi)存的浪費(fèi)。就拿前面的商人例子來(lái)說(shuō),如果遇到一種極端的情況,所有的貨物進(jìn)來(lái)的都是121個(gè)字節(jié)的大小,那么按邏輯他們都會(huì)被分到slab3里面去,也就是分到大小是152的slab里,也就是說(shuō)每塞進(jìn)一個(gè)對(duì)象,就會(huì)有31個(gè)字節(jié)的內(nèi)存空間被浪費(fèi)掉了。

Memcached深入理解 – memcached究竟是如何運(yùn)作的

5. memcached的數(shù)據(jù)回收機(jī)制

memcached內(nèi)部不會(huì)監(jiān)視記錄是否過(guò)期,而是在get時(shí)查看記錄的時(shí)間戳,檢查記錄是否過(guò)期。 這種技術(shù)被稱為lazy(惰性)expiration。因此,memcached不會(huì)在過(guò)期監(jiān)視上耗費(fèi)CPU時(shí)間。如果某一個(gè)item在memcached里過(guò)期了,這個(gè)東西并不會(huì)被刪除,而是客戶端無(wú)法再看見(jiàn)該記錄(invisible,透明), 其存儲(chǔ)空間即可重復(fù)使用。一般情況下memcached會(huì)優(yōu)先使用已超時(shí)的記錄的空間,但即使如此,也會(huì)發(fā)生追加新記錄時(shí)空間不足的情況, 此時(shí)就要使用名為 Least Recently Used(LRU)機(jī)制來(lái)分配空間。 顧名思義,這是刪除“最近最少使用”的記錄的機(jī)制。 因此,當(dāng)memcached的內(nèi)存空間不足時(shí)(無(wú)法從slab class 獲取到新的空間時(shí)),就從最近未被使用的記錄中搜索,并將其空間分配給新的記錄。

以上,主要是memcached的內(nèi)存分配利用的一些經(jīng)驗(yàn)。當(dāng)然,memcached的配置、調(diào)優(yōu)、監(jiān)控在這篇文章里是沒(méi)有涉及的,以后有機(jī)會(huì)的話會(huì)補(bǔ)上。

Memcached深入理解 – memcached究竟是如何運(yùn)作的


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 永春县| 原平市| 澳门| 新津县| 凤城市| 北流市| 通道| 永新县| 淮南市| 交口县| 凉山| 射洪县| 济阳县| 分宜县| 聂拉木县| 陆河县| 乳源| 霞浦县| 璧山县| 洪洞县| 绥中县| 小金县| 湾仔区| 闽侯县| 东源县| 宜州市| 保山市| 兴和县| 林甸县| 辽阳市| 根河市| 图木舒克市| 炎陵县| 马山县| 绥宁县| 沭阳县| 晋城| 辽宁省| 涿州市| 西安市| 城口县|