學(xué)習(xí)MemCache的都知道,已知MemCache的某個節(jié)點,直接telnet過去,就可以使用各種命令操作MemCache了,下面學(xué)習(xí)MemCache的幾種命令:
命 令 |
作 用 |
get |
返回Key對應(yīng)的Value值 |
add |
添加一個Key值,沒有則添加成功并提示STORED,有則失敗并提示NOT_STORED |
set |
無條件地設(shè)置一個Key值,沒有就增加,有就覆蓋,操作成功提示STORED |
replace |
按照相應(yīng)的Key值替換數(shù)據(jù),如果Key值不存在則會操作失敗 |
stats |
返回MemCache通用統(tǒng)計信息(下面有詳細解讀) |
stats items |
返回各個slab中item的數(shù)目和最老的item的年齡(最后一次訪問距離現(xiàn)在的秒數(shù)) |
stats slabs |
返回MemCache運行期間創(chuàng)建的每個slab的信息(下面有詳細解讀) |
version |
返回當(dāng)前MemCache版本號 |
flush_all |
清空所有鍵值,但不會刪除items,所以此時MemCache依舊占用內(nèi)存 |
quit |
關(guān)閉連接 |
stats指令解讀
stats是一個比較重要的指令,用于列出當(dāng)前MemCache服務(wù)器的狀態(tài),拿一組數(shù)據(jù)舉個例子:
STAT pid 1023STAT uptime 21069937STAT time 1447235954STAT version 1.4.5STAT pointer_size 64STAT rusage_user 1167.020934STAT rusage_system 3346.933170STAT curr_connections 29STAT total_connections 21STAT connection_structures 49STAT cmd_get 49STAT cmd_set 7458STAT cmd_flush 0STAT get_hits 7401STAT get_misses 57..(delete、incr、decr、cas的hits和misses數(shù),cas還多一個badval)
STAT auth_cmds 0STAT auth_errors 0STAT bytes_read 22026555STAT bytes_written 8930466STAT limit_maxbytes 4134304000STAT accepting_conns 1STAT listen_disabled_num 0STAT threads 4STAT bytes 151255336STAT current_items 57146STAT total_items 580656STAT evicitions 0
這些參數(shù)反映著MemCache服務(wù)器的基本信息,它們的意思是:
參 數(shù) 名 |
作 用 |
pid |
MemCache服務(wù)器的進程id |
uptime |
服務(wù)器已經(jīng)運行的秒數(shù) |
time |
服務(wù)器當(dāng)前的UNIX時間戳 |
version |
MemCache版本 |
pointer_size |
當(dāng)前操作系統(tǒng)指針大小,反映了操作系統(tǒng)的位數(shù),64意味著MemCache服務(wù)器是64位的 |
rusage_user |
進程的累計用戶時間 |
rusage_system |
進程的累計系統(tǒng)時間 |
curr_connections |
當(dāng)前打開著的連接數(shù) |
total_connections |
當(dāng)服務(wù)器啟動以后曾經(jīng)打開過的連接數(shù) |
connection_structures |
服務(wù)器分配的連接構(gòu)造數(shù) |
cmd_get |
get命令總請求次數(shù) |
cmd_set |
set命令總請求次數(shù) |
cmd_flush |
flush_all命令總請求次數(shù) |
get_hits |
總命中次數(shù),重要,緩存最重要的參數(shù)就是緩存命中率,以get_hits / (get_hits + get_misses)表示,比如這個緩存命中率就是99.2% |
get_misses |
總未命中次數(shù) |
auth_cmds |
認(rèn)證命令的處理次數(shù) |
auth_errors |
認(rèn)證失敗的處理次數(shù) |
bytes_read |
總讀取的字節(jié)數(shù) |
bytes_written |
總發(fā)送的字節(jié)數(shù) |
limit_maxbytes |
分配給MemCache的內(nèi)存大?。▎挝粸樽止?jié)) |
accepting_conns |
是否已經(jīng)達到連接的最大值,1表示達到,0表示未達到 |
listen_disabled_num |
統(tǒng)計當(dāng)前服務(wù)器連接數(shù)曾經(jīng)達到最大連接的次數(shù),這個次數(shù)應(yīng)該為0或者接近于0,如果這個數(shù)字不斷增長, 就要小心我們的服務(wù)了 |
threads |
當(dāng)前MemCache總線程數(shù),由于MemCache的線程是基于事件驅(qū)動機制的,因此不會一個線程對應(yīng)一個用戶請求 |
bytes |
當(dāng)前服務(wù)器存儲的items總字節(jié)數(shù) |
current_items |
當(dāng)前服務(wù)器存儲的items總數(shù)量 |
total_items |
自服務(wù)器啟動以后存儲的items總數(shù)量 |
stats slab指令解讀
如果對上面的MemCache存儲機制比較理解了,那么我們來看一下各個slab中的信息,還是拿一組數(shù)據(jù)舉個例子:
STAT1:chunk_size 96
...
STAT 2:chunk_size 144
STAT 2:chunks_per_page 7281
STAT 2:total_pages 7
STAT 2:total_chunks 50967
STAT 2:used_chunks 45197
STAT 2:free_chunks 1
STAT 2:free_chunks_end 5769
STAT 2:mem_requested 6084638
STAT 2:get_hits 48084
STAT 2:cmd_set 59588271
STAT 2:delete_hits 0
STAT 2:incr_hits 0
STAT 2:decr_hits 0
STAT 2:cas_hits 0
STAT 2:cas_badval 0
...
STAT 3:chunk_size 216
...
首先看到,第二個slab的chunk_size(144)/第一個slab的chunk_size(96)=1.5,第三個slab的chunk_size(216)/第二個slab的chunk_size(144)=1.5,可以確定這個MemCache的增長因子是1.5,chunk_size以1.5倍增長。然后解釋下字段的含義:
參 數(shù) 名 |
作 用 |
chunk_size |
當(dāng)前slab每個chunk的大小,單位為字節(jié) |
chunks_per_page |
每個page可以存放的chunk數(shù)目,由于每個page固定為1M即1024*1024字節(jié),所以這個值就是(1024*1024/chunk_size) |
total_pages |
分配給當(dāng)前slab的page總數(shù) |
total_chunks |
當(dāng)前slab最多能夠存放的chunk數(shù),這個值是total_pages*chunks_per_page |
used_chunks |
已經(jīng)被分配給存儲對象的chunks數(shù)目 |
free_chunks |
曾經(jīng)被使用過但是因為過期而被回收的chunk數(shù) |
free_chunks_end |
新分配但還沒有被使用的chunk數(shù),這個值不為0則說明當(dāng)前slab從來沒有出現(xiàn)過容量不夠的時候 |
mem_requested |
當(dāng)前slab中被請求用來存儲數(shù)據(jù)的內(nèi)存空間字節(jié)總數(shù),(total_chunks*chunk_size)-mem_requested表示有多少內(nèi)存在當(dāng)前slab中是被閑置的,這包括未用的slab+使用的slab中浪費的內(nèi)存 |
get_hits |
當(dāng)前slab中命中的get請求數(shù) |
cmd_set |
當(dāng)前slab中接收的所有set命令請求數(shù) |
delete_hits |
當(dāng)前slab中命中的delete請求數(shù) |
incr_hits |
當(dāng)前slab中命中的incr請求數(shù) |
decr_hits |
當(dāng)前slab中命中的decr請求數(shù) |
cas_hits |
當(dāng)前slab中命中的cas請求數(shù) |
cas_badval |
當(dāng)前slab中命中但是更新失敗的cas請求數(shù) |
看到這個命令的輸出量很大,所有信息都很有作用。舉個例子吧,比如第一個slab中使用的chunks很少,第二個slab中使用的chunks很多,這時就可以考慮適當(dāng)增大MemCache的增長因子了,讓一部分?jǐn)?shù)據(jù)落到第一個slab中去,適當(dāng)平衡兩個slab中的內(nèi)存,避免空間浪費。
文章來自:五月的倉頡