memcached工作原理
基本概念:slab,page,chunk。
slab,是一個邏輯概念。它是在啟動memcached執行個體的時候預處理好的,每個slab對應一個chunk size,也就是說不同slab有不同的chunk size。具體配置設定多少個slab由參數 -f (增長因子)和 -n (chunk最小尺寸)決定的。
page,可以了解為記憶體頁。大小固定為1m。slab會在存儲請求時向系統申請page,并将page按chunk size進行切割。
chunk,是儲存使用者資料的最小機關。使用者資料item(包括key,value)最終會儲存到chunk内。chunk規格是固定的,如果使用者資料放進來後還有剩餘則這剩餘部分不能做其他用途。
memcached工作流程
memcahed執行個體啟動,根據 -f 和 -n 進行預配置設定slab。以 -n 為最小值開始,以 -f 為比值生成等比數列,直到1m為止(每個slab的chunk size都要按8的倍數進行補全,比如:如果按比值算是556的話,會再加4到560成為8的整倍數)。然後每個slab配置設定一個page。當使用者發來存儲請求時(key,value),memcached會計算key+value的大小,看看屬于哪個slab。确定slab後看裡面的是否有空閑chunk放key+value,如果不夠就再向系統申請一個page(如果此時已經達到 -m 參數設定的記憶體使用上限,則看是否設定了 -M 。如果設定了 -M 則傳回錯誤提示,否則按LRU算法删除資料)。申請後将該page按本slab的chunk size 進行切割,然後配置設定一個來存放使用者資料。
注意:
1)chunk是在page裡面劃分的,而page固定為1m,是以chunk最大不能超過1m。
2)chunk實際占用記憶體要加48B,因為chunk資料結構本身需要占用48B。
3)如果使用者資料大于1m,則memcached會将其切割,放到多個chunk内。
4)已配置設定出去的page不能回收。
優化建議
1)-n 參數的設定,注意将此參數設定為1024可以整除的數(還要考慮48B的內插補點),否則餘下來的部分就浪費了。
2)不要存儲超過1m的資料。因為要拆成多個chunk,計算和時間成本都成倍增加。
3)善用stats指令檢視memcached狀态。
4)消滅eviction(被删除的資料)。
造成eviction是因為記憶體不夠,有三個思路:
(1)在CPU有餘力的情況下開啟壓縮(PHP擴充);
(2)增加記憶體;
(3)調整-f參數,減少記憶體浪費。
5)調整業務代碼,提高命中率。
6)緩存小資料。省帶寬,省網絡I/O時間,省記憶體。
7)根據業務特點,為資料尺寸區間小的業務配置設定專用的memcached執行個體。這樣可以調小 -f 參數,使資料集中存在少數幾個slab上,記憶體浪費較少。
啟動時最重要的參數:
-m 整個memcached最大記憶體
-f chunk大小增長因子
-n chunk最小配置設定空間
-C 禁用CAS
-vvv 列印詳細資訊
我們通過計算可以看出,每個slab的chunk size大小都是上一個大小的1.25倍,1.25就是memcached啟動時制定的-f的值,是以,要根據不同的業務場景調整,既要盡可能少的減少記憶體浪費,又要存得下我們業務中的資料,再舉個例子,加入我們的業務很BT,大小都是200kb,我們該怎麼做?那當然是要保證我們申請的chunk大小都是200kb了,雖然memcached并不支援這麼做。假如建立了38個slabs,最後資料全都落到了第20-25個slab中,那0-19和26-38的記憶體就被浪費了,這隻是能評估出來的,還有一種情況,加入我們的chunk大小是500kb,資料才200kb,因為每個chunk都隻能存儲一個,是以一個chunk就會有500kb-200kb的空間浪費,如果有一千萬個chunk要存,那将會浪費多少空間?是以,在使用memcached之前,先要評估你的資料,根據它去調整-f因子。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<code>memcached參數使用介紹(Win7使用者要以管理者身份啟動指令視窗哦!)</code>
<code>-p 監聽的端口</code>
<code>-l 連接配接的IP位址, 預設是本機</code>
<code>-d start 啟動memcached服務</code>
<code>-d restart 重起memcached服務</code>
<code>-d stop|shutdown 關閉正在運作的memcached服務</code>
<code>-d install 安裝memcached服務</code>
<code>-d uninstall 解除安裝memcached服務</code>
<code>-u 以的身份運作 (僅在以root運作的時候有效) </code>
<code>-m 最大記憶體使用,機關MB。預設64MB</code>
<code>-M 記憶體耗盡時傳回錯誤,而不是删除項</code>
<code>-c 最大同時連接配接數,預設是1024</code>
<code>-f 塊大小增長因子,預設是1.25</code>
<code>-n 最小配置設定空間,key+value+flags預設是48</code>
<code>-h 顯示幫助</code>
清空memcache緩存的方法
預設memcache會監聽11221端口,如果想清空伺服器上memecache的緩存:
1)第一種方法:
# telnet localhost 11221
進入後,執行flush_all
2)第二種方法:
# echo "flush_all"|nc localhost 11221
------------------------php的memcache和memcached擴充差別------------------------
1)首先看下開發時間:
memcache最早是在2004年2月開發的,最後更新是在2013年4月;
memcached最早是在2009年1月開發的,最後更新是在2014年1月更新的。
是以memcache的曆史比memcached早。
2)memcache是一個原生版本,完全在php架構内開發的。與之對應的帶d的memcached是建立在libmemcached的基礎上,是以相對來說,memcached版本的功能更全一些。
在安裝memcache擴充的時候并不要求安裝其他東西,但是在安裝memcached的時候會要求安裝libmemcached;
libmemcached是memcache的C用戶端,它具有的優點是低記憶體,線程安全等特點。
比如新浪微網誌之前就全面将php的memcache替換成php的memcached,在高并發下,穩定性果斷提高。
3)memcache的方法特别少,比如getMulti,setMulti都是沒有的,基本就剩下最簡單的get和set了。
是以說memcached比memcache支援更多的memcache協定。
4)Memcache是原生實作的,支援OO和非OO兩套接口并存。而memcached是使用libmemcached,隻支援OO接口。
5)memcached直接配置了session支援,隻要稍微修改下配置檔案就可以把session存儲在memcache中了。
6)memcached還有個非常稱贊的地方,就是flag不是在操作的時候設定了,而是有了一個統一的setOption()。Memcached實作了更多的memcached協定。
7)memcached支援Binary Protocol,而memcache不支援。這意味着memcached會有更高的性能。不過memcached目前還不支援長連接配接。
----------------------------------------------------------------------------
連接配接到memcache後,使用stats指令檢視緩存狀态
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
<code>[root@bastion-IDC ~]</code><code># telnet 192.168.1.5 11211</code>
<code>Trying 192.168.1.5...</code>
<code>Connected to 192.168.1.5.</code>
<code>Escape character is </code><code>'^]'</code><code>.</code>
<code>stats</code>
<code>STAT pid 20439 ----> Memcached 程序的ID</code>
<code>STAT uptime 179982 ----> 程序運作時間</code>
<code>STAT </code><code>time</code> <code>1382361665 ---->目前時間</code>
<code>STAT version 1.4.15 ----> Memcached 版本</code>
<code>STAT libevent 1.4.13-stable</code>
<code>STAT pointer_size 32</code>
<code>STAT rusage_user 21.916668</code>
<code>STAT rusage_system 40.576831</code>
<code>STAT curr_connections 11</code>
<code>STAT total_connections 329</code>
<code>STAT connection_structures 23</code>
<code>STAT reserved_fds 20</code>
<code>STAT cmd_get 2363348 ----> 總共擷取資料的次數(等于 get_hits + get_misses )</code>
<code>STAT cmd_set 279971 ----> 總共設定資料的次數</code>
<code>STAT cmd_flush 0</code>
<code>STAT cmd_touch 0</code>
<code>STAT get_hits 2286284 ----> 命中了多少次資料,也就是從 Memcached 緩存中成功擷取資料的次數</code>
<code>STAT get_misses 77064 ----> 沒有命中的次數</code>
<code>STAT delete_misses 30803</code>
<code>STAT delete_hits 48876</code>
<code>STAT incr_misses 0</code>
<code>STAT incr_hits 0</code>
<code>STAT decr_misses 0</code>
<code>STAT decr_hits 0</code>
<code>STAT cas_misses 0</code>
<code>STAT cas_hits 0</code>
<code>STAT cas_badval 0</code>
<code>STAT touch_hits 0</code>
<code>STAT touch_misses 0</code>
<code>STAT auth_cmds 0</code>
<code>STAT auth_errors 0</code>
<code>STAT bytes_read 574591015</code>
<code>STAT bytes_written 4353057466</code>
<code>STAT limit_maxbytes 67108864 ----> 總的存儲大小,預設為 64M</code>
<code>STAT accepting_conns 1</code>
<code>STAT listen_disabled_num 0</code>
<code>STAT threads 4</code>
<code>STAT conn_yields 0</code>
<code>STAT hash_power_level 16</code>
<code>STAT hash_bytes 262144</code>
<code>STAT hash_is_expanding 0</code>
<code>STAT bytes 4717345 ----> 目前所用存儲大小</code>
<code>STAT curr_items 5654</code>
<code>STAT total_items 58461</code>
<code>STAT expired_unfetched 17</code>
<code>STAT evicted_unfetched 0</code>
<code>STAT evictions 0</code>
<code>STAT reclaimed 49</code>
以上資料的命中率:2286284/2363348 = 96.7% 說明目前命中率是比較高的。
***************當你發現自己的才華撐不起野心時,就請安靜下來學習吧***************
本文轉自散盡浮華部落格園部落格,原文連結:http://www.cnblogs.com/kevingrace/p/5988550.html,如需轉載請自行聯系原作者