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规格是固定的,如果用户数据放进来后还有剩余则这剩余部分不能做其他用途。

     工作流程: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是因为内存不够,有三个思路:一是在CPU有余力的情况下开启压缩(PHP扩展);二是增加内存;三是调整 -f 参数,减少内存浪费。
5,调整业务代码,提高命中率。
6,缓存小数据。省带宽,省网络I/O时间,省内存。
7,根据业务特点,为数据尺寸区间小的业务分配专用的memcached实例。这样可以调小 -f 参数,使数据集中存在少数几个slab上,内存浪费较少。

 

memcached参数中文解释

 

memcached 1.4.2
  -p <num>      监听的TCP端口(默认: 11211)
  -U <num>      监听的UDP端口(默认: 11211, 0表示不监听)
  -s <file>     用于监听的UNIX套接字路径(禁用网络支持)
  -a <mask>     UNIX套接字访问掩码,八进制数字(默认:0700)
  -l <ip_addr>  监听的IP地址。(默认:INADDR_ANY,所有地址)
  -d            作为守护进程来运行。
  -r            最大核心文件限制。
  -u <username> 设定进程所属用户。(只有root用户可以使用这个参数)
  -m <num>      单个数据项的最大可用内存,以MB为单位。(默认:64MB)
  -M            内存用光时报错。(不会删除数据)
  -c <num>      最大并发连接数。(默认:1024)
  -k            锁定所有内存页。注意你可以锁定的内存上限。
                试图分配更多内存会失败的,所以留意启动守护进程时所用的用户可分配的内存上限。
                (不是前面的 -u <username> 参数;在sh下,使用命令"ulimit -S -l NUM_KB"来设置。)
  -v            提示信息(在事件循环中打印错误/警告信息。)
  -vv           详细信息(还打印客户端命令/响应)
  -vvv          超详细信息(还打印内部状态的变化)
  -h            打印这个帮助信息并退出。
  -i            打印memcached和libevent的许可。
  -P <file>     保存进程ID到指定文件,只有在使用 -d 选项的时候才有意义。
  -f <factor>   块大小增长因子。(默认:1.25)
  -n <bytes>    分配给key+value+flags的最小空间(默认:48)
  -L            尝试使用大内存页(如果可用的话)。提高内存页尺寸可以减少"页表缓冲(TLB)"丢失次数,提高运行效率。
                为了从操作系统获得大内存页,memcached会把全部数据项分配到一个大区块。
  -D <char>     使用 <char> 作为前缀和ID的分隔符。
                这个用于按前缀获得状态报告。默认是":"(冒号)。
                如果指定了这个参数,则状态收集会自动开启;如果没指定,则需要用命令"stats detail on"来开启。
  -t <num>      使用的线程数(默认:4)
  -R            每个连接可处理的最大请求数。
  -C            禁用CAS。
  -b            设置后台日志队列的长度(默认:1024)
  -B            绑定协议 - 可能值:ascii,binary,auto(默认)
  -I            重写每个数据页尺寸。调整数据项最大尺寸。

 

 

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值