Memcached內(nèi)存分析、調(diào)優(yōu)、集群課件_第1頁
Memcached內(nèi)存分析、調(diào)優(yōu)、集群課件_第2頁
Memcached內(nèi)存分析、調(diào)優(yōu)、集群課件_第3頁
Memcached內(nèi)存分析、調(diào)優(yōu)、集群課件_第4頁
Memcached內(nèi)存分析、調(diào)優(yōu)、集群課件_第5頁
已閱讀5頁,還剩135頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

Memcached

內(nèi)存分析、調(diào)優(yōu)、集群劉中兵搜狐TPCv12019/12/12lzbboxhotmailMemcached

內(nèi)存分析、調(diào)優(yōu)、集群劉中兵搜狐TPC1導(dǎo)航1.Memcached背景2.Memcached使用:安裝、啟動、命令、統(tǒng)計3.深入Memcached內(nèi)部:slab、page、item4.Memcached分布式:一致性Hash5.key-value系統(tǒng)比較:集群、性能對比6.Memcached客戶端2導(dǎo)航1.Memcached背景21.Memcached背景1.Memcached背景3Memcached是什么memcached由LiveJournal運營人員開發(fā)memcached是高性能的分布式內(nèi)存緩存服務(wù)器,開源協(xié)議簡單基于libevent時間處理:epoll/kqueue內(nèi)置內(nèi)存存儲方式:slab/LRU目前用戶LiveJournalFacebookmixiDiggWikipediaVox4Memcached是什么memcached由LiveJourfacebook200memcachedservers16GB四核AMD643TBcachedata5facebook200memcachedservers5Memcached支持語言C/C++libmemcachedlibmemcacheapr_memcachememcaheclientlibketamaPHPPECL/memcachedPECL/memcachePHPlibmemcachedJavaspymemcachedJavamemcachedclient/dangamemcache-client-forjava/taobaoPythonRubyPerl.NETMySQLPostgreSQLErlangLuaLisp參考:code.google/p/memcached/wiki/Clients6Memcached支持語言C/C++參考:code.goog2.使用Memcached

安裝啟動命令統(tǒng)計72.使用Memcached

安裝啟動命令統(tǒng)計7安裝基于libevent事件處理機制/~provos/libevent/./configure--prefix=/usr/localmakesudomakeinstallmemcached:/./configure--with-libevent=/usr/localmakemakeinstall8安裝基于libevent事件處理機制/安裝成功

memcached-h9安裝成功

memcached-h9主要啟動參數(shù)啟動方式:-d 以守護程序(daemon)方式運行-uroot 指定用戶,如果當(dāng)前為root,需要使用此參數(shù)指定用戶-P/tmp/a.pid 保存PID到指定文件內(nèi)存設(shè)置:-m1024 數(shù)據(jù)內(nèi)存數(shù)量,不包含memcached本身占用,單位為MB-M 內(nèi)存不夠時禁止LRU,報錯-n48 初始chunk=key+suffix+value+32結(jié)構(gòu)體,默認(rèn)48字節(jié)-f1.25 增長因子,默認(rèn)1.25-L 啟用大內(nèi)存頁,可以降低內(nèi)存浪費,改進性能連接設(shè)置:-l 監(jiān)聽的IP地址,本機可以不設(shè)置此參數(shù)-p11211 TCP端口,默認(rèn)為11211,可以不設(shè)置-U11211 UDP端口,默認(rèn)為11211,0為關(guān)閉并發(fā)設(shè)置:-c1024 最大并發(fā)連接數(shù),默認(rèn)1024,最好是200-t4 線程數(shù),默認(rèn)4。由于memcached采用NIO,所以更多線程沒有太多作用-R20 每個event連接最大并發(fā)數(shù),默認(rèn)20-C 禁用CAS命令(可以禁止版本計數(shù),減少開銷)例如:/usr/local/bin/memcached-d-unobody-m1024-p11210-l0-P/opt/memcached/pid/m11210.pid10主要啟動參數(shù)啟動方式:例如:/usr/local/bin/mdaemontools啟動工具memcached有可能會死掉(mixi.jp經(jīng)驗)監(jiān)視memcached進程并自動啟動啟動腳本樣例:run.sh參考:cr.yp.to/daemontools.html#!/bin/shif[f/etc/sysconfig/memcached];then./etc/sysconfig/memcachedfiexec2>&1execmemcachedp$PORTu$USERm$CACHESIZEc$MAXCONN$OPTIONS11daemontools啟動工具memcached有可能會死掉memcached調(diào)試-v +輸出error/warning-vv +輸出命令/響應(yīng)-vvv +輸出內(nèi)部狀態(tài)[10_10_82_80~]#memcached-d-uroot-m1024-p11210-vvv[10_10_82_80~]#memcached-d-uroot-m1024-p11211–vvvslabclass1:chunksize96perslab10922slabclass2:chunksize120perslab8738slabclass42:chunksize1048576perslab1<36serverlistening(auto-negotiate)<37sendbufferwas126976,now268435456<37serverlistening(udp)<37serverlistening(udp)<37serverlistening(udp)<37serverlistening(udp)<38newauto-negotiatingclientconnection38:Clientusingtheasciiprotocol<38stats<38getabc>38END<38quit<38connectionclosed.telnetlocalhost11210/11211statsgetabcquit12memcached調(diào)試-v +輸出error/warningmemcached命令列表存儲命令set/add/replace/append/prepend/cas讀取命令get=bget?/gets刪除命令delete計數(shù)命令incr/decr統(tǒng)計命令stats/settings/items/sizes/slabs工具memcached-tool13memcached命令列表存儲命令set/add/repla存儲命令格式:<command><key><flags><exptime><bytes>[<version>]\r\n<datablock>\r\n<status>\r\n14存儲命令格式:14存儲命令set/add/replacesetliu3204javaSTORED//正確getliuVALUEabc324javaENDsetliu3204cplusCLIENT_ERRORbaddatachunkERROR//長度錯誤setliu3204javaSTOREDaddliu3205cplusNOT_STORED//已存在不能addgetliuVALUEabc324javaENDaddsong3205cplusSTORED//不存在可以addsetliu3204javaSTOREDreplaceliu3205cplusSTORED//已存在可以replacegetliuVALUEcplus325liuENDreplaceyang3205cplusNOT_STORED//不存在不能replacedatablock長度必須正確add只能添加不存在的keyreplace只能替換已有的key15存儲命令set/add/replacesetliu32讀取命令get/getsgetliusongyangVALUEliu324javaVALUEsong325cplusEND//查詢多個鍵值getsliuVALUEliu32412javaEND//取得版本號replaceliu3204javaSTORED//增加版本號getliuVALUEliu324javaENDgetsliuVALUEliu32413javaEND格式:<command><key>*\r\nVALUE<key1><flags><bytes>[<version>]\r\n<datablock>\r\n…VALUE<keyn><flags><bytes>[<version>]\r\n<datablock>\r\nEND\r\ncommand:get普通查詢,gets用于查詢帶版本的值版本號+116讀取命令get/getsgetliusongyangg檢查存儲命令cascas即checkandset,只有版本號相匹配時才能存儲,否則返回EXISTS設(shè)計意圖:解決多客戶端并發(fā)修改同一條記錄的問題,防止使用經(jīng)過改變了的value/key對casliu320512cplusEXISTSgetsliuVALUEliu32413javaEND//版本號不同不修改casliu320513cplusSTOREDgetsliuVALUEliu32514cplusEND//版本號相同才修改當(dāng)前版本號為13,按12不能修改當(dāng)前版本號為13,按13可以修改17檢查存儲命令cascas即checkandset,只有版計數(shù)命令incr/decr格式:incr/decr<key><int><int>要求:key必須存在,value必須是數(shù)字setcount32011STOREDincrcount89decrcount27deletecountDELETEDincrcount1NOT_FOUNDincrliu2CLIENT_ERRORcannotincrementordecrementnon-numericvalue實現(xiàn)計數(shù)器key不存在不能計數(shù)value不是數(shù)字不能計數(shù)18計數(shù)命令incr/decr格式:setcount320刪除命令delete格式:delete<key>[<time>]DELETE\r\ntime:秒數(shù)或Unixtime,在time時間內(nèi)不能add或replace,但能set,不能get。過期后才能夠重新set有效并能getdeleteliuDELETEDgetliuEND19刪除命令delete格式:deleteliu19統(tǒng)計命令statsstatsSTATpid23178STATuptime1039318STATtime1292036037STATversion1.4.2STATpointer_size64STATrusage_user1011.574217STATrusage_system1677.713948STATcurr_connections114STATtotal_connections73801STATconnection_structures149STATcmd_get79114939STATcmd_set27302514STATcmd_flush0STATget_hits79114939STATget_misses24322507STATdelete_misses133928STATdelete_hits402569STATincr_misses0STATincr_hits0STATdecr_misses0STATdecr_hits0STATcas_misses0STATcas_hits0STATcas_badval0STATauth_cmds0STATauth_errors0STATbytes_read59348603658STATbytes_written425549797158STATlimit_maxbytes4294967296STATaccepting_conns1STATlisten_disabled_num0STATthreads4STATconn_yields0STATbytes3832761746STATcurr_items2854731STATtotal_items27302514STATevictions18456987STATreclaimed0END格式:stats[<args>]\r\nSTAT<name><value>\r\nEND\r\n20統(tǒng)計命令statsstatsSTATdecr_missesstats統(tǒng)計項分析CPU占用是否高分析連接數(shù)是否太多分析命中率是否太低分析字節(jié)數(shù)流量分析對象數(shù)LRU頻率21stats統(tǒng)計項分析CPU占用是否高分析連接數(shù)是否太多分析命statssettings查看設(shè)置statssettingsSTATmaxbytes0STATmaxconns1024STATtcpport11213STATudpport11211STATinterNULLSTATverbosity0STAToldest0STATevictionsonSTATdomain_socketNULLSTATumask700STATgrowth_factor1.25STATchunk_size48STATnum_threads4STATstat_key_prefix:STATdetail_enablednoSTATreqs_per_event20STATcas_enabledyesSTATtcp_backlog1024STATbinding_protocolauto-negotiateSTATitem_size_max1048576END22statssettings查看設(shè)置statssettinstatsitems數(shù)據(jù)項統(tǒng)計statsitemsSTATitems:1:number10922STATitems:1:age350988STATitems:1:evicted3829STATitems:1:evicted_nonzero0STATitems:1:evicted_time690209STATitems:1:outofmemory0STATitems:1:tailrepairs0STATitems:2:number375734STATitems:2:age898762STATitems:2:evicted2661399STATitems:2:evicted_nonzero0STATitems:2:evicted_time142500STATitems:2:outofmemory0STATitems:2:tailrepairs0...STATitems:40:number14STATitems:40:age977359STATitems:40:evicted25STATitems:40:evicted_nonzero0STATitems:40:evicted_time60653STATitems:40:outofmemory0STATitems:40:tailrepairs0END23statsitems數(shù)據(jù)項統(tǒng)計statsitems23statssizes對象數(shù)量統(tǒng)計statssizesSTAT9610922STAT128375734STAT160201916STAT192816311STAT2248685STAT2563321STAT2883549STAT320826STAT352427

END格式:STAT<size><count>注意:會鎖定服務(wù),暫停處理請求24statssizes對象數(shù)量統(tǒng)計statssizes格式statsslabs區(qū)塊統(tǒng)計statsslabsSTAT1:chunk_size96STAT1:chunks_per_page10922...STAT40:chunk_size1048576STAT40:chunks_per_page1STAT40:total_pages15STAT40:total_chunks15STAT40:used_chunks14STAT40:free_chunks1STAT40:free_chunks_end0STAT40:mem_requested9348752STAT40:get_hits9593STAT40:cmd_set4828STAT40:delete_hits40STAT40:incr_hits0STAT40:decr_hits0STAT40:cas_hits0STAT40:cas_badval0STATactive_slabs40STATtotal_malloced4294496616END區(qū)塊數(shù)量命中率分析占用情況被浪費內(nèi)存數(shù)=(total_chunks*chunk_size)-mem_requested如果太大,需要調(diào)整factor25statsslabs區(qū)塊統(tǒng)計statsslabs區(qū)塊數(shù)量其他命令versionflush_allquitecho/nc快捷方式[10_10_82_80~]#telnetlocalhost11211Trying...Connectedtolocalhost.localdomain().Escapecharacteris'^]'.versionVERSION1.4.5flush_allOKquitConnectionclosedbyforeignhost.Youhavenewmailin/var/spool/mail/root[10_10_82_80~]#echoflush_all|nclocalhost11211OK[10_10_82_80~]#echogetliu|nclocalhost11210VALUEliu324javaEND26其他命令version[10_10_82_80~]#tememcached-tool方便調(diào)優(yōu)Perl腳本:code.sixapart/svn/memcached/trunk/server/scripts/memcached-tool0:/opt/test運行:memcached-tool95:11210memcached-tool95:11210displaymemcached-tool95:11210statsmemcached-tool95:11210statsitemsmemcached-tool95:11210statsslabsmemcached-tool95:11210dumpmemcached-tool95:11210move//數(shù)據(jù)遷移27memcached-tool方便調(diào)優(yōu)Perl腳本:code.memcached-toolmemcached-tool95:11213#Item_SizeMax_age1MB_pagesCountFull?196B384295s1 10922 yes2120B964793s43 375734 yes3152B196s1 1021 no4192B962720s186 1015746 yes5240B954705s2 8734 yes6304B945823s2 6898 yes7384B954218s9 24569 yes8480B980911s91 198744 yes9600B963930s104 181688 yes10752B964602s274 381956 yes11944B963902s173 192030 yes121.2kB962169s79 69914 yes131.4kB959572s67 47436 yes141.8kB957541s69 38916 yes152.3kB956767s75 33825 yes162.8kB957198s105 37904 yes173.5kB957049s128 36864 yes184.4kB955935s129 29669 yes195.5kB956721s111 20423 yes206.9kB954862s119 17492 yes218.7kB953024s157 18526 yes2210.8kB953361s226 21243 yes2313.6kB953301s315 23625 yes2416.9kB958310s356 21360 yes2521.2kB961544s330 15839 yes2626.5kB961128s259 9840 yes2733.1kB962389s181 5430 yes2841.4kB966056s141 3384 yes2951.7kB966694s111 2109 yes3064.7kB965340s87 1305 yes3180.9kB962627s65 779 yes32101.1kB965821s38 379 yes33126.3kB949182s25 200 yes34157.9kB965799s18 107 yes35197.4kB876687s1154 yes36246.8kB938290s9 36 yes37308.5kB837011s8 22 yes38385.6kB886180s1427 yes39482.0kB908224s6 10 yes401024.0kB990279s1514 yes28memcached-toolmemcached-tool1UDP協(xié)議何時使用UDP?TCP連接客戶端過多時選用允許少量的操作失敗如get有少量丟失,可以當(dāng)做沒被cache處理frameheader:8byte+tcppacket0-1RequestID2-3Sequencenumber4-5Totalnumberofdatagramsinthismessage6-7Reservedforfutureuse;mustbe029UDP協(xié)議何時使用UDP?29總結(jié):memcached使用安裝libeventmemcached啟動參數(shù)自啟動daemontools命令存儲命令set/add/replace/append/prepend/cas讀取命令get=bget?/gets刪除命令delete計數(shù)命令incr/decr統(tǒng)計命令stats/settings/items/sizes/slabs工具memcached-tool30總結(jié):memcached使用安裝303.深入Memcached內(nèi)部313.深入Memcached內(nèi)部31memcached機制守護進程機制UNIXdaemonSocket事件處理機制non-blocked:非阻塞libevent:異步事件處理epoll/kqueue內(nèi)存管理機制slab:內(nèi)存分配機制LRU:對象清除機制Hash機制:快速檢索item多線程處理機制:pthread(POSIX)線程模式編譯時開啟:./configure–enable-threads目前還比較粗糙,鎖機制locking不夠完善負(fù)載過重時,可以開啟(-t線程數(shù)為CPU核數(shù))32memcached機制守護進程機制32memcached內(nèi)存管理機制SLAB內(nèi)存處理機制提前分配大內(nèi)存slab1MB,再進行小對象填充chunk避免大量重復(fù)的初始化和清理減輕內(nèi)存管理器負(fù)擔(dān)避免頻繁malloc/free系統(tǒng)碎片懶惰檢測機制不檢測item對象是否超時get時檢查item對象是否應(yīng)該刪除懶惰刪除機制刪除item對象時,不釋放內(nèi)存,作刪除標(biāo)記,指針放入slot回收插槽,下次分配的時候直接使用33memcached內(nèi)存管理機制SLAB內(nèi)存處理機制33名詞解釋slabclass:內(nèi)存區(qū)類別(48byte-1MB)slab==page:動態(tài)創(chuàng)建的實際內(nèi)存區(qū)slabclassid:slabclass的IDchunk:數(shù)據(jù)區(qū)塊,固定大小item:實際存儲在chunk中的數(shù)據(jù)項34名詞解釋slabclass:內(nèi)存區(qū)類別(48byte-1Mslab內(nèi)存分配35slab內(nèi)存分配35slab內(nèi)存結(jié)構(gòu)圖:二維數(shù)組鏈表

slab是一次申請內(nèi)存的最小單位每個slab都是1MBchunk填充item后會有空間浪費雙向鏈表key索引表剩余空間指針slab指針列表回收空間指針36slab內(nèi)存結(jié)構(gòu)圖:二維數(shù)組鏈表

slab內(nèi)存分配實例37slab內(nèi)存分配實例37實例數(shù)據(jù)--195:112134GB38實例數(shù)據(jù)--195:112134GB38計算slab占用內(nèi)存39計算slab占用內(nèi)存39slab參數(shù)進程內(nèi)存區(qū)slabclass元信息:1.1中是21byte,1.2中是200byteHashtable:1.1中位41MB,1.2中位65MB數(shù)據(jù)內(nèi)存區(qū)slab默認(rèn)大小為1048576byte(1MB),大于1MB數(shù)據(jù)忽略chunk初始大小,1.1中是1byte,1.2中是48byte增長因子factor1.1中,chunk大小為初始大小*2^n,n為classid,即:id為0的slab大小1byte,id為1的slab大小2byte,id為2的slab大小4byte...id為20的slab,每chunk大小為1MB,只有一個chunk1.2中有一個factor值,默認(rèn)為1.2596,120,152...40slab參數(shù)進程內(nèi)存區(qū)40Item內(nèi)存分配41Item內(nèi)存分配41Item數(shù)據(jù)格式

Item是保存在chunk中的實際數(shù)據(jù)42Item數(shù)據(jù)格式

新建Item分配內(nèi)存過程快速定位slabclassid計算key+value+suffix+32結(jié)構(gòu)體,如90byte如果>1MB,無法存儲丟棄取最小冗余的slabclass如:有48,96,120,存90會選擇96按順序?qū)ふ铱捎胏hunkslot:檢查slab回收空間slot里是否有剩余chunkdelete:delete時標(biāo)記到slotexptime:get時檢查的過期對象標(biāo)記到slotend_page_ptr:檢查page中是否有剩余chunkmemory:內(nèi)存還有剩余則開辟新的slabLRU:Slab內(nèi)部掃描Item雙向鏈表50次43新建Item分配內(nèi)存過程快速定位slabclassid43內(nèi)存有浪費了!!slab尾部剩余空間如classid=40中,兩個chunk占用了1009384byte,就有1048576-1009384=39192byte被浪費解決辦法:規(guī)劃slab=chunk*n整數(shù)倍

slab中chunk利用率低:申請的slab只存放了一個Item解決辦法:規(guī)劃slab=chunkchunk存儲Item浪費如Item是100,存到128字節(jié)chunk,就有28字節(jié)浪費解決辦法:規(guī)劃chunk=Item44內(nèi)存有浪費了!!slab尾部剩余空間44使用合適的factor,減少浪費-f參數(shù):默認(rèn)為1.25,曾經(jīng)為2值越小,slab中chunksize差距越小,內(nèi)存浪費越小1.25適合緩存幾百字節(jié)的對象slabclass1:chunksize128perslab8192slabclass2:chunksize256perslab4096slabclass3:chunksize512perslab2048slabclass4:chunksize1024perslab1024slabclass5:chunksize2048perslab512slabclass6:chunksize4096perslab256slabclass7:chunksize8192perslab128slabclass8:chunksize16384perslab64slabclass9:chunksize32768perslab32slabclass10:chunksize65536perslab16slabclass11:chunksize131072perslab8slabclass12:chunksize262144perslab4slabclass13:chunksize524288perslab2slabclass1:chunksize88perslab11915slabclass2:chunksize112perslab9362slabclass3:chunksize144perslab7281slabclass4:chunksize184perslab5698slabclass5:chunksize232perslab4519slabclass6:chunksize296perslab3542slabclass7:chunksize376perslab2788slabclass8:chunksize472perslab2221slabclass9:chunksize592perslab1771slabclass10:chunksize744perslab1409factor=2factor=1.25建議:計算一下數(shù)據(jù)的預(yù)期平均長度,調(diào)整factor,以獲得最恰當(dāng)?shù)脑O(shè)置45使用合適的factor,減少浪費-f參數(shù):默認(rèn)為1.25,曾根據(jù)數(shù)據(jù)分布調(diào)整factor非均勻分布,即數(shù)據(jù)長度集中在幾個區(qū)域內(nèi)如保存用戶Session更極端的狀態(tài)是等長數(shù)據(jù)如定長鍵值,定長數(shù)據(jù)多見于訪問、在線統(tǒng)計或執(zhí)行鎖計算Item長度key鍵長+suffix+value值長+結(jié)構(gòu)大?。?2字節(jié))46根據(jù)數(shù)據(jù)分布調(diào)整factor非均勻分布,即數(shù)據(jù)長度集中在幾個調(diào)優(yōu)的最高指示精神提高內(nèi)存利用率,減少內(nèi)存浪費提高命中率(80%,95%?)調(diào)優(yōu)方法:f參數(shù):factor增長因子n參數(shù):chunk初始值47調(diào)優(yōu)的最高指示精神提高內(nèi)存利用率,減少內(nèi)存浪費47一切都是為了更快低CPU消耗(瓶頸在于網(wǎng)絡(luò)IO)libevent事件機制slab內(nèi)存預(yù)分配機制適合使用大量低CPU的機器搭建集群32位機器最大2GB,64GB無限制-m分配內(nèi)存為數(shù)據(jù)區(qū),memcached本身也需要占用內(nèi)存,因此不可將物理內(nèi)存全部分配使用連接池維持連接48一切都是為了更快低CPU消耗(瓶頸在于網(wǎng)絡(luò)IO)48因為優(yōu)秀,所以不足Can’tdump無法備份,重啟無法恢復(fù)Can’titerateoverkeys無法查詢Notpersistent沒有持久化,重啟全部丟失Notredundant單點故障failoverNoSessions崩潰沒法查找原因Nosecurity任何機器都可以telnet,需要放在防火墻后內(nèi)存問題LRU是slab局部,沒有全局有空間浪費日志問題沒有合理的日志集群問題集群增加機器成本高49因為優(yōu)秀,所以不足Can’tdump49改進計劃擴展二進制協(xié)議不需要文本解析,速度更快減少文本協(xié)議的漏洞外部引擎加載功能MySQLplugin50改進計劃擴展二進制協(xié)議504.Memcached分布式514.Memcached分布式51Memcached使用方式

--客戶端實現(xiàn)Hash52Memcached使用方式

Memcached架構(gòu)層次

--減少DB訪問,提高Web速度53Memcached架構(gòu)層次

添加對象時54添加對象時54獲取對象時55獲取對象時55最常用的Hash算法根據(jù)余數(shù)計算Hash如Perl函數(shù)庫:Cache::Memcached優(yōu)點:簡單、分散性優(yōu)秀缺點:添加/移除服務(wù)器時,緩存重組代價巨大,影響命中率26個字母由3個節(jié)點增加一個節(jié)點,命中率下降了23%三個節(jié)點:node1node2nod3node1:a,c,d,e,h,j,n,u,w,xnode2:g,i,k,l,p,r,s,ynode3:b,f,m,o,q,t,v,z四個節(jié)點:node1node2node3node4node1:d,f,m,o,t,vnode2:b,i,k,p,r,ynode3:e,g,l,n,u,wnode4:a,c,h,j,q,s,x,z增加節(jié)點56最常用的Hash算法根據(jù)余數(shù)計算Hash三個節(jié)點:node1ConsistentHash參考原文:alpha.mixi.co.jp//?p=158http://hyuki/yukiwiki/wiki.cgi?ConsistentHashing57ConsistentHash參考原文:57添加服務(wù)器時ConsistentHashing最大限度地抑制了鍵的重新分布有的ConsistentHashing的實現(xiàn)方法還采用了虛擬節(jié)點的思想58添加服務(wù)器時ConsistentHashing最大限度地抑支持ConsistentHash的函數(shù)庫libketama的PHP庫libketama(網(wǎng)站Last.fm)Perl客戶端Cache::Memcached::Fast()Cache::Memcached::libmemcached()59支持ConsistentHash的函數(shù)庫libketama5.key-value系統(tǒng)比較605.key-value系統(tǒng)比較60兼容memcached軟件repcached為memcached提供復(fù)制(replication)功能的patch單master單slave,互為主輔Flared存儲到QDBM。實現(xiàn)了異步復(fù)制和failover等功能memagent連接多個memd,實現(xiàn)一致性Hash,請求轉(zhuǎn)發(fā)memcachedb存儲到BerkleyDBTokyoTyrant存儲到TokyoCabinet。與memcached協(xié)議兼容,能通過HTTP訪問61兼容memcached軟件repcached61持久化key-value系統(tǒng)Memcachedb持久化BerkelyDB--Sina主服務(wù)器可讀寫、輔服務(wù)器只讀同步日志文件非常大,需人工定期清理TokyoTyrantTokyoCabinet持久化--mixi.jp優(yōu)點 讀寫4-5w/s,寫100萬0.643秒,讀100萬0.773秒,是BerkeleyDB的幾倍雙機互為主輔模式,主輔庫均可讀寫具有故障轉(zhuǎn)移、日志文件體積小、大數(shù)據(jù)量下表現(xiàn)出色等優(yōu)勢缺點TC在32位下數(shù)據(jù)庫單個文件2GB,64位無限制沒有scale的能力,只能主從復(fù)制TC性能會隨數(shù)據(jù)量的增加而下降,上億條下降較明顯Nuclear--renren一致性Hash,動態(tài)增加/刪除節(jié)點62持久化key-value系統(tǒng)Memcachedb持久化Ber持久化Redis定期異步把數(shù)據(jù)庫flush到硬盤,比Memcached多一個永久存儲功能,優(yōu)點讀寫10w/s,是性能最快的Key-ValueDB最大魅力:支持List鏈表和Set集合,對List/Set各種操作單個value的最大限制是1GB,memcached只能保存1MB主要缺點容量受物理內(nèi)存限制,不能用作海量數(shù)據(jù)的高性能讀寫不具有scaleRedis適合的場景較小數(shù)據(jù)量的高性能操作和運算上使用Redis的網(wǎng)站有g(shù)ithub,EngineYard63持久化Redis定期異步把數(shù)據(jù)庫flush到硬盤,比Memc分布式數(shù)據(jù)庫CouchDB持久化Cassandra分布式/NoSQL/scale適合于實時數(shù)據(jù)處理MongoDB分布式/NoSQLBigTable/Hbase適合于數(shù)據(jù)倉庫、大型數(shù)據(jù)的處理與分析64分布式數(shù)據(jù)庫CouchDB持久化64memcached測試65memcached測試65memd&memdb66memd&memdb66memdb/TT/redis測試

500w+100byteread/write67memdb/TT/redis測試

500w+100bytememdb/TT/redis測試

50w+20kread/write68memdb/TT/redis測試

50w+20kread/6.Memcached客戶端696.Memcached客戶端69Java客戶端spymemcacheddangataobaoclientdal70Java客戶端spymemcached70Memcached

內(nèi)存分析、調(diào)優(yōu)、集群劉中兵搜狐TPCv12019/12/12lzbboxhotmailMemcached

內(nèi)存分析、調(diào)優(yōu)、集群劉中兵搜狐TPC71導(dǎo)航1.Memcached背景2.Memcached使用:安裝、啟動、命令、統(tǒng)計3.深入Memcached內(nèi)部:slab、page、item4.Memcached分布式:一致性Hash5.key-value系統(tǒng)比較:集群、性能對比6.Memcached客戶端72導(dǎo)航1.Memcached背景21.Memcached背景1.Memcached背景73Memcached是什么memcached由LiveJournal運營人員開發(fā)memcached是高性能的分布式內(nèi)存緩存服務(wù)器,開源協(xié)議簡單基于libevent時間處理:epoll/kqueue內(nèi)置內(nèi)存存儲方式:slab/LRU目前用戶LiveJournalFacebookmixiDiggWikipediaVox74Memcached是什么memcached由LiveJourfacebook200memcachedservers16GB四核AMD643TBcachedata75facebook200memcachedservers5Memcached支持語言C/C++libmemcachedlibmemcacheapr_memcachememcaheclientlibketamaPHPPECL/memcachedPECL/memcachePHPlibmemcachedJavaspymemcachedJavamemcachedclient/dangamemcache-client-forjava/taobaoPythonRubyPerl.NETMySQLPostgreSQLErlangLuaLisp參考:code.google/p/memcached/wiki/Clients76Memcached支持語言C/C++參考:code.goog2.使用Memcached

安裝啟動命令統(tǒng)計772.使用Memcached

安裝啟動命令統(tǒng)計7安裝基于libevent事件處理機制/~provos/libevent/./configure--prefix=/usr/localmakesudomakeinstallmemcached:/./configure--with-libevent=/usr/localmakemakeinstall78安裝基于libevent事件處理機制/安裝成功

memcached-h79安裝成功

memcached-h9主要啟動參數(shù)啟動方式:-d 以守護程序(daemon)方式運行-uroot 指定用戶,如果當(dāng)前為root,需要使用此參數(shù)指定用戶-P/tmp/a.pid 保存PID到指定文件內(nèi)存設(shè)置:-m1024 數(shù)據(jù)內(nèi)存數(shù)量,不包含memcached本身占用,單位為MB-M 內(nèi)存不夠時禁止LRU,報錯-n48 初始chunk=key+suffix+value+32結(jié)構(gòu)體,默認(rèn)48字節(jié)-f1.25 增長因子,默認(rèn)1.25-L 啟用大內(nèi)存頁,可以降低內(nèi)存浪費,改進性能連接設(shè)置:-l 監(jiān)聽的IP地址,本機可以不設(shè)置此參數(shù)-p11211 TCP端口,默認(rèn)為11211,可以不設(shè)置-U11211 UDP端口,默認(rèn)為11211,0為關(guān)閉并發(fā)設(shè)置:-c1024 最大并發(fā)連接數(shù),默認(rèn)1024,最好是200-t4 線程數(shù),默認(rèn)4。由于memcached采用NIO,所以更多線程沒有太多作用-R20 每個event連接最大并發(fā)數(shù),默認(rèn)20-C 禁用CAS命令(可以禁止版本計數(shù),減少開銷)例如:/usr/local/bin/memcached-d-unobody-m1024-p11210-l0-P/opt/memcached/pid/m11210.pid80主要啟動參數(shù)啟動方式:例如:/usr/local/bin/mdaemontools啟動工具memcached有可能會死掉(mixi.jp經(jīng)驗)監(jiān)視memcached進程并自動啟動啟動腳本樣例:run.sh參考:cr.yp.to/daemontools.html#!/bin/shif[f/etc/sysconfig/memcached];then./etc/sysconfig/memcachedfiexec2>&1execmemcachedp$PORTu$USERm$CACHESIZEc$MAXCONN$OPTIONS81daemontools啟動工具memcached有可能會死掉memcached調(diào)試-v +輸出error/warning-vv +輸出命令/響應(yīng)-vvv +輸出內(nèi)部狀態(tài)[10_10_82_80~]#memcached-d-uroot-m1024-p11210-vvv[10_10_82_80~]#memcached-d-uroot-m1024-p11211–vvvslabclass1:chunksize96perslab10922slabclass2:chunksize120perslab8738slabclass42:chunksize1048576perslab1<36serverlistening(auto-negotiate)<37sendbufferwas126976,now268435456<37serverlistening(udp)<37serverlistening(udp)<37serverlistening(udp)<37serverlistening(udp)<38newauto-negotiatingclientconnection38:Clientusingtheasciiprotocol<38stats<38getabc>38END<38quit<38connectionclosed.telnetlocalhost11210/11211statsgetabcquit82memcached調(diào)試-v +輸出error/warningmemcached命令列表存儲命令set/add/replace/append/prepend/cas讀取命令get=bget?/gets刪除命令delete計數(shù)命令incr/decr統(tǒng)計命令stats/settings/items/sizes/slabs工具memcached-tool83memcached命令列表存儲命令set/add/repla存儲命令格式:<command><key><flags><exptime><bytes>[<version>]\r\n<datablock>\r\n<status>\r\n84存儲命令格式:14存儲命令set/add/replacesetliu3204javaSTORED//正確getliuVALUEabc324javaENDsetliu3204cplusCLIENT_ERRORbaddatachunkERROR//長度錯誤setliu3204javaSTOREDaddliu3205cplusNOT_STORED//已存在不能addgetliuVALUEabc324javaENDaddsong3205cplusSTORED//不存在可以addsetliu3204javaSTOREDreplaceliu3205cplusSTORED//已存在可以replacegetliuVALUEcplus325liuENDreplaceyang3205cplusNOT_STORED//不存在不能replacedatablock長度必須正確add只能添加不存在的keyreplace只能替換已有的key85存儲命令set/add/replacesetliu32讀取命令get/getsgetliusongyangVALUEliu324javaVALUEsong325cplusEND//查詢多個鍵值getsliuVALUEliu32412javaEND//取得版本號replaceliu3204javaSTORED//增加版本號getliuVALUEliu324javaENDgetsliuVALUEliu32413javaEND格式:<command><key>*\r\nVALUE<key1><flags><bytes>[<version>]\r\n<datablock>\r\n…VALUE<keyn><flags><bytes>[<version>]\r\n<datablock>\r\nEND\r\ncommand:get普通查詢,gets用于查詢帶版本的值版本號+186讀取命令get/getsgetliusongyangg檢查存儲命令cascas即checkandset,只有版本號相匹配時才能存儲,否則返回EXISTS設(shè)計意圖:解決多客戶端并發(fā)修改同一條記錄的問題,防止使用經(jīng)過改變了的value/key對casliu320512cplusEXISTSgetsliuVALUEliu32413javaEND//版本號不同不修改casliu320513cplusSTOREDgetsliuVALUEliu32514cplusEND//版本號相同才修改當(dāng)前版本號為13,按12不能修改當(dāng)前版本號為13,按13可以修改87檢查存儲命令cascas即checkandset,只有版計數(shù)命令incr/decr格式:incr/decr<key><int><int>要求:key必須存在,value必須是數(shù)字setcount32011STOREDincrcount89decrcount27deletecountDELETEDincrcount1NOT_FOUNDincrliu2CLIENT_ERRORcannotincrementordecrementnon-numericvalue實現(xiàn)計數(shù)器key不存在不能計數(shù)value不是數(shù)字不能計數(shù)88計數(shù)命令incr/decr格式:setcount320刪除命令delete格式:delete<key>[<time>]DELETE\r\ntime:秒數(shù)或Unixtime,在time時間內(nèi)不能add或replace,但能set,不能get。過期后才能夠重新set有效并能getdeleteliuDELETEDgetliuEND89刪除命令delete格式:deleteliu19統(tǒng)計命令statsstatsSTATpid23178STATuptime1039318STATtime1292036037STATversion1.4.2STATpointer_size64STATrusage_user1011.574217STATrusage_system1677.713948STATcurr_connections114STATtotal_connections73801STATconnection_structures149STATcmd_get79114939STATcmd_set27302514STATcmd_flush0STATget_hits79114939STATget_misses24322507STATdelete_misses133928STATdelete_hits402569STATincr_misses0STATincr_hits0STATdecr_misses0STATdecr_hits0STATcas_misses0STATcas_hits0STATcas_badval0STATauth_cmds0STATauth_errors0STATbytes_read59348603658STATbytes_written425549797158STATlimit_maxbytes4294967296STATaccepting_conns1STATlisten_disabled_num0STATthreads4STATconn_yields0STATbytes3832761746STATcurr_items2854731STATtotal_items27302514STATevictions18456987STATreclaimed0END格式:stats[<args>]\r\nSTAT<name><value>\r\nEND\r\n90統(tǒng)計命令statsstatsSTATdecr_missesstats統(tǒng)計項分析CPU占用是否高分析連接數(shù)是否太多分析命中率是否太低分析字節(jié)數(shù)流量分析對象數(shù)LRU頻率91stats統(tǒng)計項分析CPU占用是否高分析連接數(shù)是否太多分析命statssettings查看設(shè)置statssettingsSTATmaxbytes0STATmaxconns1024STATtcpport11213STATudpport11211STATinterNULLSTATverbosity0STAToldest0STATevictionsonSTATdomain_socketNULLSTATumask700STATgrowth_factor1.25STATchunk_size48STATnum_threads4STATstat_key_prefix:STATdetail_enablednoSTATreqs_per_event20STATcas_enabledyesSTATtcp_backlog1024STATbinding_protocolauto-negotiateSTATitem_size_max1048576END92statssettings查看設(shè)置statssettinstatsitems數(shù)據(jù)項統(tǒng)計statsitemsSTATitems:1:number10922STATitems:1:age350988STATitems:1:evicted3829STATitems:1:evicted_nonzero0STATitems:1:evicted_time690209STATitems:1:outofmemory0STATitems:1:tailrepairs0STATitems:2:number375734STATitems:2:age898762STATitems:2:evicted2661399STATitems:2:evicted_nonzero0STATitems:2:evicted_time142500STATitems:2:outofmemory0STATitems:2:tailrepairs0...STATitems:40:number14STATitems:40:age977359STATitems:40:evicted25STATitems:40:evicted_nonzero0STATitems:40:evicted_time60653STATitems:40:outofmemory0STATitems:40:tailrepairs0END93statsitems數(shù)據(jù)項統(tǒng)計statsitems23statssizes對象數(shù)量統(tǒng)計statssizesSTAT9610922STAT128375734STAT160201916STAT192816311STAT2248685STAT2563321STAT2883549STAT320826STAT352427

END格式:STAT<size><count>注意:會鎖定服務(wù),暫停處理請求94statssizes對象數(shù)量統(tǒng)計statssizes格式statsslabs區(qū)塊統(tǒng)計statsslabsSTAT1:chunk_size96STAT1:chunks_per_page10922...STAT40:chunk_size1048576STAT40:chunks_per_page1STAT40:total_pages15STAT40:total_chunks15STAT40:used_chunks14STAT40:free_chunks1STAT40:free_chunks_end0STAT40:mem_requested9348752STAT40:get_hits9593STAT40:cmd_set4828STAT40:delete_hits40STAT40:incr_hits0STAT40:decr_hits0STAT40:cas_hits0STAT40:cas_badval0STATactive_slabs40STATtotal_malloced4294496616END區(qū)塊數(shù)量命中率分析占用情況被浪費內(nèi)存數(shù)=(total_chunks*chunk_size)-mem_requested如果太大,需要調(diào)整factor95statsslabs區(qū)塊統(tǒng)計statsslabs區(qū)塊數(shù)量其他命令versionflush_allquitecho/nc快捷方式[10_10_82_80~]#telnetlocalhost11211Trying...Connectedtolocalhost.localdomain().Escapecharacteris'^]'.versionVERSION1.4.5flush_allOKquitConnectionclosedbyforeignhost.Youhavenewmailin/var/spool/mail/root[10_10_82_80~]#echoflush_all|nclocalhost11211OK[10_10_82_80~]#echogetliu|nclocalhost11210VALUEliu324javaEND96其他命令version[10_10_82_80~]#tememcached-tool方便調(diào)優(yōu)Perl腳本:code.sixapart/svn/memcached/trunk/server/scripts/memcached-tool0:/opt/test運行:memcached-tool95:11210memcached-tool95:11210displaymemcached-tool95:11210statsmemcached-tool95:11210statsitemsmemcached-tool95:11210statsslabsmemcached-tool95:11210dumpmemcached-tool95:11210move//數(shù)據(jù)遷移97memcached-tool方便調(diào)優(yōu)Perl腳本:code.memcached-toolmemcached-tool95:11213#Item_SizeMax_age1MB_pagesCountFull?196B384295s1 10922 yes2120B964793s43 375734 yes3

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論