memcached官网:http://memcached.org/
一.安装
下载
# wget http://www.memcached.org/files/memcached-1.4.25.tar.gz
解压
# tar xzvf memcached-1.4.25.tar.gz
#cd memcached-1.4.25
配置
#./configure --prefix=/usr/local/memcached --with-libevent=/usr
注意这里选择libevent的位置就可以 比如你的是在–with-libevent=/usr/local/libevent/
# ./configure --prefix=/usr/local/memcached --with-libevent=/usr/local/libevent
编译安装
# make && make install
---------------须要依赖安装libevent-------------------
libevent官网 http://libevent.org/
# wget https://github.com/libevent/libevent/releases/download/release-2.0.22-stable/libevent-2.0.22-stable.tar.gz
# tar xzvf libevent-2.0.22-stable.tar.gz
# cd libevent-2.0.22-stable
# ./configure --prefix=/usr/local/libevent
# make && make install
----------------------------------
二.使用
启动
# /usr/local/memcached/bin/memcached -d -m 100 -uroot -l 0.0.0.0 -p 11211 -c 512 -P /usr/local/memcached/memcached.pid
启动參数:
memcached 1.4.2 -p <num> 监听的TCPport(默认: 11211) -U <num> 监听的UDPport(默认: 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 具体信息(还打印client命令/响应) -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 重写每一个数据页尺寸。调整数据项最大尺寸。
查看详情
#ps aux|grep mem
输出pid
#cat /usr/local/memcached/memcached.pid
状态
# telnet 127.0.0.1 11211
STAT limit_maxbytes就是最大内存是100M。
添加内存到200M
# /usr/local/memcached/bin/memcached -d -m 200 -uroot -l 0.0.0.0 -p 11211 -c 512 -P /usr/local/memcached/memcached.pid
先后2次查看内存使用
# top -n 1 |grep Mem
在启动memcached的时候能够通过-vv来查看slab的种类:
# /usr/local/memcached/bin/memcached -d -m 100 -uroot -l 0.0.0.0 -p 11211 -c 512 -P /usr/local/memcached/memcached.pid -vv
# /usr/local/memcached/bin/memcached -d -m 512 -l 0.0.0.0 -p 11211 -u root -vv
默认一个slab=1048576字节=1024K=1M
默认的truck是48
改为240
# /usr/local/memcached/bin/memcached -d -m 100 -n 240 -uroot -l 0.0.0.0 -p 11211 -c 512 -P /usr/local/memcached/memcached.pid -vv
# /usr/local/memcached/bin/memcached -d -m 512 -n 240 -l 0.0.0.0 -p 11211 -u root -vv
增长因子f默认是1.25,该值越小所能提供的chunk间隔越小。能够降低内存的浪费
# /usr/local/memcached/bin/memcached -d -m 512 -f 2 -l 0.0.0.0 -p 11211 -u root -vv
改动-I改变每一个slab的大小:
第一次最大-I仅仅有2048。然后改为4056
查看slabs状态
# stats slabs 显示各个slab的信息,包含chunk的大小、数目、使用情况等
# telnet 127.0.0.1 11211
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
# set key1 0 0 3
www
STORED
# get key1
须要注意的是set 最后一个參数就是value字符的长度!
以下是有益构造多个不同chunk的字符存储效果
# stats
# stats items
调整slab參数
slab对于memcached的空间利用率占有决定因素.
用户数据item(包含key,value)终于会保存到chunk内。
chunk规格是固定的,假设用户数据放进来后还有剩余则这剩余部分不能做其它用途。
确定slab后看里面的是否有空暇 chunk放key+value。假设不够就再向系统申请一个page(假设此时已经达到 -m 參数设置的内存使用上限,则看是否设置了 -M 。假设设置了 -M 则返回错误提示,否则按LRU算法删除数据)。申请后将该page按本slab的chunk size 进行分割。然后分配一个来存放用户数据。
假设须要申请内存 时,memcached会划分出一个新的page并分配给须要的slab区域。
Memcached并非将全部大小的数据都放在一起的,而是预先将数据空间划分为一系列slabs。每一个slab仅仅负责一定范围内的数据存储,其大小能够通过启动參数设置增长因子。默觉得1.25。即下一个slab的大小是上一个的1.25倍。
假设一个新的缓存数据要被存放,memcached首先选择一个合适的slab。然后查看该slab是否还有空暇的chunk。假设有则直接存放进去;如 果没有则要进行申请。slab申请内存时以page为单位。所以在放入第一个数据,不管大小为多少,都会有1M大小的page被分配给该slab。申请到 page后,slab会将这个page的内存按chunk的大小进行切分。这样就变成了一个chunk的数组。在从这个chunk数组中选择一个用于存储 数据。例如以下图。slab 1和slab 2都分配了一个page,并按各自的大小切分成chunk数组。
- default_size: 默认大小为48字节,也就是memcached默认的key+value的大小为48字节,能够通过-n參数来调节其大小;
- item_size: item结构体的长度,固定为32字节。default_size大小为48字节,item_size为32。因此class1的chunk大小为48+32=80字节;
- f为factor,是chunk变化大小的因素,默认值为1.25。调节f能够影响chunk的步进大小。在启动时能够使用-f来指定;
- CHUNK_ALIGN_BYTES是一个修正值,用来保证chunk的大小是某个值的整数倍(在32位机器上要求chunk的大小是4的整数倍)。
–Slab,特定大小的一组chunk
–Page,每次分配给slab的内存空间,会依照slab大小切分为chunk(默认1MB)–Chunk,存储记录的内存空间
1.先依据要存储的key、value和flags计算item的大小
item长度=item结构大小 + 键长 + 后缀长 + 存储值长度
2.假设这个item相应的slab还没有创建,则申请1个page(默认1MB)。将这个page依照这个slab类chunk的大写进行分割,然后将这个 item 存入
3.假设存在。且相应的slab没用完,存储
4.假设存在,且相应的slab用完了,则看内存是否用完,用完则启用LRU,否则申请新的page,存储
在make的时候添加參数:
假设之前已经安装须要清理,
必须加上编译选项-O0,不然在gdb内打印变量时提示"<value optimized out>"
# make uninstall
# make CFLAGS="-g -O0"
# make install
在gdb里启动
带精灵模式
# set args -d -m 100 -uroot -l 0.0.0.0 -p 11211 -c 512
不带精灵模式
# set args -m 100 -uroot -l 0.0.0.0 -p 11211 -c 512
后面都是走正常的调试流程
# break main
# break slabs_init
后面都是走正常的调试流程
# s 下一步 跟进函数
# n 下一步 不跟进函数
# c 下一个断点
改动变量值
改动do_daemonize,这样就不用进入daemon了
调试线程
# info threads
显示进程中全部的线程的概要信息。gdb按顺序显示:
1.线程号(gdb设置)
2.目标系统的线程标识。
3.此线程的当前堆栈。
一前面打*的线程表示是当前线程。
#thread THREADNO
把线程号为THREADNO的线程设为当前线程。命令行參数THREADNO是gdb内定的
线程号。
你能够用info threads命令来查看gdb内设置的线程号。
gdb显示该线程
的系统定义的标识号和线程相应的堆栈。比方:
#thread apply [THREADNO] [ALL] ARGS
此命令让你对一个以上的线程发出同样的命令ARGS,[THREADNO]的含义同上。
假设你要向你进程中的全部的线程发出命令使用[ALL]选项。
不管gdb何时中断了你的程序(由于一个断点或是一个信号),它自己主动选择信号或
断点发生的线程为当前线程。gdb将用一个格式为[Switching to SYSTAG]的消息来向你报告。