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規格是固定的,若是用戶數據放進來後還有剩餘則這剩餘部分不能作其餘用途。php
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因子。緩存
memcached參數使用介紹(Win7用戶要以管理員身份啓動命令窗口哦!) -p 監聽的端口 -l 鏈接的IP地址, 默認是本機 -d start 啓動memcached服務 -d restart 重起memcached服務 -d stop|shutdown 關閉正在運行的memcached服務 -d install 安裝memcached服務 -d uninstall 卸載memcached服務 -u 以的身份運行 (僅在以root運行的時候有效) -m 最大內存使用,單位MB。默認64MB -M 內存耗盡時返回錯誤,而不是刪除項 -c 最大同時鏈接數,默認是1024 -f 塊大小增加因子,默認是1.25 -n 最小分配空間,key+value+flags默認是48 -h 顯示幫助
清空memcache緩存的方法
默認memcache會監聽11221端口,若是想清空服務器上memecache的緩存:
1)第一種方法:
# telnet localhost 11221
進入後,執行flush_allphp框架
2)第二種方法:
# echo "flush_all"|nc localhost 11221安全
------------------------php的memcache和memcached擴展區別------------------------
memcache文檔:http://pecl.php.net/package/memcache
memcached文檔:http://pecl.php.net/package/memcachedbash
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協議。session
memcache方法列表:http://cn2.php.net/memcache
memcached方法列表:http://www.php.net/manual/zh/book.memcached.php數據結構
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命令查看緩存狀態
[root@bastion-IDC ~]# telnet 192.168.1.5 11211 Trying 192.168.1.5... Connected to 192.168.1.5. Escape character is '^]'. stats STAT pid 20439 ----> Memcached 進程的ID STAT uptime 179982 ----> 進程運行時間 STAT time 1382361665 ---->當前時間 STAT version 1.4.15 ----> Memcached 版本 STAT libevent 1.4.13-stable STAT pointer_size 32 STAT rusage_user 21.916668 STAT rusage_system 40.576831 STAT curr_connections 11 STAT total_connections 329 STAT connection_structures 23 STAT reserved_fds 20 STAT cmd_get 2363348 ----> 總共獲取數據的次數(等於 get_hits + get_misses ) STAT cmd_set 279971 ----> 總共設置數據的次數 STAT cmd_flush 0 STAT cmd_touch 0 STAT get_hits 2286284 ----> 命中了多少次數據,也就是從 Memcached 緩存中成功獲取數據的次數 STAT get_misses 77064 ----> 沒有命中的次數 STAT delete_misses 30803 STAT delete_hits 48876 STAT incr_misses 0 STAT incr_hits 0 STAT decr_misses 0 STAT decr_hits 0 STAT cas_misses 0 STAT cas_hits 0 STAT cas_badval 0 STAT touch_hits 0 STAT touch_misses 0 STAT auth_cmds 0 STAT auth_errors 0 STAT bytes_read 574591015 STAT bytes_written 4353057466 STAT limit_maxbytes 67108864 ----> 總的存儲大小,默認爲 64M STAT accepting_conns 1 STAT listen_disabled_num 0 STAT threads 4 STAT conn_yields 0 STAT hash_power_level 16 STAT hash_bytes 262144 STAT hash_is_expanding 0 STAT bytes 4717345 ----> 當前所用存儲大小 STAT curr_items 5654 STAT total_items 58461 STAT expired_unfetched 17 STAT evicted_unfetched 0 STAT evictions 0 STAT reclaimed 49
以上數據的命中率:2286284/2363348 = 96.7% 說明當前命中率是比較高的。