设为首页 收藏本站
查看: 2111|回复: 0

[经验分享] memcached使用详解

[复制链接]

尚未签到

发表于 2018-12-24 11:12:38 | 显示全部楼层 |阅读模式
  一.memcached介绍
1.基于libevent的事件处理
libevent是一套跨平台的事件处理接口的封装,能够兼容包括这些操作系统:Windows/Linux/BSD/Solaris 等操作系统的的事件处理。
包装的接口包括:poll、select(Windows)、epoll(Linux)、kqueue(BSD)、/dev/pool(Solaris)
Memcached 使用libevent来进行网络并发连接的处理,能够保持在很大并发情况下,仍旧能够保持快速的响应能力。
libevent: http://www.monkey.org/~provos/libevent/
  2.内置内存存储方式
为了提高性能,memcached中保存的数据都存储在memcached内置的内存存储空间中。由于数据仅存在于内存中,因此重启memcached、重启操作系统会导致全部数据消失。另外,内容容量达到指定值之后,就基于LRU(Least Recently Used)算法自动删除不使用的缓存。
  数据存储方式:Slab Allocation
结构图如下:

Slab Allocator的基本原理是按照预先规定的大小,将分配的内存分割成特定长度的块(chunk),并把尺寸相同的块分成组,以完全解决内存碎片问题。但由于分配的是特定长度的内存,因此无法有效利用分配的内存。比如将100字节的数据缓存到128字节的chunk中,剩余的28字节就浪费了。
Page:分配给Slab的内存空间,默认是1MB。分配给Slab之后根据slab的大小切分成chunk。
Chunk:用于缓存记录的内存空间。
Slab Class:特定大小的chunk的组。
memcached根据收到的数据的大小,选择最适合数据大小的slab。
memcached中保存着slab内空闲chunk的列表,根据该列表选择chunk,然后将数据缓存于其中。

  数据过期方式:Lazy Expiration + LRU
Lazy Expiration
memcached内部不会监视记录是否过期,而是在get时查看记录的时间戳,检查记录是否过
期。这种技术被称为lazy(惰性)expiration。因此,memcached不会在过期监视上耗费CPU时间。
LRU
memcached会优先使用已超时的记录的空间,但即使如此,也会发生追加新记录时空间不
足的情况,此时就要使用名为 Least Recently Used(LRU)机制来分配空间。当memcached的内存空间不足时(无法从slab class 获取到新的空间时),就从最近未被使用的记录中搜索,并将其空间分配给新的记录。
  二.memcached安装
1.安装libevent
# wget http://www.monkey.org/~provos/libevent-2.0.11-stable.tar.gz
# tar zxvpf libevent-2.0.11-stable.tar.gz -C ../software/
# ./configure --prefix=/usr/local
# make
# make install
  2.安装memcached
# wget http://memcached.googlecode.com/files/memcached-1.4.5.tar.gz
# tar zxvf memcached-1.4.5.tar.gz -C ../software/
# ./configure --prefix=/usr/local/memcached-1.4.5 --with-libevent=/usr/local
# make
# make install
  3.相关错误以及解决方案
错误信息:
./memcached: error while loading shared libraries: libevent-2.0.so.5: cannot open shared object file: No such file or directory
解决方法:
# whereis libevent-2.0.so.5
libevent-2.0.so: /usr/local/lib/libevent-2.0.so.5
# ldd /usr/local/memcached-1.4.5/bin/memcached
        libevent-2.0.so.5 => not found
        libpthread.so.0 => /lib64/libpthread.so.0 (0x00000032f2600000)
        libc.so.6 => /lib64/libc.so.6 (0x00000032f1a00000)
        /lib64/ld-linux-x86-64.so.2 (0x00000032f1600000)
# LD_DEBUG=libs ./memcached -v                 
      9873:     find library=libevent-2.0.so.5 [0]; searching
      9873:      search cache=/etc/ld.so.cache
      9873:      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)
      9873:       trying file=/lib64/tls/x86_64/libevent-2.0.so.5
      9873:       trying file=/lib64/tls/libevent-2.0.so.5
      9873:       trying file=/lib64/x86_64/libevent-2.0.so.5
      9873:       trying file=/lib64/libevent-2.0.so.5
      9873:       trying file=/usr/lib64/tls/x86_64/libevent-2.0.so.5
      9873:       trying file=/usr/lib64/tls/libevent-2.0.so.5
      9873:       trying file=/usr/lib64/x86_64/libevent-2.0.so.5
      9873:       trying file=/usr/lib64/libevent-2.0.so.5
      9873:
./memcached: error while loading shared libraries: libevent-2.0.so.5: cannot open shared object file: No such file or directory
搜索路径为:/lib64 /usr/lib64
因此做个软连接到/usr/lib64目录下:
# ln -s /usr/local/lib/libevent-2.0.so.5 /usr/lib64/libevent-2.0.so.5
# ldd /usr/local/memcached-1.4.5/bin/memcached                       
        libevent-2.0.so.5 => /usr/lib64/libevent-2.0.so.5 (0x00002adde8270000)
        libpthread.so.0 => /lib64/libpthread.so.0 (0x00000032f2600000)
        libc.so.6 => /lib64/libc.so.6 (0x00000032f1a00000)
        librt.so.1 => /lib64/librt.so.1 (0x00000032f2a00000)
        /lib64/ld-linux-x86-64.so.2 (0x00000032f1600000)
可看出已经ok了。很多时候遇到找不到lib库的问题可以通过上面的方法来解决。
  三.启动memcached
1.memcached启动选项:
-p       TCP监听端口 (default: 11211)
-U       UDP 监听端口 (default: 11211, 0 is off)
-s      UNIX socket监听路径,不支持网络
-a      UNIX socket访问掩码, 八进制 (default: 0700)
-l   监听的服务器IP地址 (default: all addresses)
-d            启动一个守护进程
-r            最大限度利用核心文件限制
-u  运行memcached用户
-m       最大的内存使用 (default: 64 MB)
-M            内存耗尽返回错误
-c       最大并发连接 (default: 1024)
-k           锁定所有分页内存
-v            输出警告和错误信息
-vv          同时打印客户端请求和返回信息
-vvv          打印内部状态转换信息
-i           打印memcached 和 libevent 版本信息
-P      设置保存pid文件, only used with -d option
-f    块大小增长倍数 (default: 1.25)
-n    key+value+flags最小分配空间(default: 48)
-L           如何有效,尝试使用大内存页。增加内存页大小可以减少失误的TLB数量,提高性能。
-D      指定key和IDs的分隔符 default is ":" (colon). 如果指定此选项,统计信息收集自动开启;
-t      使用的线程数量 (default: 4)
-R           每个事件的最大请求数 (default: 20)
-C            禁止使用 CAS
-b            设置积压队列数限制 (default: 1024)
-B           绑定协议 - one of ascii, binary, or auto (default)
-I            分配给每个slab页(default: 1mb, min: 1k, max: 128m)
  2.启动
# ./memcached -d -m 500 -u root -l 192.168.50.10 -p 12000 -c 256 -P /tmp/memcached.pid -vvv
slab class   1: chunk size        96 perslab   10922
slab class   2: chunk size       120 perslab    8738
slab class   3: chunk size       152 perslab    6898
slab class   4: chunk size       192 perslab    5461
slab class   5: chunk size       240 perslab    4369
slab class   6: chunk size       304 perslab    3449
slab class   7: chunk size       384 perslab    2730
slab class   8: chunk size       480 perslab    2184
slab class   9: chunk size       600 perslab    1747
slab class  10: chunk size       752 perslab    1394
slab class  11: chunk size       944 perslab    1110
slab class  12: chunk size      1184 perslab     885
slab class  13: chunk size      1480 perslab     708
slab class  14: chunk size      1856 perslab     564
slab class  15: chunk size      2320 perslab     451
slab class  16: chunk size      2904 perslab     361
slab class  17: chunk size      3632 perslab     288
slab class  18: chunk size      4544 perslab     230
slab class  19: chunk size      5680 perslab     184
slab class  20: chunk size      7104 perslab     147
slab class  21: chunk size      8880 perslab     118
slab class  22: chunk size     11104 perslab      94
slab class  23: chunk size     13880 perslab      75
slab class  24: chunk size     17352 perslab      60
slab class  25: chunk size     21696 perslab      48
slab class  26: chunk size     27120 perslab      38
slab class  27: chunk size     33904 perslab      30
slab class  28: chunk size     42384 perslab      24
slab class  29: chunk size     52984 perslab      19
slab class  30: chunk size     66232 perslab      15
slab class  31: chunk size     82792 perslab      12
slab class  32: chunk size    103496 perslab      10
slab class  33: chunk size    129376 perslab       8
slab class  34: chunk size    161720 perslab       6
slab class  35: chunk size    202152 perslab       5
slab class  36: chunk size    252696 perslab       4
slab class  37: chunk size    315872 perslab       3
slab class  38: chunk size    394840 perslab       2
slab class  39: chunk size    493552 perslab       2
slab class  40: chunk size    616944 perslab       1
slab class  41: chunk size    771184 perslab       1
slab class  42: chunk size   1048576 perslab       1

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-655240-1-1.html 上篇帖子: Linux memcached 安装,应用加速mysql 下篇帖子: memcached常见命令
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表