对上一章列出了全部参数。其中有60%是不怎么用到的。
这一章节选取出我觉得重要的参数出来细讲。
常用参数
- p 指定端口
指定tcp监听端口。默认是11211。可是当一台机器需要跑多个memcached实例的时候,或者网维只能特定某些端口可用,这个端口是一定修改的。
举个例子,启用memcached并且监听11212端口:
memcached -p 11212
- d 守护进程
守护进程。一定使用的参数。mc启动的时候,设置为守护进程。进程后台执行。不使用-d参数会影响其他操作:
![](https://images0.cnblogs.com/blog2015/67474/201505/281020161889994.jpg)
上图所示,如果没有-d参数,当前终端就不能执行其他任务。ctrl+c退出当前memcached进程。
memcached -d
- m 内存大小
memcached程序存储数据所分配的内存大小。默认64,单位MB。生产环境都是改为2G,4G的样子的。如果这个参数过小,memcached就变得不健康,需要LRU淘汰一些数据。
memcached -m 32
memcached -m 64
我设置了这个参数,怎么样才能看到差别呢?可以通过memcached的stats指令查看。memcached启动后, telnet/nc对应的ip端口,然后输入stats指令。
nc localhost 11212
(nc和telnet的差别可自行baidu or google)
看到一堆memcache的信息
其中“STAT limit_maxbytes” 一项就是设置这个参数对应的内存大小了。
下图是-m 32 的情况:
根据memcached的存储模型,chunk存放item,比如说1个4K的chunk存放一个1K的item,这3K的空间就会浪费的了。分配内存的时候需要预留一部分空间。并且定时检查memcached的监控状况。例如,生产环境估计一个memcached需要1G空间。那么我创建memcached实例的时候可能就要-m 1500 甚至-m 2048。比起预估的值更大一点。
PS1:接下来的系列讲到memcached的内存分配模型会细讲chunks,item的关系。
PS2:关于memcached的监控状况也会在后续讲到。
调优参数
- c 连接数
连接数,默认1024。简单的说,增加这个参数值可以提高效率,但是增加了机器的负载;降低这个参数反之。
- f slab增长因子
slab中chunk大小的增长因子。这个参数对于memcahched内存分配极其重要的参数。默认1.25,如果这个参数越大,slab数量越少;如果这个参数越小,slabs越多。
怎样理解“增长”的意思??请参照下图:
![](https://images0.cnblogs.com/blog2015/67474/201506/111711056299003.jpg)
在memcached的模型中,分为多个slab,每个slab中的chunk用于存储数据。增长关系是这样子的:在第一个slab中,的chunk是SIZE;第二个slab中的chunk是SIZE*factor;第三个slab的chunk的是第二个的大小*factor。。。
譬如说,当启动memcached的时候,增长因子设置为1.5。设置32m内存。输出详细日志查看。
memcached -p 11212 -f 1.5 -vvv -u root -m 32
而修改为3的话,内存分配情况又不同了。
memcached -p 11212 -f 3 -vvv -u root -m 32
当f这个参数越大,每chunk的增长就越快。
- n 一个chunk最小空间
一个chunk的最小大小。默认值48。
- L 大页内存分配
通过这个参数, 可以提高性能。不过需要系统支持。
- b backlog队列的大小。
与socket通信相关。任务过多处理不完的情况下可坑设置这个参数。不过出现这种问题,一般都是调小数据的大小,或者增加memcached实例。
- B 二进制协议
memcached一开始只支持文本协议。后来支持了二进制协议。文本协议和二进制协议的区别,就和HTTP协议和TCP/UDP协议的区别一样。二进制协议的话更快,但是不能通过telnet/nc等命令到mc中找数据。memcached默认是既支持文本协议又支持二进制协议的。另外memcached14.1x版本使用二进制协议有bug,请见release。
https://code.google.com/p/memcached/wiki/BinaryProtocolRevamped#Request_header 有二进制协议的具体格式说明。
- I slab大小
通过这个参数, 设置一个slab的大小。同时,最后一个slab是只有一个chunk的。也是chunk的最大值。
举个例子:
memcached -p 11212 -f 1.25 -vvv -u root -m 64 -I 20480