Memcached内存分析、调优、集群.ppt

上传人:本田雅阁 文档编号:2146137 上传时间:2019-02-21 格式:PPT 页数:70 大小:2.19MB
返回 下载 相关 举报
Memcached内存分析、调优、集群.ppt_第1页
第1页 / 共70页
Memcached内存分析、调优、集群.ppt_第2页
第2页 / 共70页
Memcached内存分析、调优、集群.ppt_第3页
第3页 / 共70页
亲,该文档总共70页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《Memcached内存分析、调优、集群.ppt》由会员分享,可在线阅读,更多相关《Memcached内存分析、调优、集群.ppt(70页珍藏版)》请在三一文库上搜索。

1、Memcached 内存分析、调优、集群,刘中兵 搜狐TPC v1 2010/12/12 ,2,导航,1.Memcached背景 2.Memcached使用:安装、启动、命令、统计 3.深入Memcached内部:slab、page、item 4.Memcached分布式:一致性Hash 5.key-value系统比较:集群、性能对比 6.Memcached客户端,1.Memcached背景,4,Memcached是什么,memcached由LiveJournal运营人员开发 memcached是高性能的分布式内存缓存服务器,开源 协议简单 基于libevent时间处理:epoll/kqueu

2、e 内置内存存储方式:slab/LRU 目前用户 LiveJournal Facebook mixi Digg Wikipedia Vox,5,facebook,200 memcached servers 16GB 四核 AMD64 3TB cache data,6,Memcached支持语言,C/C+ libmemcached libmemcache apr_memcache memcaheclient libketama PHP PECL/memcached PECL/memcache PHP libmemcached Java spymemcached Java memcached cl

3、ient/danga memcache-client-forjava/taobao Python Ruby Perl .NET MySQL PostgreSQL Erlang Lua Lisp,参考:http:/ 安装 启动 命令 统计,8,安装,基于libevent事件处理机制 http:/www.monkey.org/provos/libevent/ ./configure -prefix=/usr/local make sudo make install memcached: http:/memcached.org/ ./configure -with-libevent=/usr/loc

4、al make make install,9,安装成功 memcached -h,10,主要启动参数,启动方式: -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 1

5、27.0.0.1 监听的 IP 地址,本机可以不设置此参数 -p 11211 TCP端口,默认为11211,可以不设置 -U 11211 UDP端口,默认为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.11.12.70 -P /opt

6、/memcached/pid/m11210.pid,11,daemontools启动工具,memcached有可能会死掉(mixi.jp经验) 监视memcached进程并自动启动 启动脚本样例:run.sh,参考:http:/cr.yp.to/daemontools.html,#!/bin/sh if f /etc/sysconfig/memcached ;then . /etc/sysconfig/memcached fi exec 2&1 exec memcached p $PORT u $USER m $CACHESIZE c $MAXCONN $OPTIONS,12,memcache

7、d调试,-v +输出error/warning -vv +输出命令/响应 -vvv +输出内部状态,10_10_82_80 # memcached -d -u root -m 1024 -p 11210 -vvv 10_10_82_80 # memcached -d -u root -m 1024 -p 11211 vvv slab class 1: chunk size 96 perslab 10922 slab class 2: chunk size 120 perslab 8738 slab class 42: chunk size 1048576 perslab 1 38 END 38

8、 quit 38 connection closed.,telnet localhost 11210/11211 stats get abc quit,13,memcached命令列表,存储命令set/add/replace/append/prepend/cas 读取命令get=bget?/gets 删除命令delete 计数命令incr/decr 统计命令stats/settings/items/sizes/slabs 工具memcached-tool,14,存储命令,格式: rn rn rn,15,存储命令set/add/replace,set liu 32 0 4 java STORED

9、/正确 get liu VALUE abc 32 4 java END set liu 32 0 4 cplus CLIENT_ERROR bad data chunk ERROR/长度错误,set liu 32 0 4 java STORED add liu 32 0 5 cplus NOT_STORED /已存在不能add get liu VALUE abc 32 4 java END add song 32 0 5 cplus STORED /不存在可以add,set liu 32 0 4 java STORED replace liu 32 0 5 cplus STORED /已存在可

10、以replace get liu VALUE cplus 32 5 liu END replace yang 32 0 5 cplus NOT_STORED /不存在不能replace,datablock长度必须正确,add只能添加不存在的key,replace只能替换已有的key,16,读取命令get/gets,get liu song yang VALUE liu 32 4 java VALUE song 32 5 cplus END /查询多个键值,gets liu VALUE liu 32 4 12 java END /取得版本号 replace liu 32 0 4 java STO

11、RED /增加版本号 get liu VALUE liu 32 4 java END gets liu VALUE liu 32 4 13 java END,格式: *rn VALUE rn rn VALUE rn rn ENDrn command: get普通查询,gets用于查询带版本的值,版本号+1,17,检查存储命令cas,cas即check and set,只有版本号相匹配时才能存储,否则返回EXISTS 设计意图:解决多客户端并发修改同一条记录的问题,防止使用经过改变了的value/key对,cas liu 32 0 5 12 cplus EXISTS gets liu VALUE

12、 liu 32 4 13 java END/版本号不同不修改 cas liu 32 0 5 13 cplus STORED gets liu VALUE liu 32 5 14 cplus END/版本号相同才修改,当前版本号为13,按12不能修改,当前版本号为13,按13可以修改,18,计数命令incr/decr,格式: incr/decr 要求:key必须存在,value必须是数字,set count 32 0 1 1 STORED incr count 8 9 decr count 2 7,delete count DELETED incr count 1 NOT_FOUND,incr

13、liu 2 CLIENT_ERROR cannot increment or decrement non-numeric value,实现计数器,key不存在不能计数,value不是数字不能计数,19,删除命令delete,格式: delete DELETErn time: 秒数或Unixtime,在time时间内不能add或replace,但能set,不能get。过期后才能够重新set有效并能get,delete liu DELETED get liu END,20,统计命令stats,stats STAT pid 23178 STAT uptime 1039318 STAT time 12

14、92036037 STAT version 1.4.2 STAT pointer_size 64 STAT rusage_user 1011.574217 STAT rusage_system 1677.713948 STAT curr_connections 114 STAT total_connections 73801 STAT connection_structures 149 STAT cmd_get 79114939 STAT cmd_set 27302514 STAT cmd_flush 0 STAT get_hits 79114939 STAT get_misses 24322

15、507 STAT delete_misses 133928 STAT delete_hits 402569 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 auth_cmds 0 STAT auth_errors 0 STAT bytes_read 59348603658 STAT bytes_written 425549797158 STAT limit_maxbytes 429496

16、7296 STAT accepting_conns 1 STAT listen_disabled_num 0 STAT threads 4 STAT conn_yields 0 STAT bytes 3832761746 STAT curr_items 2854731 STAT total_items 27302514 STAT evictions 18456987 STAT reclaimed 0 END,格式: stats rn STAT rn ENDrn,21,stats统计项,分析CPU占用是否高,分析连接数是否太多,分析命中率是否太低,分析字节数流量,分析对象数LRU频率,22,st

17、ats settings查看设置,stats settings STAT maxbytes 0 STAT maxconns 1024 STAT tcpport 11213 STAT udpport 11211 STAT inter NULL STAT verbosity 0 STAT oldest 0 STAT evictions on STAT domain_socket NULL STAT umask 700 STAT growth_factor 1.25 STAT chunk_size 48 STAT num_threads 4 STAT stat_key_prefix : STAT d

18、etail_enabled no STAT reqs_per_event 20 STAT cas_enabled yes STAT tcp_backlog 1024 STAT binding_protocol auto-negotiate STAT item_size_max 1048576 END,23,stats items数据项统计,stats items STAT items:1:number 10922 STAT items:1:age 350988 STAT items:1:evicted 3829 STAT items:1:evicted_nonzero 0 STAT items

19、:1:evicted_time 690209 STAT items:1:outofmemory 0 STAT items:1:tailrepairs 0 STAT items:2:number 375734 STAT items:2:age 898762 STAT items:2:evicted 2661399 STAT items:2:evicted_nonzero 0 STAT items:2:evicted_time 142500 STAT items:2:outofmemory 0 STAT items:2:tailrepairs 0 . STAT items:40:number 14

20、 STAT items:40:age 977359 STAT items:40:evicted 25 STAT items:40:evicted_nonzero 0 STAT items:40:evicted_time 60653 STAT items:40:outofmemory 0 STAT items:40:tailrepairs 0 END,24,stats sizes对象数量统计,stats sizes STAT 96 10922 STAT 128 375734 STAT 160 200416 STAT 192 816311 STAT 224 8685 STAT 256 3321 S

21、TAT 288 3549 STAT 320 826 STAT 352 427 END,格式:STAT 注意:会锁定服务,暂停处理请求,25,stats slabs区块统计,stats slabs STAT 1:chunk_size 96 STAT 1:chunks_per_page 10922 . STAT 40:chunk_size 1048576 STAT 40:chunks_per_page 1 STAT 40:total_pages 15 STAT 40:total_chunks 15 STAT 40:used_chunks 14 STAT 40:free_chunks 1 STAT

22、40:free_chunks_end 0 STAT 40:mem_requested 9348752 STAT 40:get_hits 9593 STAT 40:cmd_set 4828 STAT 40:delete_hits 40 STAT 40:incr_hits 0 STAT 40:decr_hits 0 STAT 40:cas_hits 0 STAT 40:cas_badval 0 STAT active_slabs 40 STAT total_malloced 4294496616 END,区块数量,命 中 率,分析占用情况,被浪费内存数=(total_chunks * chunk_

23、size) - mem_requested 如果太大,需要调整factor,26,其他命令,version flush_all quit echo/nc快捷方式,10_10_82_80 # telnet localhost 11211 Trying 127.0.0.1. Connected to localhost.localdomain (127.0.0.1). Escape character is . version VERSION 1.4.5 flush_all OK quit Connection closed by foreign host. You have new mail i

24、n /var/spool/mail/root 10_10_82_80 # echo flush_all | nc localhost 11211 OK 10_10_82_80 # echo get liu | nc localhost 11210 VALUE liu 32 4 java END,27,memcached-tool方便调优,Perl脚本:http:/ 10.10.82.80:/opt/test运行: memcached-tool 192.168.12.195:11210 memcached-tool 192.168.12.195:11210 display memcached-t

25、ool 192.168.12.195:11210 stats memcached-tool 192.168.12.195:11210 stats items memcached-tool 192.168.12.195:11210 stats slabs memcached-tool 192.168.12.195:11210 dump memcached-tool 192.168.12.195:11210 move/数据迁移,28,memcached-tool,memcached-tool 192.168.12.195:11213 # Item_Size Max_age 1MB_pages Co

26、unt Full? 1 96 B 384295 s 1 10922 yes 2 120 B 964793 s 43 375734 yes 3 152 B 196 s 1 1021 no 4 192 B 962720 s 186 1015746 yes 5 240 B 954705 s 2 8734 yes 6 304 B 945823 s 2 6898 yes 7 384 B 954218 s 9 24569 yes 8 480 B 980911 s 91 198744 yes 9 600 B 963930 s 104 181688 yes 10 752 B 964602 s 274 3819

27、56 yes 11 944 B 963902 s 173 192030 yes 12 1.2 kB 962169 s 79 69914 yes 13 1.4 kB 959572 s 67 47436 yes 14 1.8 kB 957541 s 69 38916 yes 15 2.3 kB 956767 s 75 33825 yes 16 2.8 kB 957198 s 105 37904 yes 17 3.5 kB 957049 s 128 36864 yes 18 4.4 kB 955935 s 129 29669 yes 19 5.5 kB 956721 s 111 20423 yes,

28、20 6.9 kB 954862 s 119 17492 yes 21 8.7 kB 953024 s 157 18526 yes 22 10.8 kB 953361 s 226 21243 yes 23 13.6 kB 953301 s 315 23625 yes 24 16.9 kB 958310 s 356 21360 yes 25 21.2 kB 961544 s 330 15839 yes 26 26.5 kB 961128 s 259 9840 yes 27 33.1 kB 962389 s 181 5430 yes 28 41.4 kB 966056 s 141 3384 yes

29、 29 51.7 kB 966694 s 111 2109 yes 30 64.7 kB 965340 s 87 1305 yes 31 80.9 kB 962627 s 65 779 yes 32 101.1 kB 965821 s 38 379 yes 33 126.3 kB 949182 s 25 200 yes 34 157.9 kB 965799 s 18 107 yes 35 197.4 kB 876687 s 11 54 yes 36 246.8 kB 938290 s 9 36 yes 37 308.5 kB 837011 s 8 22 yes 38 385.6 kB 8861

30、80 s 14 27 yes 39 482.0 kB 908224 s 6 10 yes 40 1024.0 kB 990279 s 15 14 yes,29,UDP协议,何时使用UDP? TCP连接客户端过多时选用 允许少量的操作失败 如get有少量丢失,可以当做没被cache处理 frame header: 8byte + tcppacket 0-1 Request ID 2-3 Sequence number 4-5 Total number of datagrams in this message 6-7 Reserved for future use; must be 0,30,总结

31、:memcached使用,安装 libevent memcached 启动参数 自启动daemontools 命令 存储命令set/add/replace/append/prepend/cas 读取命令get=bget?/gets 删除命令delete 计数命令incr/decr 统计命令stats/settings/items/sizes/slabs 工具memcached-tool,31,3.深入Memcached内部,32,memcached机制,守护进程机制 UNIX daemon Socket事件处理机制 non-blocked:非阻塞 libevent:异步事件处理 epoll/k

32、queue 内存管理机制 slab:内存分配机制 LRU:对象清除机制 Hash机制:快速检索item 多线程处理机制:pthread(POSIX)线程模式 编译时开启:./configure enable-threads 目前还比较粗糙,锁机制locking不够完善 负载过重时,可以开启(-t线程数为CPU核数),33,memcached内存管理机制,SLAB内存处理机制 提前分配大内存slab 1MB,再进行小对象填充chunk 避免大量重复的初始化和清理减轻内存管理器负担 避免频繁malloc/free系统碎片 懒惰检测机制 不检测item对象是否超时 get时检查item对象是否应该删

33、除 懒惰删除机制 删除item对象时,不释放内存,作删除标记,指针放入slot回收插槽,下次分配的时候直接使用,34,名词解释,slab class:内存区类别(48byte-1MB) slab=page:动态创建的实际内存区 slab classid:slab class的ID chunk:数据区块,固定大小 item:实际存储在chunk中的数据项,35,slab内存分配,36,slab内存结构图:二维数组链表 slab是一次申请内存的最小单位,每个slab都是1MB,chunk填充item后会有空间浪费,双向链表,key 索引表,剩余空 间指针,slab指针列表,回收空间指针,37,sl

34、ab内存分配实例,38,实例数据-195:11213 4GB,39,计算slab占用内存,40,slab参数,进程内存区 slabclass元信息:1.1中是21byte,1.2中是200byte Hashtable:1.1中位41MB,1.2中位65MB 数据内存区 slab默认大小为1048576byte(1MB),大于1MB数据忽略 chunk初始大小,1.1中是1byte,1.2中是48byte 增长因子factor 1.1中,chunk大小为初始大小*2n,n为classid,即: id为0的slab大小1byte,id为1的slab大小2byte,id为2的slab大小4byte.

35、 id为20的slab,每chunk大小为1MB,只有一个chunk 1.2中有一个factor值,默认为1.25 96,120,152.,41,Item内存分配,42,Item数据格式 Item是保存在chunk中的实际数据,43,新建Item分配内存过程,快速定位slab classid 计算key+value+suffix+32结构体,如90byte 如果1MB,无法存储丢弃 取最小冗余的slab class 如:有48,96,120,存90会选择96 按顺序寻找可用chunk slot:检查slab回收空间slot里是否有剩余chunk delete:delete时标记到slot ex

36、ptime:get时检查的过期对象标记到slot end_page_ptr:检查page中是否有剩余chunk memory:内存还有剩余则开辟新的slab LRU:Slab内部扫描Item双向链表50次,44,内存有浪费了!,slab尾部剩余空间 如classid=40中,两个chunk占用了1009384byte,就有1048576-1009384=39192byte被浪费 解决办法:规划slab=chunk*n整数倍 slab中chunk利用率低:申请的slab只存放了一个Item 解决办法:规划slab=chunk chunk存储Item浪费 如I tem是100,存到128字节chu

37、nk,就有28字节浪费 解决办法:规划chunk=Item,45,使用合适的factor,减少浪费,-f参数:默认为1.25,曾经为2 值越小,slab中chunk size差距越小,内存浪费越小 1.25适合缓存几百字节的对象,slab class 1: chunk size 128 perslab 8192 slab class 2: chunk size 256 perslab 4096 slab class 3: chunk size 512 perslab 2048 slab class 4: chunk size 1024 perslab 1024 slab class 5: ch

38、unk size 2048 perslab 512 slab class 6: chunk size 4096 perslab 256 slab class 7: chunk size 8192 perslab 128 slab class 8: chunk size 16384 perslab 64 slab class 9: chunk size 32768 perslab 32 slab class 10: chunk size 65536 perslab 16 slab class 11: chunk size 131072 perslab 8 slab class 12: chunk

39、 size 262144 perslab 4 slab class 13: chunk size 524288 perslab 2,slab class 1: chunk size 88 perslab 11915 slab class 2: chunk size 112 perslab 9362 slab class 3: chunk size 144 perslab 7281 slab class 4: chunk size 184 perslab 5698 slab class 5: chunk size 232 perslab 4519 slab class 6: chunk size

40、 296 perslab 3542 slab class 7: chunk size 376 perslab 2788 slab class 8: chunk size 472 perslab 2221 slab class 9: chunk size 592 perslab 1771 slab class 10: chunk size 744 perslab 1409,factor=2,factor=1.25,建议:计算一下数据的预期平均长度,调整factor,以获得最恰当的设置,46,根据数据分布调整factor,非均匀分布,即数据长度集中在几个区域内 如保存用户Session 更极端的状

41、态是等长数据 如定长键值,定长数据 多见于访问、在线统计或执行锁 计算Item长度 key键长suffix+value值长结构大小(32字节),47,调优的最高指示精神,提高内存利用率,减少内存浪费 提高命中率(80%,95%?) 调优方法: f参数:factor增长因子 n参数:chunk初始值,48,一切都是为了更快,低CPU消耗(瓶颈在于网络IO) libevent事件机制 slab内存预分配机制 适合使用大量低CPU的机器搭建集群 32位机器最大2GB,64GB无限制 -m分配内存为数据区,memcached本身也需要占用内存,因此不可将物理内存全部分配 使用连接池维持连接,49,因为

42、优秀,所以不足,Cant dump 无法备份,重启无法恢复 Cant iterate over keys 无法查询 Not persistent 没有持久化,重启全部丢失 Not redundant 单点故障failover No Sessions 崩溃没法查找原因 No security 任何机器都可以telnet,需要放在防火墙后 内存问题 LRU是slab局部,没有全局 有空间浪费 日志问题 没有合理的日志 集群问题 集群增加机器成本高,50,改进计划,扩展二进制协议 不需要文本解析,速度更快 减少文本协议的漏洞 外部引擎加载功能 MySQL plugin,51,4.Memcached分

43、布式,52,Memcached使用方式 -客户端实现Hash,53,Memcached架构层次 -减少DB访问,提高Web速度,54,添加对象时,55,获取对象时,56,最常用的Hash算法,根据余数计算Hash 如Perl函数库:Cache:Memcached 优点:简单、分散性优秀 缺点:添加/移除服务器时,缓存重组代价巨大,影响命中率 26个字母由3个节点增加一个节点,命中率下降了23%,三个节点:node1 node2 nod3 node1: a,c,d,e,h,j,n,u,w,x node2: g,i,k,l,p,r,s,y node3: b,f,m,o,q,t,v,z,四个节点:n

44、ode1 node2 node3 node4 node1: d,f,m,o,t,v node2: b,i,k,p,r,y node3: e,g,l,n,u,w node4: a,c,h,j,q,s,x,z,增加 节点,57,Consistent Hash,参考原文: http:/alpha.mixi.co.jp/blog/?p=158 http:/ Hashing最大限度地抑制了键的重新分布 有的Consistent Hashing的实现方法还采用了虚拟节点的思想,59,支持Consistent Hash的函数库,libketama的PHP库 libketama(网站Last.fm) Perl

45、客户端 Cache:Memcached:Fast(search.cpan.org) Cache:Memcached:libmemcached(search.cpan.org),60,5.key-value系统比较,61,兼容memcached软件,repcached 为memcached提供复制(replication)功能的patch 单master单slave,互为主辅 Flared 存储到QDBM。实现了异步复制和fail over等功能 memagent 连接多个memd,实现一致性Hash,请求转发 memcachedb 存储到BerkleyDB Tokyo Tyrant 存储到To

46、kyo Cabinet。与memcached协议兼容,能通过HTTP访问,62,持久化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性

47、能会随数据量的增加而下降,上亿条下降较明显 Nuclear-renren 一致性Hash,动态增加/删除节点,63,持久化Redis,定期异步把数据库flush到硬盘,比Memcached多一个永久存储功能, 优点 读写10w/s,是性能最快的Key-Value DB 最大魅力:支持List链表和Set集合,对List/Set各种操作 单个value的最大限制是1GB,memcached只能保存1MB 主要缺点 容量受物理内存限制,不能用作海量数据的高性能读写 不具有scale Redis适合的场景 较小数据量的高性能操作和运算上 使用Redis的网站有github,Engine Yard,64,分布式数据库,CouchDB持久化 Cassandra分布式/NoSQL/scale 适合于实时数据处理 MongoDB分布式/NoSQL BigTable/Hbase 适合于数据仓库、大型数据的处理与分析,65,memcached测试,66,memd&memdb,67,memdb/TT/redis测试 500w+100byte read/write,68,me

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1