扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
建站服务器
1、memecached介绍
成都创新互联长期为成百上千家客户提供的网站建设服务,团队从业经验10年,关注不同地域、不同群体,并针对不同对象提供差异化的产品和服务;打造开放共赢平台,与合作伙伴共同营造健康的互联网生态环境。为未央企业提供专业的成都网站设计、成都做网站,未央网站改版等技术服务。拥有十年丰富建站经验和众多成功案例,为您定制开发。是一个开源的,高性能的内存缓存软件,通过在事先规划好的内存空间中临时缓存数据库中的各类数据,以达到减少业务对数据库的直接高并发访问,从而达到提升数据库的访问性能,加速动态服务的能力。
memcache是基于libevent的事件处理,利用这个库进行异步事件处理。
2、memecached在企业中的应用
1)作为数据库的前端缓存应用,完整缓存,热点缓存
2)作为集群的session会话共享存储
3、memecached服务在企业业务中的工作流程
1)当web程序访问后端数据库时会优先访问memcached内存缓存,如果缓存命中数据就直接获取数据返回给前端用户,如果没有命中数据,再由程序请求后端数据库服务器,获取对应数据后,返回给前端用户并将数据存放到memcached内存中进行缓存,等待下次请求访问。
2)当程序更新,修改或删除数据库中已有的数据时,会同时发送请求通知memcached已经缓存过的同一个ID内存失效,从而保证memcache中的数据和数据库中的数据一致。
3)数据库插件可以在写入更新数据库后,自动将更新数据推送给memcached缓存起来。
4、memcached服务分布式集群的实现
memcached集群中,每个memcache服务器互不通信,都是个体的,每个服务器只管理自己服务器的数据,所有memcached服务器的缓存的数据总和才是数据库中的整个数据。
1)程序端实现:程序加载所有memcached的ip列表,通过对key做hash(一致性哈希)
2)负载均衡器:(LVS keplaved)
一致性哈希:保证每个对象只请求一个对应的服务器,而且当节点宕机后保证数据更新的最小化。
5、memcached服务特点及工作原理
1)完全基于内存的
2)节点之间相互独立
3)基于异步I/O模型,使用libevent作为事件通知机制
4)缓存数据以key/value对形式存在的
5)c/s模式架构,c语言编写,总代码为2000多行
6)全部数据存储在内存中,无持久性存储设计,重启服务数据会丢失。
7)可以对存储数据设置过期时间,服务本身不会监控过期,而是访问的时候查看key的时间戳判断是否过期。
8)memcached内存分配机制是对特定的内存进行分块,再把多个分块进行分组
6、memcached内存管理机制
malloc的全称是memory allocaion,中文叫动态内存分配,当无法知道内存具体位置时,想要绑定内存空间,就需要用到动态的分配内存。
早期的memcached内存管理方式是通过malloc分配的内存,使用完后回收内存会产生碎片,会降低操作系统对内存的管理,加重操作系统内存管理器的负担,会导致操作系统比memcached进程本地还慢,为了解决上述问题,slab allocator内存分配机制就诞生了。
Slab Allocation机制原理是按照预先规定的大小,将分配给memcached的内存分割成特定长度的内存块,再把尺寸相同的内存块分成组,这些内存块不会释放,可以重复利用。
memcached服务器中保存着slab内空闲chunk的列表,根据该列表选择chunk,然后将数据存储在其中,当有数据存入时,memcached会根据数据的大小,选择最合适的数据大小的slab分配一个能存储下这个数据的最小内存块(chunk).例如:有100字节的数据就会分配存入112字节的一个内存块中,这样就会浪费掉12字节的内存空间,这是slab allocation机制的一个缺点。
1)slab allocation的主要术语:
page:分配给slab的内存空间,默认是1MB,分配给slab之后根据slab的大小切分成chunk
chunk:用于缓存数据的内存空间或内存块
slab class:特定大小的多个chunk的集合或组
2)memcached slab allocation内存管理机制优化:
在启动时指定-f参数,能控制内存组之间的大小差异,在应用中使用memcached时,通常不重新设置这个参数,默认值为1.25进行部署,如果想优化memcached对内存的使用,可以考虑重新计算数据的预期平均长度,调整这个参数来获取合适的设置值。
-f
例如:
使用2时,chunk的大小会以2的倍数增加:
memcached-m512m-d-uroot-c8192-f2-vv [root@zxqtmp]#slabclass1:chunksize96perslab10922 slabclass2:chunksize192perslab5461 slabclass3:chunksize384perslab2730 slabclass4:chunksize768perslab1365 slabclass5:chunksize1536perslab682 slabclass6:chunksize3072perslab341 slabclass7:chunksize6144perslab170 slabclass8:chunksize12288perslab85 slabclass9:chunksize24576perslab42 slabclass10:chunksize49152perslab21 slabclass11:chunksize98304perslab10 slabclass12:chunksize196608perslab5 slabclass13:chunksize393216perslab2 slabclass14:chunksize1048576perslab1 <26serverlistening(auto-negotiate) <27serverlistening(auto-negotiate) <28sendbufferwas124928,now268435456 <29sendbufferwas124928,now268435456 <28serverlistening(udp) <29serverlistening(udp) <28serverlistening(udp) <29serverlistening(udp) <28serverlistening(udp) <29serverlistening(udp) <28serverlistening(udp) <29serverlistening(udp)
使用1.25时,chunk间隔会很小,存储小文件时内存浪费会减少很多:
[root@zxqtmp]#memcached-m512m-d-uroot-c8192-f1.25-vv [root@zxqtmp]#slabclass1:chunksize96perslab10922 slabclass2:chunksize120perslab8738 slabclass3:chunksize152perslab6898 slabclass4:chunksize192perslab5461 slabclass5:chunksize240perslab4369 slabclass6:chunksize304perslab3449 slabclass7:chunksize384perslab2730 slabclass8:chunksize480perslab2184 slabclass9:chunksize600perslab1747 slabclass10:chunksize752perslab1394 slabclass11:chunksize944perslab1110 slabclass12:chunksize1184perslab885 slabclass13:chunksize1480perslab708 slabclass14:chunksize1856perslab564 slabclass15:chunksize2320perslab451 slabclass16:chunksize2904perslab361 slabclass17:chunksize3632perslab288 slabclass18:chunksize4544perslab230 slabclass19:chunksize5680perslab184 slabclass20:chunksize7104perslab147 slabclass21:chunksize8880perslab118 slabclass22:chunksize11104perslab94 slabclass23:chunksize13880perslab75 slabclass24:chunksize17352perslab60 slabclass25:chunksize21696perslab48 slabclass26:chunksize27120perslab38 slabclass27:chunksize33904perslab30 slabclass28:chunksize42384perslab24 slabclass29:chunksize52984perslab19 slabclass30:chunksize66232perslab15 slabclass31:chunksize82792perslab12 slabclass32:chunksize103496perslab10 slabclass33:chunksize129376perslab8 slabclass34:chunksize161720perslab6 slabclass35:chunksize202152perslab5 slabclass36:chunksize252696perslab4 slabclass37:chunksize315872perslab3 slabclass38:chunksize394840perslab2 slabclass39:chunksize493552perslab2 slabclass40:chunksize616944perslab1 slabclass41:chunksize771184perslab1 slabclass42:chunksize1048576perslab1 failedtolistenonTCPport11211:Addressalreadyinuse
7、memcached对象删除原来与cache机制
memecached主要的cache机制是LRU最近最少用的算法,加上item过期失效,当存储数据到memcached中,可指定该数据在缓存中可以呆多久,如果memcached的内存不够用了,过期的slabs会优先被替换,接着就会轮到最老的未被使用的slabs。在某些情况下(完整缓存),如果不想使用LRU算法,可以通过-M参数来启动memcached,这样,memcahced在内存耗尽时,会返回一个报错信息。
-M return error on memeory exhausted(rather than removing items)
8、memcached服务端的安装
1)服务端的安装
memcached下载地址:http://www.danga.com/memcached/
memcached其他下载地址:http://memcached.googlecode.com/files/memcached-1.4.13.tar.gz
libevent下载地址:http://monkey.org/~provos/libevent/
网友安装参考:http://instance.iteye.com/blog/1691705
由于memcache是基于libevent事件库文件的,所以要先安装libevetn:
wgethttps://github.com/downloads/libevent/libevent/libevent-1.4.13-stable.tar.gz tarzxflibevent-1.4.13-stable.tar.gz cdlibevent-1.4.13-stable ./configure make makeinstall cd..
安装memcached:
wgethttp://memcached.org/files/old/memcached-1.4.13.tar.gz tarzxfmemcached-1.4.13.tar.gz cdmemcached-1.4.13 ./configure make makeinstall cd..
启动报错处理:
[root@zxqtools]#memcached-m1m-p11212-d-c8192 memcached:errorwhileloadingsharedlibraries:libevent-1.4.so.2:cannotopensharedobjectfile:Nosuchfileordirectory 解决方法:就是让系统能加载到libevent库文件。 echo/usr/local/lib>>/etc/ld.so.conf ldconfig
2)启动memcached服务:
[root@zxqmemcached-1.4.13]#whichmemcached /usr/local/bin/memcached memcached-m16m-p11212-d-uroot-c8192 lsof-i:11212 COMMANDPIDUSERFDTYPEDEVICESIZE/OFFNODENAME memcached46673root26uIPv42444550t0TCP*:11212(LISTEN) memcached46673root27uIPv62444560t0TCP*:11212(LISTEN) memcached46673root28uIPv42444590t0UDP*:11212 memcached46673root29uIPv62444600t0UDP*:11212 netstat-lntup|grepmemcached tcp000.0.0.0:112120.0.0.0:*LISTEN46673/memcached tcp00:::11212:::*LISTEN46673/memcached udp000.0.0.0:112120.0.0.0:*46673/memcached udp00:::11212:::*46673/memcached ps-ef|grepmemcached root466731017:15?00:00:00memcached-m16m-p11212-d-uroot-c8192
3)memcached相关启动参数说明:
-p 指定memcached服务监听TCP端口号,默认为11211
-m 指定memcached服务可以缓存数据的内存,默认为64MB
-u 运行memcached的用户
-d 作为守护进程在后台运行
-c 的并发连接数,默认是1024,安装服务器的并发访问量来设置
-vv 以very vrebose模式启动,调试信息和错误输出到控制台
-P 设置保存memcached的PID文件
-l 指定监听的服务器ip地址
-f 调优因子
-M 不使用LRU算法删除缓存,当内存不够用时会报错
其他选择,通过memcached -h查看
memcached-m15m-d-uroot-p11213-M-c8192-P/var/run/memcached.pid-f1.25-l127.0.0.1
4)存储和查看数据
语法:
set k01 0 0 10\\r\\n9999999999\\r\
set 存储此数据,如果建存在,则之前的值将被替换
add 存储此数据,只在服务器未保留此键值对数据时
replace 存储此数据,只在服务器曾保留此键值的数据时
\\r\\n 是大段的8位数据,其长度由前面的命令行中的
使用printf打印数据,使用nc连接到memcached
set设置key为k01,value为999999999,主要指定字符串大小要与后面的数据对应上。
[root@zxqlib]#printfsetk010010\\r\\n9999999999\\r\\n|nc127.0.0.111212 STORED
get查看key k01的value:
[root@zxqlib]#printfgetk01\\r\\n|nc127.0.0.111212 VALUEk01010 9999999999 END
delete删除key k01的键值对数据:
[root@zxqlib]#printfdeletek01\\r\\n|nc127.0.0.111212 DELETED
add添加键值,缓存中不存在值时,如果存在值会响应NOT_STORED
[root@zxqbin]#printfsetkey01002\\r\\nab\\r\\n|nc127.0.0.111213 STORED [root@zxqbin]#printfaddkey01002\\r\\nab\\r\\n|nc127.0.0.111213 NOT_STORED
replace当键值存在时,replace命令才会替换缓存中的键,如果缓存中不存在键,会报NOT_STORED错误响应:
[root@zxqbin]#printfreplacekey01002\\r\\n88\\r\\n|nc127.0.0.111213 STORED [root@zxqbin]#printfreplacekey02002\\r\\n99\\r\\n|nc127.0.0.111213 NOT_STORED
gets与get类似,只是会返回一个键值对的标识值
[root@zxqbin]#printfsetkey03005\\r\\n55555\\r\\n|nc127.0.0.111213 STORED [root@zxqbin]#printfgetskey03\\r\\n|nc127.0.0.111213 VALUEkey03055 55555 END [root@zxqbin]#printfgetkey03\\r\\n|nc127.0.0.111213 VALUEkey0305 55555 END
cas用于设置键值对,与set相似的语法,但会使用gets执行后的额外标识值,来更改上次读取的键值对,如果标识值不对将报错:
[root@zxqbin]#printfgetskey03\\r\\n|nc127.0.0.111213 VALUEkey03057 88888 END [root@zxqbin]#printfcaskey030058\\r\\n99999\\r\\n|nc127.0.0.111213 EXISTS [root@zxqbin]#printfcaskey030057\\r\\n99999\\r\\n|nc127.0.0.111213 STORED [root@zxqbin]#printfgetskey03\\r\\n|nc127.0.0.111213 VALUEkey03058 99999 END
5)stats查看memcached当前实例信息:
[root@zxqtmp]#printfstats\\r\\n|nc127.0.0.111212 STATpid46673进程ID STATuptime25336服务器运行秒数 STATtime1494173893服务器当前unix时间戳 STATversion1.4.13memcached版本 STATlibevent1.4.13-stablelibevent版本 STATpointer_size64操作系统位数,64位 STATrusage_user0.642902进程累计用户时间 STATrusage_system0.303953进程累计系统时间 STATcurr_connections10当前打开连接数 STATtotal_connections25memecached运行以来连接总数 STATconnection_structures11memcached分配的连接结构数 STATreserved_fds20内部使用的FD数 STATcmd_get7执行get命令总数 STATcmd_set3执行set命令总数 STATcmd_flush0执行flush_all命令总数 STATcmd_touch0touch命令请求总数 STATget_hits3get命中次数 STATget_misses4get未命中次数 STATdelete_misses0delete未命中次数 STATdelete_hits1delete命中次数 STATincr_misses0incr未命中次数 STATincr_hits0incr命中次数 STATdecr_misses0decr未命中次数 STATdecr_hits0decr命中次数 STATcas_misses0cas未命中次数 STATcas_hits0cas命中次数 STATcas_badval0使用擦拭次数 STATtouch_hits0touch命中次数 STATtouch_misses0touch未命中次数 STATauth_cmds0认证命令处理次数 STATauth_errors0认证失败数目 STATbytes_read358读取字节总数 STATbytes_written160写入字节总数 STATlimit_maxbytes16777216分配的内存总数(字节) STATaccepting_conns1目前接受的连接数 STATlisten_disabled_num0失效的监听数 STATthreads4线程数 STATconn_yields0连接操作主动放弃数目 STAThash_power_level16hash表等级 STAThash_bytes524288当前hash表大小 STAThash_is_expanding0hash表正在扩展 STATexpired_unfetched0已过期但未获取大对象数目 STATevicted_unfetched0已驱逐但未获取大对象数目 STATbytes166当前存储占用字节数 STATcurr_items2当前存储的数据总个数 STATtotal_items3启动以来存储的数据总数 STATevictions0LRU释放的对象数目 STATreclaimed0已过期的数据条目来存储新数据的数目 END
stats items 查看items行内容:
[root@zxqbin]#printfstatsitems\\r\\n|nc127.0.0.111213 STATitems:1:number4该slab中对象数(不包含过期对象) STATitems:1:age1941LRU队列中最老对象的过期时间 STATitems:1:evicted0LRU释放对象数 STATitems:1:evicted_nonzero0设置了非0时间的LRU释放对象数 STATitems:1:evicted_time0最后一次LRU释放的对象存在时间 STATitems:1:outofmemory0不能存储对象次数 STATitems:1:tailrepairs0修复slabs次数 STATitems:1:reclaimed0使用过期对象空间存储对象次数 STATitems:1:expired_unfetched0已过期但未获取的对象数目 STATitems:1:evicted_unfetched0已驱逐但未获取的对象数目 END
stats cachedump slabs_id limit_num,slabs_id是由stats items返回的值,也就是项目组号,limit_num返回的记录数,0为返回所有记录,可以两者结合遍历memcache所有记录数据:
[root@zxqbin]#printfstatsitems\\r\\n|nc127.0.0.111213 STATitems:1:number5 STATitems:1:age2589 STATitems:1:evicted0 STATitems:1:evicted_nonzero0 STATitems:1:evicted_time0 STATitems:1:outofmemory0 STATitems:1:tailrepairs0 STATitems:1:reclaimed0 STATitems:1:expired_unfetched0 STATitems:1:evicted_unfetched0 STATitems:2:number1 STATitems:2:age3 STATitems:2:evicted0 STATitems:2:evicted_nonzero0 STATitems:2:evicted_time0 STATitems:2:outofmemory0 STATitems:2:tailrepairs0 STATitems:2:reclaimed0 STATitems:2:expired_unfetched0 STATitems:2:evicted_unfetched0 END [root@zxqbin]#printfstatscachedump10\\r\\n|nc127.0.0.111213 ITEMkey04[15b;1494188606s] ITEMkey03[5b;1494188606s] ITEMkey01[2b;1494188606s] ITEMuserID[5b;1494188606s] ITEMuserid[5b;1494188606s] END [root@zxqbin]#printfstatscachedump20\\r\\n|nc127.0.0.111213 ITEMkey05[35b;1494188606s] END
stats slabs显示各个slab的信息,包括chunk的大小,数目和使用情况等:
printfstatsslabs\\r\\n|nc127.0.0.111213 STAT1:chunk_size96chunk大小(byte) STAT1:chunks_per_page10922每个page的chunk数量 STAT1:total_pages1page数量 STAT1:total_chunks10922chunk总数量(chunks_per_page*total_pages) STAT1:used_chunks6已被分配的chunk数量 STAT1:free_chunks1过期数据空出的chunk数 STAT1:free_chunks_end10915从未被使用过的chunk数 STAT1:mem_requested481请求存储的字节数 STAT1:get_hits6get命令命中数 STAT1:cmd_set17 STAT1:delete_hits0 STAT1:incr_hits0 STAT1:decr_hits0 STAT1:cas_hits3 STAT1:cas_badval1cas数据类型错误数 STAT1:touch_hits0touch命令命中数 STAT2:chunk_size120 STAT2:chunks_per_page8738 STAT2:total_pages1 STAT2:total_chunks8738 STAT2:used_chunks2 STAT2:free_chunks0 STAT2:free_chunks_end8736 STAT2:mem_requested207 STAT2:get_hits0 STAT2:cmd_set3 STAT2:delete_hits0 STAT2:incr_hits0 STAT2:decr_hits0 STAT2:cas_hits0 STAT2:cas_badval0 STAT2:touch_hits0 STATactive_slabs2 STATtotal_malloced2097072 END
stats settings 可以查看一些memcached设置例如线程数
[root@zxqbin]#printfstatssettings\\r\\n|nc127.0.0.111213 STATmaxbytes15728640 STATmaxconns8192 STATtcpport11213 STATudpport11213 STATinter127.0.0.1 STATverbosity0 STAToldest3537 STATevictionsoff STATdomain_socketNULL STATumask700 STATgrowth_factor1.25 STATchunk_size48 STATnum_threads4 STATnum_threads_per_udp4 STATstat_key_prefix: STATdetail_enabledno STATreqs_per_event20 STATcas_enabledyes STATtcp_backlog1024 STATbinding_protocolauto-negotiate STATauth_enabled_saslno STATitem_size_max1048576 STATmaxconns_fastno STAThashpower_init0 STATslab_reassignno STATslab_automoveno END
stats sizes 查看存在的item大小和个数
[root@zxqbin]#printfstatssizes\\r\\n|nc127.0.0.111213 STAT966 STAT1282 END
stats reset 清理统计数据
printfstatsreset\\r\\n|nc127.0.0.111213
flush_all用于清理存储中的所有键值对:
[root@zxqbin]#printfflush_all\\r\\n|nc127.0.0.111213 OK
append 将数据追加到当前缓存数据的之后,当缓存数据存在时才存储
[root@zxqbin]#printfgetkey07\\r\\n|nc127.0.0.111213 VALUEkey07025 aaaaabbbbbcccccdddddeeeee END [root@zxqbin]#printfappendkey07005\\r\\n_@@@#\\r\\n|nc127.0.0.111213 STORED [root@zxqbin]#printfgetkey07\\r\\n|nc127.0.0.111213 VALUEkey07030 aaaaabbbbbcccccdddddeeeee_@@@# END
prepend 将数据追加到当前缓存数据的之前,当缓存数据存在时才存储
[root@zxqbin]#printfgetkey07\\r\\n|nc127.0.0.111213 VALUEkey07030 aaaaabbbbbcccccdddddeeeee_@@@# END [root@zxqbin]#printfprependkey07005\\r\\n#####\\r\\n|nc127.0.0.111213 STORED [root@zxqbin]#printfgetkey07\\r\\n|nc127.0.0.111213 VALUEkey07035 #####aaaaabbbbbcccccdddddeeeee_@@@# END
也可以使用Telnet连接memcached进入交互式操作
9、客户端的安装
安装lamp/LNMP环境,要求apache或nginx能解析PHP文件,才能继续安装客户端
安装memcache的php的客户端及memcache的扩展,下载php扩展:http://pecl.php.net/package/memcache选择要下载的memcache版本。java程序一样需要客户端(resion,tomcat),但不会像php一样编译。
在PHP服务器上安装memcache客户端:
wgethttp://pecl.php.net/get/memcache-2.2.5.tgz tarzxfmemcache-2.2.5.tgz cdmemcache-2.2.5 /usr/local/php/bin/phpize ./configure--enable-memcache--with-php-config=/usr/local/php/bin/php-config--with-zlib-dir make makeinstall Installingsharedextensions:/usr/local/php/lib/php/extensions/no-debug-non-zts-20131226/ [root@zxqmemcache-2.2.5]#ll/usr/local/php/lib/php/extensions/no-debug-non-zts-20131226/
安装完会在此文件中生成memcache.so文件
-rwxr-xr-x1rootroot2604515月717:59memcache.so -rwxr-xr-x1rootroot5893085月420:59opcache.so
修改php.ini配置文件:指定memcache.so文件路径
echoextension=memcache.so>>/usr/local/php/etc/php.ini grep^extension/usr/local/php/etc/php.ini
重启动apache服务使php的配置生效
[root@zxq~]#apachectl-t SyntaxOK [root@zxq~]#apachectlgraceful
如果是nginx则重启动php-fpm服务
打开phpinfo加载网页,能看到memcache模块就算成功了!
建立测试文件,实现PHP与memcache交换数据:
connect(\'10.0.0.4\',11212)ordie(couldnotconnect); $memcache->set(\'key001\',\'123\'); $memcache->set(\'key002\',\'abc\'); $get_value001=$memcache->get(\'key001\'); $get_value002=$memcache->get(\'key002\'); echo$get_value002.
; echo$get_value001; ?>
访问目录能读到123,abc,php程序与memcache交互成功!
10、memcache实现web集群的session会话保持
修改所有web节点的php.ini配置文件指定session文件路径到memcache服务器上
vim/usr/local/php/etc/php.ini session.save_handler=memcache#指定session存储方式 session.save_path=tcp://10.0.0.4:11212#指定session保存路径 memcached-m15m-d-uroot-p11212-M-c8192-P/var/run/memcached.pid-f1.25-l10.0.0.4
集群架构多服务器同步session的多种方式:
1)lb层可以做会话保持,例如
lvs -p
nginx ip_hash
hapoxy cookie insert
PHP,java都可以用
2)软件层,可以做session复制,例如
tomcat,resion,couchbase
3)session共享,例如
memcache或其他工具的NoSQL工具,PHP常用这个
4)高并发场景:例如门户网站用cookies或cookies配合session把用户级会话信息缓存在用户本地。
11、监控memcache需要监控的具体指标
1)端口11212
2)命中率:STAT get_hits 3 STAT get_misses 4
3)反应时间:STAT uptime 25336
监控脚本:
#!/bin/sh [$#-ne2]&&{ echo$0ipport exit } exportkey1=key exportwwwServerIp=$1 exportwwwServerPort=$2 cmd=nc$wwwServerIp$wwwServerPort printfdelete$key1\\r\\n|$cmd>/dev/null2>&1 sleep1 printfset$key1006\\r\\n123\\r\\n|$cmd>/dev/null2>&1 if[`printfget$key1\\r\\n|$cmd|grep123|wc-l`-eq1] then echomcisalive. exit0 else echomcisdead. exit2 fi
12、memcached调优
计算item占用空间:
item总大小=键长+值长+后缀长+item结构大小(48字节)+8(cas标志占用)
如果item_cas标志设置时,会有8字节的数据
item结构大小:32位系统32字节;64位系统48字节
例如:
memcached-uroot-p11212-vv slabclass1:chunksize96perslab10922 slabclass2:chunksize120perslab8738 slabclass3:chunksize152perslab6898 slabclass4:chunksize192perslab5461 slabclass5:chunksize240perslab4369 slabclass6:chunksize304perslab3449 slabclass7:chunksize384perslab2730 slabclass8:chunksize480perslab2184 slabclass9:chunksize600perslab1747 slabclass10:chunksize752perslab1394 slabclass11:chunksize944perslab1110 slabclass12:chunksize1184perslab885 printfsetleng0040\\r\\n1111111111222222222211111111112222222222\\r\\n|nc127.0.0.111212 STORED
计算leng总长度:48+8+4+40=100
所以leng值就会选择slab 2的120字节里来存储leng数据:
[root@zxqhtdocs]#printfstatscachedump20\\r\\n|nc127.0.0.111212 ITEMleng[40b;1494182061s] END
优化方案:先估算将要存储的数据大小值,再通过-f选项调优chunk大小,以最小满足存储值大小存储数据,已达到最小内存浪费。
可使用-M启动memcache,不使用LRU算法删除数据,因为LRU不是全局的,而是针对slab区域的。可以使用脚本检测stats tiems的值,保证内存空闲,清除过久未访问的数据。
13、zabbix监控实例:
缓存命中率 = get_hits/cmd_get * 100% ;get_misses的数字加上get_hits应该等于cmd_get
1)配置自动发现脚本
catmemdiscover.sh #!/bin/sh #function:discoverymemcacheitems memcache_discovery(){ Memitems=(`/usr/bin/printfstats\\r\\n|nc127.0.0.111212|awk\'{print$2}\'`) length=${#Memitems[@]} printf{\\n printf\'\\t\'\\data\\:[ for((i=0;i<$length;i++)) do printf\'\\n\\t\\t{\' printf\\{#ITEMNAME}\\:\\${Memitems[$i]}\\} if[$i-lt$[$length-1]];then printf\',\' fi done printf\\n\\t]\\n printf}\\n }
2)配置监控脚本
catmemcached-status.conf #!/bin/sh #thisismemcachedststusscripts #date2017-05-08 functionstatus(){ ip=127.0.0.1 port=11212 /usr/bin/printfstats\\r\\n|nc$ip$port } status|grep-w$1|awk\'{print$3}\'
3)配置web页面
configureation => Templates => Create template
Template name:memcache_discovery
Groups In groups:nosql
configureation => Templates => memcache_discovery => Discovery => create discovery rule
name:memcache.stats
type:zabbix agent
key:memcache.stats
update interval:30
Fitters:{$ITEMANME}
configureation => Templates => memcache_discovery => item prototypes => create item prototype
name:mem.stat on $1
type:zabbix agent
key:mem.stats[{#ITEMNAME}]
configureation => Templates => memcache_discovery => Graph prototypes => create graph prototype
name:memcache on {#ITEMNAME}
items:Add prototype ==》 memcache_discovery:mem.stats on {#ITEMNAME}
$zabbix_get -s 127.0.0.1 -k mem.stats[get_hits]
61992
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流