Memcached内存分析、调优、集群.ppt
Memcached培训,Memcached是什么,memcached由LiveJournal运营人员开发memcached是高性能的分布式内存缓存服务器,开源协议简单基于libevent时间处理:epoll/kqueue内置内存存储方式:slab/LRU,Memcached支持语言,C/C+libmemcachedPHPPHP libmemcachedJavaspymemcachedJava memcached client/danga,参考:http:/,安装,基于libevent事件处理机制 http:/www.monkey.org/provos/libevent/./configure-prefix=/usr/localmakesudo make installmemcached:http:/memcached.org/./configure-with-libevent=/usr/localmakemake install,安装成功memcached-h,主要启动参数,启动方式:-d 以守护程序(daemon)方式运行-u root 指定用户,如果当前为 root,需要使用此参数指定用户-P/tmp/a.pid保存PID到指定文件内存设置:-m 1024 数据内存数量,不包含memcached本身占用,单位为 MB-M 内存不够时禁止LRU,报错-n 48初始chunk=key+suffix+value+32结构体,默认48字节-f 1.25 增长因子,默认1.25-L启用大内存页,可以降低内存浪费,改进性能连接设置:-l 127.0.0.1 监听的 IP 地址,本机可以不设置此参数-p 11211 TCP端口,默认为11211,可以不设置-U 11211UDP端口,默认为11211,0为关闭并发设置:-c 1024最大并发连接数,默认1024,最好是200-t 4线程数,默认4。由于memcached采用NIO,所以更多线程没有太多作用-R 20每个event连接最大并发数,默认20-C禁用CAS命令(可以禁止版本计数,减少开销),例如:/usr/local/bin/memcached-d-u nobody-m 1024-p 11210-l 10.8.210.95-P/home/memcached/pid/m11210.pid,memcached命令列表,存储命令set/add/replace/append/prepend/cas读取命令get=bget?/gets删除命令delete计数命令incr/decr统计命令stats/settings/items/sizes/slabs工具memcached-tool,存储命令,格式:rnrnrn,存储命令set/add/replace,set liu 32 0 4javaSTORED/正确get liuVALUE abc 32 4javaENDset liu 32 0 4cplusCLIENT_ERROR bad data chunkERROR/长度错误,set liu 32 0 4javaSTOREDadd liu 32 0 5cplusNOT_STORED/已存在不能addget liuVALUE abc 32 4javaENDadd song 32 0 5cplusSTORED/不存在可以add,set liu 32 0 4javaSTOREDreplace liu 32 0 5cplusSTORED/已存在可以replaceget liuVALUE cplus 32 5liuENDreplace yang 32 0 5cplusNOT_STORED/不存在不能replace,datablock长度必须正确,add只能添加不存在的key,replace只能替换已有的key,读取命令get/gets,get liu song yangVALUE liu 32 4javaVALUE song 32 5cplusEND/查询多个键值,gets liuVALUE liu 32 4 12javaEND/取得版本号replace liu 32 0 4javaSTORED/增加版本号get liuVALUE liu 32 4javaENDgets liuVALUE liu 32 4 13javaEND,格式:*rnVALUE rnrnVALUE rnrnENDrncommand:get普通查询,gets用于查询带版本的值,版本号+1,检查存储命令cas,cas即check and set,只有版本号相匹配时才能存储,否则返回EXISTS设计意图:解决多客户端并发修改同一条记录的问题,防止使用经过改变了的value/key对,cas liu 32 0 5 12cplusEXISTSgets liuVALUE liu 32 4 13javaEND/版本号不同不修改cas liu 32 0 5 13cplusSTOREDgets liuVALUE liu 32 5 14cplusEND/版本号相同才修改,当前版本号为13,按12不能修改,当前版本号为13,按13可以修改,计数命令incr/decr,格式:incr/decr 要求:key必须存在,value必须是数字,set count 32 0 1 1STOREDincr count 89decr count 27,delete count DELETEDincr count 1NOT_FOUND,incr liu 2CLIENT_ERROR cannot increment or decrement non-numeric value,实现计数器,key不存在不能计数,value不是数字不能计数,删除命令delete,格式:delete DELETErntime:秒数或Unixtime,在time时间内不能add或replace,但能set,不能get。过期后才能够重新set有效并能get,delete liuDELETEDget liuEND,统计命令stats,statsSTAT pid 23178STAT uptime 1039318STAT time 1292036037STAT version 1.4.2STAT pointer_size 64STAT rusage_user 1011.574217STAT rusage_system 1677.713948STAT curr_connections 114STAT total_connections 73801STAT connection_structures 149STAT cmd_get 79114939STAT cmd_set 27302514STAT cmd_flush 0STAT get_hits 79114939STAT get_misses 24322507STAT delete_misses 133928STAT delete_hits 402569STAT incr_misses 0STAT incr_hits 0,STAT decr_misses 0STAT decr_hits 0STAT cas_misses 0STAT cas_hits 0STAT cas_badval 0STAT auth_cmds 0STAT auth_errors 0STAT bytes_read 59348603658STAT bytes_written 425549797158STAT limit_maxbytes 4294967296STAT accepting_conns 1STAT listen_disabled_num 0STAT threads 4STAT conn_yields 0STAT bytes 3832761746STAT curr_items 2854731STAT total_items 27302514STAT evictions 18456987STAT reclaimed 0END,格式:stats rnSTAT rnENDrn,stats统计项,分析CPU占用是否高,分析连接数是否太多,分析命中率是否太低,分析字节数流量,分析对象数LRU频率,stats settings查看设置,stats settingsSTAT maxbytes 0STAT maxconns 1024STAT tcpport 11213STAT udpport 11211STAT inter NULLSTAT verbosity 0STAT oldest 0STAT evictions onSTAT domain_socket NULLSTAT umask 700STAT growth_factor 1.25STAT chunk_size 48STAT num_threads 4STAT stat_key_prefix:STAT detail_enabled noSTAT reqs_per_event 20STAT cas_enabled yesSTAT tcp_backlog 1024STAT binding_protocol auto-negotiateSTAT item_size_max 1048576END,stats items数据项统计,stats itemsSTAT items:1:number 10922STAT items:1:age 350988STAT items:1:evicted 3829STAT items:1:evicted_nonzero 0STAT items:1:evicted_time 690209STAT items:1:outofmemory 0STAT items:1:tailrepairs 0STAT items:2:number 375734STAT items:2:age 898762STAT items:2:evicted 2661399STAT items:2:evicted_nonzero 0STAT items:2:evicted_time 142500STAT items:2:outofmemory 0STAT items:2:tailrepairs 0.STAT items:40:number 14STAT items:40:age 977359STAT items:40:evicted 25STAT items:40:evicted_nonzero 0STAT items:40:evicted_time 60653STAT items:40:outofmemory 0STAT items:40:tailrepairs 0END,stats sizes对象数量统计,stats sizesSTAT 96 10922STAT 128 375734STAT 160 200416STAT 192 816311STAT 224 8685STAT 256 3321STAT 288 3549STAT 320 826STAT 352 427END,格式:STAT 注意:会锁定服务,暂停处理请求,stats slabs区块统计,stats slabsSTAT 1:chunk_size 96STAT 1:chunks_per_page 10922.STAT 40:chunk_size 1048576STAT 40:chunks_per_page 1STAT 40:total_pages 15STAT 40:total_chunks 15STAT 40:used_chunks 14STAT 40:free_chunks 1STAT 40:free_chunks_end 0STAT 40:mem_requested 9348752STAT 40:get_hits 9593STAT 40:cmd_set 4828STAT 40:delete_hits 40STAT 40:incr_hits 0STAT 40:decr_hits 0STAT 40:cas_hits 0STAT 40:cas_badval 0STAT active_slabs 40STAT total_malloced 4294496616END,区块数量,命中率,分析占用情况,被浪费内存数=(total_chunks*chunk_size)-mem_requested如果太大,需要调整factor,其他命令,versionflush_allquit,10_10_82_80#telnet localhost 11211Trying 127.0.0.1.Connected to localhost.localdomain(127.0.0.1).Escape character is.versionVERSION 1.4.5flush_allOKquitConnection closed by foreign host.You have new mail in/var/spool/mail/root10_10_82_80#echo flush_all|nc localhost 11211OK10_10_82_80#echo get liu|nc localhost 11210VALUE liu 32 4javaEND,UDP协议,何时使用UDP?TCP连接客户端过多时选用允许少量的操作失败如get有少量丢失,可以当做没被cache处理frame header:8byte+tcppacket0-1 Request ID2-3 Sequence number4-5 Total number of datagrams in this message6-7 Reserved for future use;must be 0,总结:memcached使用,安装libeventmemcached启动参数自启动daemontools命令存储命令set/add/replace/append/prepend/cas读取命令get=bget?/gets删除命令delete计数命令incr/decr统计命令stats/settings/items/sizes/slabs工具memcached-tool,memcached机制,守护进程机制UNIX daemonSocket事件处理机制non-blocked:非阻塞libevent:异步事件处理epoll/kqueue内存管理机制slab:内存分配机制LRU:对象清除机制Hash机制:快速检索item多线程处理机制:pthread(POSIX)线程模式编译时开启:./configure enable-threads目前还比较粗糙,锁机制locking不够完善负载过重时,可以开启(-t线程数为CPU核数),memcached内存管理机制,SLAB内存处理机制提前分配大内存slab 1MB,再进行小对象填充chunk避免大量重复的初始化和清理减轻内存管理器负担避免频繁malloc/free系统碎片懒惰检测机制不检测item对象是否超时get时检查item对象是否应该删除懒惰删除机制删除item对象时,不释放内存,作删除标记,指针放入slot回收插槽,下次分配的时候直接使用,名词解释,slab class:内存区类别(48byte-1MB)slab=page:动态创建的实际内存区slab classid:slab class的IDchunk:数据区块,固定大小item:实际存储在chunk中的数据项,slab内存结构图:二维数组链表 slab是一次申请内存的最小单位,每个slab都是1MB,chunk填充item后会有空间浪费,双向链表,key索引表,剩余空间指针,slab指针列表,回收空间指针,slab内存分配实例,计算slab占用内存,slab参数,进程内存区slabclass元信息:1.1中是21byte,1.2中是200byteHashtable:1.1中位41MB,1.2中位65MB数据内存区slab默认大小为1048576byte(1MB),大于1MB数据忽略chunk初始大小,1.1中是1byte,1.2中是48byte增长因子factor1.1中,chunk大小为初始大小*2n,n为classid,即:id为0的slab大小1byte,id为1的slab大小2byte,id为2的slab大小4byte.id为20的slab,每chunk大小为1MB,只有一个chunk1.2中有一个factor值,默认为1.2596,120,152.,Item数据格式 Item是保存在chunk中的实际数据,新建Item分配内存过程,快速定位slab classid计算key+value+suffix+32结构体,如90byte如果1MB,无法存储丢弃取最小冗余的slab class如:有48,96,120,存90会选择96按顺序寻找可用chunkslot:检查slab回收空间slot里是否有剩余chunkdelete:delete时标记到slotexptime:get时检查的过期对象标记到slotend_page_ptr:检查page中是否有剩余chunkmemory:内存还有剩余则开辟新的slabLRU:Slab内部扫描Item双向链表50次,内存有浪费了!,slab尾部剩余空间如classid=40中,两个chunk占用了1009384byte,就有1048576-1009384=39192byte被浪费解决办法:规划slab=chunk*n整数倍 slab中chunk利用率低:申请的slab只存放了一个Item解决办法:规划slab=chunkchunk存储Item浪费如I tem是100,存到128字节chunk,就有28字节浪费解决办法:规划chunk=Item,使用合适的factor,减少浪费,-f参数:默认为1.25,曾经为2值越小,slab中chunk size差距越小,内存浪费越小1.25适合缓存几百字节的对象,slab class 1:chunk size 128 perslab 8192slab class 2:chunk size 256 perslab 4096slab class 3:chunk size 512 perslab 2048slab class 4:chunk size 1024 perslab 1024slab class 5:chunk size 2048 perslab 512slab class 6:chunk size 4096 perslab 256slab class 7:chunk size 8192 perslab 128slab class 8:chunk size 16384 perslab 64slab class 9:chunk size 32768 perslab 32slab class 10:chunk size 65536 perslab 16slab class 11:chunk size 131072 perslab 8slab class 12:chunk size 262144 perslab 4slab class 13:chunk size 524288 perslab 2,slab class 1:chunk size 88 perslab 11915slab class 2:chunk size 112 perslab 9362slab class 3:chunk size 144 perslab 7281slab class 4:chunk size 184 perslab 5698slab class 5:chunk size 232 perslab 4519slab class 6:chunk size 296 perslab 3542slab class 7:chunk size 376 perslab 2788slab class 8:chunk size 472 perslab 2221slab class 9:chunk size 592 perslab 1771slab class 10:chunk size 744 perslab 1409,factor=2,factor=1.25,建议:计算一下数据的预期平均长度,调整factor,以获得最恰当的设置,根据数据分布调整factor,非均匀分布,即数据长度集中在几个区域内如保存用户Session更极端的状态是等长数据如定长键值,定长数据多见于访问、在线统计或执行锁计算Item长度key键长suffix+value值长结构大小(32字节),调优的最高指示精神,提高内存利用率,减少内存浪费提高命中率(80%,95%?)调优方法:f参数:factor增长因子 n参数:chunk初始值,一切都是为了更快,低CPU消耗(瓶颈在于网络IO)libevent事件机制slab内存预分配机制适合使用大量低CPU的机器搭建集群32位机器最大2GB,64GB无限制-m分配内存为数据区,memcached本身也需要占用内存,因此不可将物理内存全部分配使用连接池维持连接,因为优秀,所以不足,Cant dump无法备份,重启无法恢复Cant iterate over keys无法查询Not persistent没有持久化,重启全部丢失Not redundant单点故障failoverNo Sessions崩溃没法查找原因No security任何机器都可以telnet,需要放在防火墙后内存问题LRU是slab局部,没有全局有空间浪费日志问题没有合理的日志集群问题集群增加机器成本高,Memcached使用方式-客户端实现Hash,Memcached架构层次-减少DB访问,提高Web速度,添加对象时,获取对象时,最常用的Hash算法,根据余数计算Hash如Perl函数库:Cache:Memcached优点:简单、分散性优秀缺点:添加/移除服务器时,缓存重组代价巨大,影响命中率26个字母由3个节点增加一个节点,命中率下降了23%,三个节点:node1 node2 nod3node1: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,四个节点:node1 node2 node3 node4node1: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,增加节点,Consistent Hash,参考原文:http:/alpha.mixi.co.jp/blog/?p=158http:/,添加服务器时,Consistent Hashing最大限度地抑制了键的重新分布有的Consistent Hashing的实现方法还采用了虚拟节点的思想,兼容memcached软件,memcachedb存储到BerkleyDBTokyo Tyrant存储到Tokyo Cabinet。与memcached协议兼容,能通过HTTP访问,持久化key-value系统,Memcachedb持久化BerkelyDB-Sina主服务器可读写、辅服务器只读同步日志文件非常大,需人工定期清理Tokyo TyrantTokyo Cabinet持久化-mixi.jp优点读写4-5w/s,写100万0.643秒,读100万0.773秒,是BerkeleyDB 的几倍双机互为主辅模式,主辅库均可读写具有故障转移、日志文件体积小、大数据量下表现出色等优势缺点TC在32位下数据库单个文件2GB,64位无限制没有scale的能力,只能主从复制TC性能会随数据量的增加而下降,上亿条下降较明显Nuclear-renren一致性Hash,动态增加/删除节点,持久化Redis,定期异步把数据库flush到硬盘,比Memcached多一个永久存储功能,优点读写10w/s,是性能最快的Key-Value DB最大魅力:支持List链表和Set集合,对List/Set各种操作单个value的最大限制是1GB,memcached只能保存1MB主要缺点容量受物理内存限制,不能用作海量数据的高性能读写不具有scaleRedis适合的场景较小数据量的高性能操作和运算上使用Redis的网站有github,Engine Yard,分布式数据库,CouchDB持久化Cassandra分布式/NoSQL/scale适合于实时数据处理MongoDB分布式/NoSQLBigTable/Hbase适合于数据仓库、大型数据的处理与分析,memcached测试,memd&memdb,memdb/TT/redis测试500w+100byte read/write,memdb/TT/redis测试50w+20k read/write,Java客户端,spymemcacheddangataobao client,