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

[经验分享] Memcached源码阅读之初始化参数解析

[复制链接]

尚未签到

发表于 2015-11-19 07:32:17 | 显示全部楼层 |阅读模式
  Memcached启动时,有很多配置参数可以选择,这些配置参数严重影响着Memcached的使用,下面分析下这些参数的意义,开源软件版本之间差异比较大,我这次分析是基于1.4.15进行分析的,大家学习时记得核对版本。
  

"a:" //unix socket的权限位信息,unix socket的权限位信息和普通文件的权限位信息一样
"p:" //memcached监听的TCP端口值,默认是11211
"s:" //unix socket监听的socket文件路径
"U:" //memcached监听的UDP端口值,默认是11211
"m:" //memcached使用的最大内存值,默认是64M
"M"  //当memcached的内存使用完时,不进行LRU淘汰数据,直接返回错误,该选项就是关闭LRU
"c:" //memcached的最大连接数,如果不指定,按系统的最大值进行
"k"  //是否锁定memcached所持有的内存,如果锁定了内存,其他业务持有的内存就会减小
"hi" //帮助信息
"r"  //core文件的大小,如果不指定,按系统的最大值进行
"v"  //调试信息
"d"  //设定以daemon方式运行
"l:" //绑定的ip信息,如果服务器有多个ip,可以在多个ip上面启动多个Memcached实例,注意:这个不是可接收的IP地址
"u:" //memcached运行的用户,如果以root启动,需要指定用户,否则程序错误,退出。
"P:" //memcached以daemon方式运行时,保存pid的文件路径信息
"f:" //内存的扩容因子,这个关系到Memcached内部初始化空间时的一个变化,后面详细说明
"n:" //chunk的最小大小(byte),后续的增长都是该值*factor来进行增长的
"t:" //内部worker线程的个数,默认是4个,最大值推荐不超过64个
"D:" //内部数据存储时的分割符
"L"  //指定内存页的大小,默认内存页大小为4K,页最大不超过2M,调大页的大小,可有效减小页表的大小,提高内存访问的效率
"R:" //单个worker的最大请求个数
"C"  //禁用业务的cas,即compare and set
"b:" //listen操作缓存连接个数
"B:" //memcached内部使用的协议,支持二进制协议和文本协议,早期只有文本协议,二进制协议是后续加上的
"I:" //单个item的最大值,默认是1M,可以修改,修改的最小值为1k,最大值不能超过128M
"S"  //打开sasl安全协议
"o:" //有四个参数项可以设置:
maxconns_fast(如果连接数超过最大连接数,立即关闭新的连接)
hashpower(hash表的大小的指数值,是按1<<hashpower来创建hash表的,默认的hashpower为16,配置值建议不超过64)
slab_reassign(是否调整/平衡各个slab所占的内存)
slab_automove(是否自动移动各个slab,如果该选项打开,会有专门的线程来进行slab的调整)

  Memcached内部是通过settings来抽象上面的这些初始化参数。
  

struct settings {
size_t maxbytes;
int maxconns;
int port;
int udpport;
char *inter;
int verbose;
rel_time_t oldest_live; /* ignore existing items older than this */
int evict_to_free;
char *socketpath;   /* path to unix socket if using local socket */
int access;  /* access mask (a la chmod) for unix domain socket */
double factor;          /* chunk size growth factor */
int chunk_size;
int num_threads;        /* number of worker (without dispatcher) libevent threads to run */
int num_threads_per_udp; /* number of worker threads serving each udp socket */
char prefix_delimiter;  /* character that marks a key prefix (for stats) */
int detail_enabled;     /* nonzero if we're collecting detailed stats */
int reqs_per_event;     /* Maximum number of io to process on each
io-event. */
bool use_cas;
enum protocol binding_protocol;
int backlog;
int item_size_max;        /* Maximum item size, and upper end for slabs */
bool sasl;              /* SASL on/off */
bool maxconns_fast;     /* Whether or not to early close connections */
bool slab_reassign;     /* Whether or not slab reassignment is allowed */
int slab_automove;     /* Whether or not to automatically move slabs */
int hashpower_init;     /* Starting hash power level */
};

  
  改结构的初始化:
  

static void settings_init(void)
{
settings.use_cas = true;
settings.access = 0700;
settings.port = 11211;
settings.udpport = 11211;
/* By default this string should be NULL for getaddrinfo() */
settings.inter = NULL;
settings.maxbytes = 64 * 1024 * 1024; /* default is 64MB */
settings.maxconns = 1024; /* to limit connections-related memory to about 5MB */
settings.verbose = 0;
settings.oldest_live = 0;
settings.evict_to_free = 1; /* push old items out of cache when memory runs out */
settings.socketpath = NULL; /* by default, not using a unix socket */
settings.factor = 1.25;
settings.chunk_size = 48; /* space for a modest key and value */
settings.num_threads = 4; /* N workers */
settings.num_threads_per_udp = 0;
settings.prefix_delimiter = ':';
settings.detail_enabled = 0;
settings.reqs_per_event = 20;
settings.backlog = 1024;
settings.binding_protocol = negotiating_prot;
settings.item_size_max = 1024 * 1024; /* The famous 1MB upper limit. */
settings.maxconns_fast = false;
settings.hashpower_init = 0;
settings.slab_reassign = false;
settings.slab_automove = 0;
}这些&#20540;都是一些默认&#20540;,后续按启动时所指定的进行修改,比如对监听端口号的修改:  
  

        case 'a'://修改unix socket的权限位信息
settings.access = strtol(optarg, NULL, 8);
break;
case 'U'://udp端口信息
settings.udpport = atoi(optarg);
udp_specified = true;
break;
case 'p'://tcp端口信息
settings.port = atoi(optarg);
tcp_specified = true;
break;


  

版权声明:本文为博主原创文章,未经博主允许不得转载。

运维网声明 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-140861-1-1.html 上篇帖子: Memcached Client简要介绍 下篇帖子: memCached 客户端
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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