Memcached安装使用和源码调试
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> 监听的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 重写每个数据页尺寸。调整数据项最大尺寸。
查看详情
#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的空间利用率占有决定因素.
如果一个新的缓存数据要被存放,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]的消息来向你报告。
Memcached安装使用和源码调试相关推荐
- Redis安装与源码调试
linux版本:64位CentOS 6.5 Redis版本:redis-3.0.6 (更新到2016年1月22日) Redis官网:http://redis.io/ Redis常用命令:http:/ ...
- OpenCV下载安装与源码调试。
1.下载CMake(不编译源码可以直接跳过CMake相关说明):安装最新版本即可. 官网:https://cmake.org/download/ github:https://github.com/o ...
- linux卸载mysql和myodbc_linux下卸载mysql rpm安装方式和源码安装方式的两种方法
转自http://hi.baidu.com/myphpzone/blog/item/562e496f0dfbb1d680cb4a2d.html linux下MySQL卸载方法 一.源码安装的卸载方法: ...
- saltstack自动化运维一键部署rpm安装httpd和源码安装nginx
配置环境:rhel6.5 server1:172.25.254.1 master server2:172.25.254.2 minion server3:172.25.254.3 minion 一.安 ...
- ThingsBoard-Windows安装(包括zip方式和源码方式)
本篇文章主要讲解thingsboard入门安装,包括zip包安装和源码编译安装,记录了全过程遇到的坑,希望帮助大家成功闭坑 ThingsBoard hingsBoard是一个开源物联网平台,可实现物联 ...
- Qt 杂记 —— Qt安装并配置调试文件,添加源码调试pdb文件
文章目录 Qt 杂记 -- Qt安装并配置调试文件,添加源码调试pdb文件 一.安装QT及QTCreator 二.在VS中使用QT 个人格言 Qt 杂记 -- Qt安装并配置调试文件,添加源码调试pd ...
- 下载java免安装包_下载并获取免安装版的JDK、JRE和源码包
首先,我们需要去Oracle官网下载JDK的exe安装程序,下载页面:传送门,我下载的是截至目前为止最新的JDK 8u192.接下来就有两种方式获取免安装版的JDK.JRE和源码包,第一种方式不需要打 ...
- linux平台下rpm方式和源码包方式安装mysql5.7
博主QQ:819594300 博客地址:http://zpf666.blog.51cto.com/ 有什么疑问的朋友可以联系博主,博主会帮你们解答,谢谢支持! 一.下载mysql的rpm包 Mysql ...
- linux的RPM支持图片格式,Linux下rpm、yum和源码三种安装方式详细介绍
第1章 源码安装 源码包安装会比RPM包安装慢,是因为RPM的软件包是根据特定系统和平台而指定的,经常一种 程序会提供很多RPM包的格式,用户根据系统情况选择适合的RPM包直接安装,而源码包相当于 通 ...
最新文章
- OpenCV使用Laplacian filtering和距离变换以及Laplacian滤波对重叠对象进行分段的实例(附完整代码)
- [机器学习] XGB/LGB---自定义损失函数与评价函数
- 在原生js中的事件监听方法
- git 无法提交空目录
- 刷爆抖音,4万好评!这本 Python 3.6 的书又断货了...
- Redis深入之道:原理解析、场景使用以及视频解读
- vue.js笔记1.0
- Word中有些空行无法删除,我是这样解决的.............
- STM32学习——直接存储器访问(DMA)
- 电脑去除桌面图标小箭头
- [计算机网络]网络层
- 2020大二HTML5期末课业
- CentOS 6.5 安装使用iscsi-initiator
- 第一台计算机作文,精选电脑三年级作文6篇
- Linux项目开发—电子相册
- C# MD5 加密,解密
- 【无标题】拼多多商品详情API接口
- 计算机类学术论文一般结构及投稿相关知识
- 微信PC客户端无法发送图片,怎么解决?
- 2022-1-22 牛客C++项目 —— alarm 函数
热门文章
- jsp java乱码转换_Java Web 编码问题一:jsp的编码问题
- java栈 迷宫_利用栈实现迷宫的求解
- html设置右边界,CSS边界(margin)——CSS实验室
- 不停刷朋友圈的人_刷爆朋友圈的推拉门安装方式 90%的人从没见过
- SVD与PCA的区别
- LabVIEW图像增强算法(基础篇—5)
- Jupyter-ROS(机器人操作系统)
- TensorFlow(3)张量与变量
- Matlab实现直方图均衡化(基于自定义函数)
- 【实用快捷键】设置WebStorm中Show in Explorer(在资源管理器中打开)快捷键Alt+Shift+R(类似VSCode)