Memcached源码阅读之初始化参数解析

Memcached启动时,有很多配置参数可以选择,这些配置参数严重影响着Memcached的使用,下面分析下这些参数的意义,开源软件版本之间差异比较大,我这次分析是基于1.4.15进行分析的,大家学习时记得核对版本。

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

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

[cpp]  view plain copy
  1. struct settings {  
  2.     size_t maxbytes;  
  3.     int maxconns;  
  4.     int port;  
  5.     int udpport;  
  6.     char *inter;  
  7.     int verbose;  
  8.     rel_time_t oldest_live; /* ignore existing items older than this */  
  9.     int evict_to_free;  
  10.     char *socketpath;   /* path to unix socket if using local socket */  
  11.     int access;  /* access mask (a la chmod) for unix domain socket */  
  12.     double factor;          /* chunk size growth factor */  
  13.     int chunk_size;  
  14.     int num_threads;        /* number of worker (without dispatcher) libevent threads to run */  
  15.     int num_threads_per_udp; /* number of worker threads serving each udp socket */  
  16.     char prefix_delimiter;  /* character that marks a key prefix (for stats) */  
  17.     int detail_enabled;     /* nonzero if we're collecting detailed stats */  
  18.     int reqs_per_event;     /* Maximum number of io to process on each 
  19.                                io-event. */  
  20.     bool use_cas;  
  21.     enum protocol binding_protocol;  
  22.     int backlog;  
  23.     int item_size_max;        /* Maximum item size, and upper end for slabs */  
  24.     bool sasl;              /* SASL on/off */  
  25.     bool maxconns_fast;     /* Whether or not to early close connections */  
  26.     bool slab_reassign;     /* Whether or not slab reassignment is allowed */  
  27.     int slab_automove;     /* Whether or not to automatically move slabs */  
  28.     int hashpower_init;     /* Starting hash power level */  
  29. };  

改结构的初始化:

[cpp]  view plain copy
  1. static void settings_init(void)  
  2. {  
  3.     settings.use_cas = true;  
  4.     settings.access = 0700;  
  5.     settings.port = 11211;  
  6.     settings.udpport = 11211;  
  7.     /* By default this string should be NULL for getaddrinfo() */  
  8.     settings.inter = NULL;  
  9.     settings.maxbytes = 64 * 1024 * 1024; /* default is 64MB */  
  10.     settings.maxconns = 1024; /* to limit connections-related memory to about 5MB */  
  11.     settings.verbose = 0;  
  12.     settings.oldest_live = 0;  
  13.     settings.evict_to_free = 1; /* push old items out of cache when memory runs out */  
  14.     settings.socketpath = NULL; /* by default, not using a unix socket */  
  15.     settings.factor = 1.25;  
  16.     settings.chunk_size = 48; /* space for a modest key and value */  
  17.     settings.num_threads = 4; /* N workers */  
  18.     settings.num_threads_per_udp = 0;  
  19.     settings.prefix_delimiter = ':';  
  20.     settings.detail_enabled = 0;  
  21.     settings.reqs_per_event = 20;  
  22.     settings.backlog = 1024;  
  23.     settings.binding_protocol = negotiating_prot;  
  24.     settings.item_size_max = 1024 * 1024; /* The famous 1MB upper limit. */  
  25.     settings.maxconns_fast = false;  
  26.     settings.hashpower_init = 0;  
  27.     settings.slab_reassign = false;  
  28.     settings.slab_automove = 0;  
  29. }  
这些值都是一些默认值,后续按启动时所指定的进行修改,比如对监听端口号的修改:

[cpp]  view plain copy
  1.         case 'a'://修改unix socket的权限位信息  
  2.         settings.access = strtol(optarg, NULL, 8);  
  3.         break;  
  4.     case 'U'://udp端口信息  
  5.         settings.udpport = atoi(optarg);  
  6.         udp_specified = true;  
  7.         break;  
  8.     case 'p'://tcp端口信息  
  9.         settings.port = atoi(optarg);  
  10.         tcp_specified = true;  
  11.         break;  

你可能感兴趣的:(Memcached源码阅读之初始化参数解析)