【转】Memcached安装

 

 

解析:Memcached是什么?html

Memcached是由Danga Interactive开发的,高性能的,分布式的内存对象缓存系统,用于在动态应用中减小数据库负载,提高访问速度。git

1、软件版本
    libevent 稳定版
wget http://monkey.org/~provos/libevent-1.4.14b-stable.tar.gzgithub

    memcached 稳定版
wget  http://memcached.googlecode.com/files/memcached-1.4.5.tar.gzredis

2、软件安装
    Libevent安装
[root@jw-test01 software]# tar zxvf libevent-1.4.14b-stable.tar.gz
[root@jw-test01 software]# cd libevent-1.4.14b-stable
[root@jw-test01 libevent]# ./configure --prefix=/usr/local/libevent/
[root@jw-test01 libevent]# make
[root@jw-test01 libevent]# make install算法

  Memcached安装
[root@jw-test01 software]# tar -zxvf memcached-1.4.5.tar.gz
[root@jw-test01 software]# cd memcached-1.4.5
[root@jw-test01 memcached]# ./configure --prefix=/usr/local/memcached --with-libevent=/usr/local/libevent/
[root@jw-test01 memcached]# make
[root@jw-test01 memcached]# make installsql

3、编写Memcached启动脚本
#!/bin/bash
# author:kuangl
# date:2013-05-30
# description: Starts and stops the Memcached services.
# pidfile: /tmp/memcached1.pid
# config:  /usr/local/memcached
# chkconfig: - 55 45
# source function library
. /etc/rc.d/init.d/functions
memcached="/usr/local/memcached/bin/memcached"
[ -e $memcached ] || exit 1
start()
{
echo "Starting memcached:"
daemon $memcached -d -m 1000 -u root -l 127.0.0.1 -p 11211 -c 1500 -P /tmp/memcached1.pid
}
stop()
{
echo "Shutting down memcached"
killproc memcached
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
stop
sleep 3
start
;;
*)
echo $"Usage: $0 {start|stop|restart}"
exit 1
esac
exit $?数据库

4、将脚本复制到init.d目录下
[root@jw-test01 scripts]# cp memcached.sh /etc/init.d/memcachedwindows

5、将memcached加入系统启项
[root@jw-test01 scripts]# chkconfig  --add memcached
[root@jw-test01 scripts]# chkconfig --level 35 memcached on数组

6、启动memcached
[root@jw-test01 scripts]# service memcached restart
Shutting down memcached      [肯定]
Starting memcached:          [肯定]
[root@jw-test01 scripts]# ps -ef |grep memcached
root    27616    1  0 22:18 ?        00:00:00 /usr/local/memcached/bin/memcached -d -m 1000 -u root -l 127.0.0.1 -p 11211 -c 1500 -P /tmp/memcached1.pid缓存

7、Memcached经常使用参数

 

参数 说明
-p <num> 设置端口号(默认不设置为: 11211)
-U <num> UDP监听端口(默认: 11211, 0 时关闭)
-l <ip_addr> 绑定地址(默认:全部都容许,不管内外网或者本机更换IP,有安全隐患,若设置为127.0.0.1就只能本机访问)
-d 独立进程运行
-u <username> 绑定使用指定用于运行进程<username>
-m <num> 容许最大内存用量,单位M (默认: 64 MB)
-P <file> PID写入文件<file>,这样可使得后边进行快速进程终止, 须要与-d 一块儿使用
错误信息:
/usr/local/memcacheq/bin/memcacheq: error while loading shared libraries: libevent-2.0.so.5: cannot open shared object file: No such file or directory
 
查找连接包 :
LD_DEBUG=libs /usr/local/memcacheq/bin/memcacheq -v | grep libevent
     27382: find library=libm.so.6 [0]; searching
     27382: search cache=/etc/ld.so.cache
     27382:  trying file=/lib64/libm.so.6
     27382:
     27382: find library=libdb-4.7.so [0]; searching
     27382: search cache=/etc/ld.so.cache
     27382:  trying file=/lib64/libdb-4.7.so
     27382:
     27382: find library=libevent-2.0.so.5 [0]; searching
     27382: search cache=/etc/ld.so.cache
     27382: search path=/lib64/tls/x86_64:/lib64/tls:/lib64/x86_64:/lib64:/usr/lib64/tls/x86_64:/usr/lib64/tls:/usr/lib64/x86_64:/usr/lib64 (system search path)
     27382:  trying file=/lib64/tls/x86_64/libevent-2.0.so.5
     27382:  trying file=/lib64/tls/libevent-2.0.so.5
     27382:  trying file=/lib64/x86_64/libevent-2.0.so.5
     27382:  trying file=/lib64/libevent-2.0.so.5
     27382:  trying file=/usr/lib64/tls/x86_64/libevent-2.0.so.5
     27382:  trying file=/usr/lib64/tls/libevent-2.0.so.5
     27382:  trying file=/usr/lib64/x86_64/libevent-2.0.so.5
     27382:  trying file=/usr/lib64/libevent-2.0.so.5
     27382:
创建 连接 :
sudo ln -s /usr/lib/libevent-2.0.so.5.1.7 /lib64/libevent-2.0.so.5
 
 
 

以前咱们讲解了 Linux服务器下Memcache的安装 ,今天详细讲解下Windows和Linux下Memcache的启动参数和监控服务器上的Memcached运行状况的命令stats。

Linux下memcache启动的命令:

memcached -d -m 10 -u root -l 192.168.5.80 -p 11222 -c 256 -P /tmp/memcached.pid

memcache参数说明:

-d选项是启动一个守护进程

-m是分配给Memcache使用的内存数量,单位是MB,我这里是10MB

-u是运行Memcache的用户,我这里是root

-l是监听的服务器IP地址

-p是设置Memcache监听的端口,最好是1024以上的端口

-c选项是最大运行的并发链接数,默认是1024,按照你服务器的负载量来设定

-P是设置保存Memcache的pid文件

windows

memcached的基本 命令(启动、配置相关)

-p 监听的端口

-l 链接的IP地址, 默认是本机

-d start 启动memcached服务

-d restart 重起memcached服务

-d stop|shutdown 关闭正在运行的memcached服务

-d install 安装memcached服务

-d uninstall 卸载memcached服务

-u 以的身份运行 (仅在以root运行的时候有效)

-m 最大内存使用,单位MB。默认64MB

-M 内存耗尽时返回错误,而不是删除项

-c 最大同时链接数,默认是1024

-f 块大小增加因子,默认是1.25

-n 最小分配空间,key+value+flags默认是48

-h 显示帮助

memcache stats命令

stats 命令的功能正如其名:转储所链接的 memcached 实例的当前统计数据。在下例中,执行stats命令显示了关于当前 memcached 实例的信息:

STAT pid 22459                                     进程ID

STAT uptime 1027046                         服务器运行秒数

STAT time 1273043062                       服务器当前unix时间戳

STAT version 1.4.4                                服务器版本

STAT pointer_size 64                           操做系统(这台服务器是64位的)

STAT rusage_user 0.040000             进程累计用户时间

STAT rusage_system 0.260000        进程累计系统时间

STAT curr_connections 10                  当前打开链接数

STAT total_connections 82                 曾打开的链接总数

STAT connection_structures 13          服务器分配的链接结构数

STAT cmd_get 54                            执行get命令总数

STAT cmd_set 34                            执行set命令总数

STAT cmd_flush 3                           指向flush_all命令总数

STAT get_hits 9                            get命中次数

STAT get_misses 45                         get未命中次数

STAT delete_misses 5                       delete未命中次数

STAT delete_hits 1                         delete命中次数

STAT incr_misses 0                         incr未命中次数

STAT incr_hits 0                           incr命中次数

STAT decr_misses 0                         decr未命中次数

STAT decr_hits 0                           decr命中次数

STAT cas_misses 0                     cas未命中次数

STAT cas_hits 0                            cas命中次数

STAT cas_badval 0                          使用擦拭次数

STAT auth_cmds 0

STAT auth_errors 0

STAT bytes_read 15785                      读取字节总数

STAT bytes_written 15222                   写入字节总数

STAT limit_maxbytes 1048576                分配的内存数(字节)

STAT accepting_conns 1                     目前接受的连接数

STAT listen_disabled_num 0

STAT threads 4                             线程数

STAT conn_yields 0

STAT bytes 0                               存储item字节数

STAT curr_items 0                          item个数

STAT total_items 34                        item总数

STAT evictions 0                           为获取空间删除item的总数

flush_all                                            这个最简单的命令仅用于清理缓存中的全部名称/值对。

 

 

 

 

一直在使用Memcache,可是对其内部的问题,如它内存是怎么样被使用的,使用一段时间后想看看一些状态怎么样?一直都不清楚,查了又忘记,如今整理出该篇文章,方便本身查阅。本文不涉及安装、操做。有兴趣的同窗能够查看以前写的文章和Google。

1:参数

复制代码
memcached -h  memcached 1.4.14 -p <num> TCP端口,默认为11211,能够不设置 -U <num> UDP端口,默认为11211,0为关闭 -s <file> UNIX socket -a <mask> access mask for UNIX socket, in octal (default: 0700) -l <addr> 监听的 IP 地址,本机能够不设置此参数 -d 以守护程序(daemon)方式运行 -u 指定用户,若是当前为 root ,须要使用此参数指定用户 -m <num> 最大内存使用,单位MB。默认64MB -M 禁止LRU策略,内存耗尽时返回错误,而不是删除项 -c <num> 最大同时链接数,默认是1024 -v verbose (print errors/warnings while in event loop) -vv very verbose (also print client commands/reponses) -vvv extremely verbose (also print internal state transitions) -h 帮助信息 -i print memcached and libevent license -P <file> 保存PID到指定文件 -f <factor> 增加因子,默认1.25 -n <bytes> 初始chunk=key+suffix+value+32结构体,默认48字节 -L 启用大内存页,能够下降内存浪费,改进性能 -t <num> 线程数,默认4。因为memcached采用NIO,因此更多线程没有太多做用 -R 每一个event链接最大并发数,默认20 -C 禁用CAS命令(能够禁止版本计数,减小开销) -b Set the backlog queue limit (default: 1024) -B Binding protocol-one of ascii, binary or auto (default) -I 调整分配slab页的大小,默认1M,最小1k到128M
复制代码

 上面加粗的参数,须要重点关注,正常启动的例子:

复制代码
启动: /usr/bin/memcached -m 64 -p 11212 -u nobody -c 2048 -f 1.1 -I 1024 -d -l 10.211.55.9 链接: telnet 10.211.55.9 11212 Trying 10.211.55.9... Connected to 10.211.55.9. Escape character is '^]'.
复制代码

能够经过命令查看全部参数:stats settings

2:理解memcached的内存存储机制

      Memcached默认状况下采用了名为Slab Allocator的机制分配、管理内存。在该机制出现之前,内存的分配是经过对全部记录简单地进行malloc和free来进行的。可是,这种方式会致使内存碎片,加剧操做系统内存管理器的负担,最坏的状况下,会致使操做系统比memcached进程自己还慢。Slab Allocator就是为解决该问题而诞生的。

      Slab Allocator的基本原理是按照预先规定的大小,将分配的内存以page为单位,默认状况下一个page是1M,能够经过-I参数在启动时指定,分割成各类尺寸的块(chunk), 并把尺寸相同的块分红组(chunk的集合),若是须要申请内存时,memcached会划分出一个新的page并分配给须要的slab区域。page一旦被分配在重启前不会被回收或者从新分配,以解决内存碎片问题。

Page

分配给Slab的内存空间,默认是1MB。分配给Slab以后根据slab的大小切分红chunk。

Chunk

用于缓存记录的内存空间。

Slab Class

特定大小的chunk的组。

      Memcached并非将全部大小的数据都放在一块儿的,而是预先将数据空间划分为一系列slabs,每一个slab只负责必定范围内的数据存储。memcached根据收到的数据的大小,选择最适合数据大小的slab。memcached中保存着slab内空闲chunk的列表,根据该列表选择chunk,而后将数据缓存于其中。

      如图所示,每一个slab只存储大于其上一个slab的size并小于或者等于本身最大size的数据。例如:100字节大小的字符串会被存到slab2(88-112)中,每一个slab负责的空间是不等的,memcached默认状况下下一个slab的最大值为前一个的1.25倍,这个能够经过修改-f参数来修改增加比例。

      Slab Allocator解决了当初的内存碎片问题,但新的机制也给memcached带来了新的问题。chunk是memcached实际存放缓存数据的地方,这个大小就是管理它的slab的最大存放大小。每一个slab中的chunk大小是同样的,如上图所示slab1的chunk大小是88字节,slab2是112字节。因为分配的是特定长度的内存,所以没法有效利用分配的内存。例如,将100字节的数据缓存到128字节的chunk中,剩余的28字节就浪费了。这里须要注意的是chunk中不只仅存放缓存对象的value并且保存了缓存对象的key,expire time, flag等详细信息。因此当set 1字节的item,须要远远大于1字节的空间存放。

memcached在启动时指定 Growth Factor因子(经过-f选项), 就能够在某种程度上控制slab之间的差别。默认值为1.25。

slab的内存分配具体过程以下:

      Memcached在启动时经过-m参数指定最大使用内存,可是这个不会一启动就占用完,而是逐步分配给各slab的。若是一个新的数据要被存放,首先选择一个合适的slab,而后查看该slab是否还有空闲的chunk,若是有则直接存放进去;若是没有则要进行申请,slab申请内存时以page为单位,不管大小为多少,都会有1M大小的page被分配给该slab(该page不会被回收或者从新分配,永远都属于该slab)。申请到page后,slab会将这个page的内存按chunk的大小进行切分,这样就变成了一个chunk的数组,再从这个chunk数组中选择一个用于存储数据。若没有空闲的page的时候,则会对改slab进行LRU,而不是对整个memcache进行LRU。

以上大体讲解了memcache的内存分配策略,下面来讲明如何查看memcache的使用情况。 

3,memcache状态和性能查看

  命中率 :stats命令

按照下面的图来解读分析

 get_hits表示读取cache命中的次数,get_misses是读取失败的次数,即尝试读取不存在的缓存数据。即:

命中率=get_hits / (get_hits + get_misses) 

命中率越高说明cache起到的缓存做用越大。可是在实际使用中,这个命中率不是有效数据的命中率,有些时候get操做可能只是检查一个key存在不存在,这个时候miss也是正确的,这个命中率是从memcached启动开始全部的请求的综合值,不能反映一个时间段内的状况,因此要排查memcached的性能问题,还须要更详细的数值。可是高的命中率仍是可以反映出memcached良好的使用状况,忽然下跌的命中率可以反映大量cache丢失的发生。

② 观察各slab的items的状况:Stats items命令

主要参数说明:

outofmemory slab class为新item分配空间失败的次数。这意味着你运行时带上了-M或者移除操做失败
number 存放的数据总数
age 存放的数据中存放时间最久的数据已经存在的时间,以秒为单位
evicted 不得不从LRU中移除未过时item的次数 
evicted_time 自最后一次清除过时item起所经历的秒数,即最后被移除缓存的时间,0表示当前就有被移除,用这个来判断数据被移除的最近时间
evicted_nonzero 没有设置过时时间(默认30天),但不得不从LRU中称除该未过时的item的次数

      由于memcached的内存分配策略致使一旦memcached的总内存达到了设置的最大内存表示全部的slab可以使用的page都已经固定,这时若是还有数据放入,将致使memcached使用LRU策略剔除数据。而LRU策略不是针对全部的slabs,而是只针对新数据应该被放入的slab,例若有一个新的数据要被放入slab 3,则LRU只对slab 3进行,经过stats items就能够观察到这些剔除的状况。

注意evicted_time:并非发生了LRU就表明memcached负载过载了,由于有些时候在使用cache时会设置过时时间为0,这样缓存将被存放30天,若是内存满了还持续放入数据,而这些为过时的数据好久没有被使用,则可能被剔除。把evicted_time换算成标准时间看下是否已经达到了你能够接受的时间,例如:你认为数据被缓存了2天是你能够接受的,而最后被剔除的数据已经存放了3天以上,则能够认为这个slab的压力其实能够接受的;可是若是最后被剔除的数据只被缓存了20秒,不用考虑,这个slab已经负载太重了。

经过上面的说明能够看到当前的memcache的slab1的状态:

items有305816个,有效时间最久的是21529秒,经过LRU移除未过时的items有95336839个,经过LRU移除没有设置过时时间的未过时items有95312220个,当前就有被清除的items,启动时没有带-M参数。

③ 观察各slabs的状况:stats slabs命令

从Stats items中若是发现有异常的slab,则能够经过stats slabs查看下该slab是否是内存分配的确有问题。

主要参数说明:

属性名称 属性说明
chunk_size 当前slab每一个chunk的大小
chunk_per_page 每一个page可以存放的chunk数
total_pages 分配给当前slab的page总数,默认1个page大小1M,能够计算出该slab的大小
total_chunks 当前slab最多可以存放的chunk数,应该等于chunck_per_page * total_page
used_chunks 已经被占用的chunks总数
free_chunks 过时数据空出的chunk但尚未被使用的chunk数
free_chunks_end 新分配的可是尚未被使用的chunk数

 

 

 

 

 

 




这里须要注意total_pages 这个是当前slab总共分配大的page总数,若是没有修改page的默认大小的状况下,这个数值就是当前slab可以缓存的数据的总大小(单位为M)。若是这个slab的剔除很是严重,必定要注意这个slab的page数是否是太少了。还有一个公式:

total_chunks = used_chunks + free_chunks + free_chunks_end

另外stats slabs还有2个属性:

属性名称 属性说明

active_slabs

活动的slab总数

total_malloced

实际已经分配的总内存数,单位为byte,这个数值决定了memcached实际还能申请多少内存,若是这个值已经达到设定的上限(和stats settings中的maxbytes对比),则不会有新的page被分配。

 

④ 对象数量的统计:stats sizes

 

注意:该命令会锁定服务,暂停处理请求。该命令展现了固定chunk大小中的items的数量。也能够看出slab1(96byte)中有多少个chunks。

⑤ 查看、导出key:stats cachedump

在进入memcache中,你们都想查看cache里的key,相似redis中的keys *命令,在memcache里也能够查看,可是须要2步完成。

一是先列出items:

复制代码
stats items --命令 ... ... STAT items:29:number 228 STAT items:29:age 34935 ... END
复制代码

二是经过itemid取key,上面的id是29,再加上一个参数:为列出的长度,0为所有列出。

复制代码
stats cachedump 29 0 --命令 ITEM 26457202 [49440 b; 1467262309 s] ... ITEM 30017977 [45992 b; 1467425702 s] ITEM 26634739 [48405 b; 1467437677 s] END --总共228个key get 26634739 取value
复制代码

如何导出key呢?这里就须要经过 echo ... nc 来完成了

echo "stats cachedump 29 0" | nc 10.211.55.9 11212 >/home/zhoujy/memcache.log

在导出的时候须要注意的是:cachedump命令每次返回的数据大小只有2M,这个是memcached的代码中写死的一个数值,除非在编译前修改。

⑥ 另外一个监控工具:memcached-tool,一个perl写的工具:memcache_tool.pl

View Code
复制代码
./memcached-tool 10.211.55.9:11212 --执行
  # Item_Size Max_age Pages Count Full? Evicted Evict_Time OOM 1 96B 20157s 28 305816 yes 95431913 0 0 2 120B 16049s 40 349520 yes 117041737 0 0 3 152B 17574s 39 269022 yes 92679465 0 0 4 192B 18157s 43 234823 yes 78892650 0 0 5 240B 18722s 52 227188 yes 72908841 0 0 6 304B 17971s 73 251777 yes 85556469 0 0 7 384B 17881s 81 221130 yes 75596858 0 0 8 480B 17760s 70 152880 yes 53553607 0 0 9 600B 18167s 58 101326 yes 34647962 0 0 10 752B 18518s 52 72488 yes 24813707 0 0 11 944B 18903s 52 57720 yes 16707430 0 0 12 1.2K 20475s 44 38940 yes 11592923 0 0 13 1.4K 21220s 36 25488 yes 8232326 0 0 14 1.8K 22710s 35 19740 yes 6232766 0 0 15 2.3K 22027s 33 14883 yes 4952017 0 0 16 2.8K 23139s 33 11913 yes 3822663 0 0 17 3.5K 23495s 31 8928 yes 2817520 0 0 18 4.4K 22611s 29 6670 yes 2168871 0 0 19 5.5K 23652s 29 5336 yes 1636656 0 0 20 6.9K 21245s 26 3822 yes 1334189 0 0 21 8.7K 22794s 22 2596 yes 783620 0 0 22 10.8K 22443s 19 1786 yes 514953 0 0 23 13.6K 21385s 18 1350 yes 368016 0 0 24 16.9K 23782s 16 960 yes 254782 0 0 25 21.2K 23897s 14 672 yes 183793 0 0 26 26.5K 27847s 13 494 yes 117535 0 0 27 33.1K 27497s 14 420 yes 83966 0 0 28 41.4K 28246s 14 336 yes 63703 0 0 29 51.7K 33636s 12 228 yes 24239 0 0
复制代码

解释:

含义
# slab class编号
Item_Size    chunk大小
Max_age LRU内最旧的记录的生存时间
pages 分配给Slab的页数
count Slab内的记录数、chunks数、items数、keys数
Full? Slab内是否含有空闲chunk
Evicted 从LRU中移除未过时item的次数
Evict_Time 最后被移除缓存的时间,0表示当前就有被移除
OOM -M参数?



 

 

 

 

 

 

 

 


4,总结

      实际应用Memcached时,咱们遇到的不少问题都是由于不了解其内存分配机制所致,但愿本文能让你们初步了解Memcached在内存方便的分配机制,虽然redis等一些nosql的数据库产品在不少产品中替换了memcache,可是memcache还有不少项目会依赖它,因此还得学习来解决问题,后续出现新内容会不定时更新。

5,参考文档

 Memcached内存分析、调优、集群 

 memcache内存分配、性能检测

 memcached的基础

 理解memcached的内存存储

 memcached的删除机制和发展方向

 memcached的分布式算法

 memcached的应用和兼容程序

 Memcached二三事儿

相关文章
相关标签/搜索