memcached源码分析-----memcached启动参数详解以及关键配置的默认值

转载请注明出处: http://blog.csdn.net/luotuo44/article/details/42672913

本文开启本系列博文的代码分析。本系列博文研究是memcached版本是1.4.21。

本文将给出memcached启动时各个参数的详细解释以及一些关键配置的默认值。以便在分析memcached源码的时候好随时查看。当然也方便使用memcached时可以随时查看各个参数的含义。《如何阅读memcached源码》说到memcached有很多全局变量(也就是关键配置),这些全局变量会给源码分析带来一定的困扰。一个好的处理方法是假设这些全局变量(关键配置)取默认值,并且其值不会改变。

关键配置的默认值:

很多关键配置变量都是全局结构体变量settings的成员变量。函数settings_init会将这些关键配置变量赋默认值。下面就把这些变量列出来并给予解释。

static void settings_init(void) {
	//开启CAS业务,如果开启了那么在item里面就会多一个用于CAS的字段。可以在启动memcached的时候通过-C选项禁用
    settings.use_cas = true;

    settings.access = 0700; //unix socket的权限位信息
    settings.port = 11211;//memcached监听的tcp端口
    settings.udpport = 11211;//memcached监听的udp端口
	//memcached绑定的ip地址。如果该值为NULL,那么就是INADDR_ANY。否则该值指向一个ip字符串
    settings.inter = NULL;

    settings.maxbytes = 64 * 1024 * 1024; //memcached能够使用的最大内存
    settings.maxconns = 1024; //最多允许多少个客户端同时在线。不同于settings.backlog

	settings.verbose = 0;//运行信息的输出级别.该值越大输出的信息就越详细
    settings.oldest_live = 0; //flush_all命令的时间界限。插入时间小于这个时间的item删除。
    settings.evict_to_free = 1;  //标记memcached是否允许LRU淘汰机制。默认是可以的。可以通过-M选项禁止
    settings.socketpath = NULL;//unix socket监听的socket路径.默认不使用unix socket
    settings.factor = 1.25; //item的扩容因子
    settings.chunk_size = 48; //最小的一个item能存储多少字节的数据(set、add命令中的数据)
    settings.num_threads = 4; //worker线程的个数
	 //多少个worker线程为一个udp socket服务 number of worker threads serving each udp socket
    settings.num_threads_per_udp = 0;

    settings.prefix_delimiter = ':'; //分隔符
    settings.detail_enabled = 0;//是否自动收集状态信息

	//worker线程连续为某个客户端执行命令的最大命令数。这主要是为了防止一个客户端霸占整个worker线程
	//,而该worker线程的其他客户端的命令无法得到处理
    settings.reqs_per_event = 20;

	settings.backlog = 1024;//listen函数的第二个参数,不同于settings.maxconns
	//用户命令的协议,有文件和二进制两种。negotiating_prot是协商,自动根据命令内容判断
    settings.binding_protocol = negotiating_prot;
    settings.item_size_max = 1024 * 1024;//slab内存页的大小。单位是字节
    settings.maxconns_fast = false;//如果连接数超过了最大同时在线数(由-c选项指定),是否立即关闭新连接上的客户端。

	//用于指明memcached是否启动了LRU爬虫线程。默认值为false,不启动LRU爬虫线程。
	//可以在启动memcached时通过-o lru_crawler将变量的值赋值为true,启动LRU爬虫线程
    settings.lru_crawler = false;
    settings.lru_crawler_sleep = 100;//LRU爬虫线程工作时的休眠间隔。单位为微秒
    settings.lru_crawler_tocrawl = 0; //LRU爬虫检查每条LRU队列中的多少个item,如果想让LRU爬虫工作必须修改这个值

	//哈希表的长度是2^n。这个值就是n的初始值。可以在启动memcached的时候通过-o hashpower_init
	//设置。设置的值要在[12, 64]之间。如果不设置,该值为0。哈希表的幂将取默认值16
    settings.hashpower_init = 0;  /* Starting hash power level */

    settings.slab_reassign = false;//是否开启调节不同类型item所占的内存数。可以通过 -o slab_reassign选项开启
    settings.slab_automove = 0;//自动检测是否需要进行不同类型item的内存调整,依赖于settings.slab_reassign的开启

    settings.shutdown_command = false;//是否支持客户端的关闭命令,该命令会关闭memcached进程

	//用于修复item的引用数。如果一个worker线程引用了某个item,还没来得及解除引用这个线程就挂了
	//那么这个item就永远被这个已死的线程所引用而不能释放。memcached用这个值来检测是否出现这种
	//情况。因为这种情况很少发生,所以该变量的默认值为0(即不进行检测)。
	//在启动memcached时,通过-o tail_repair_time xxx设置。设置的值要大于10(单位为秒)
	//TAIL_REPAIR_TIME_DEFAULT 等于 0。
    settings.tail_repair_time = TAIL_REPAIR_TIME_DEFAULT;
    settings.flush_enabled = true;//是否运行客户端使用flush_all命令
}

当然这个函数并没有给settings的所有成员变量都赋值,剩下的那些成员变量不那么重要。

命令行参数详解:

memcached是使用getopt和getsubopt解析命令行参数的,下面给出的这些命令行选项与这两个解析函数有关:凡是选项后面有冒号的就表示这个选项必须要有一个参数;没有冒号的就没有参数;memcached没有使用双冒号的选项。关于getopt和getsubopt的具体使用可以参考《getopt和getsubopt命令行解析函数》。

  • "A"     是否运行客户端使用shutdown命令。默认是不允许的。该选项将允许。客户端的shutdown命令会将memcached进程杀死。该选项会将settings.shutdown_command赋值为false
  • "a:"    unix socket的权限位信息(访问掩码)。该选项的参数赋值给settings.access
  • "U:"   大写U。memcached监听的UDP端口值,默认端口为11211。该选项的参数赋值给settings.udpport
  • "p:"   小写p,memcached监听的tcp端口。默认端口为11211, 该选项的参数赋值给settings.port
  • "s:"   小写S。unix socket监听的socket路径。该选项的参数赋值给settings.socketpath
  • "m:"  小写m。memcached能够使用的最大内存值,默认是64MB。参数单位为MB。该参数赋值给settings.maxbytes
  • "M"   大写M。默认情况下,当memcached的内存使用完后,将进行LRU机制淘汰item以腾出空间。如果使用本选项那么将关闭LRU功能。当然关闭LRU不代表不能存储新数据。如果memcached里面存有过期失效的item,那么就可以存储新数据。否则将无法存储。该选项将settings.evict_to_free赋值为0。
  • "c:"   小写c。最多允许多少个客户端同时在线(这个值不等价于listen函数的第二个参数),该选项和后面的b选项有所不同。 默认值为1024个。该选项参数赋值给settings.maxconns。
  • "h"    显示帮助信息
  • "i"     显示memcached和libevent的版权信息
  • "k"    小写k。将memcached使用到的内存锁定在内存中,不准OS把memcached的内存移动到虚拟内存。因为当OS把memcached的内存移动到虚拟内存可能会导致页错误,降低memcached的响应时间
  • "v"    小写v。输出memcached运行时的一些信息。-v -vv -vvv输出的信息依次增加。该选项会增加settings.verbose的值
  • "l:"    memcached绑定的ip地址。如果不设置这个选项,那么memcached将使用INADDR_ANY。如果想指定多个IP地址,那么该选项的参数可以由多个ip组成,ip之间用逗号分隔。也可以多次使用这个选项,此时端口应该尾随ip而不是单独用-p选项指定。例如-l 127.0.0.1:8888,192.168.1.112:9999 或者 -l 127.0.0.1:8888 -l 192.168.1.112:9999该选项参数将赋值给settings.inter
  • "d"    以守护进程的形式运行memcached
  • "r"     将core文件大小设置为不受限制
  • "R:"  worker线程连续为某个客户端执行命令的最大命令数。该选项的参数赋值给settings.reqs_per_event
  • "u:"  小写u。当以root用户启动memcached的时候需要指定memcached的所属用户,其他用户启动memcached不需要此选项
  • "P:"  大写p。该选项的参数指明memcached的pid保存文件。要和-d选项配合使用。注意运行的用户是否有权限写对应的文件
  • "f:"    item的扩容因子。默认值为1.25。该选项的参数值可以是小数但必须大于1.0。该选项参数将赋值给settings.factor
  • "n:"   设置最小的item能存储多少字节的数据。该选项参数赋值给settings.chunk_size
  • "t:"    该选项的参数用于指定worker线程的个数,不建议超过64个。如果不设置该选项默认有4个线程。该参数会赋值给settings.num_threads
  • "D:"  参数字符作为前缀和ID的分隔符。使用了该选项才会自动收集状态信息。也可以在启动memcached后,客户端使用stats detail on命令开启,此时默认的分隔符为冒号":"。该选项参数会赋值为settings.prefix_delimiter,并将settings.detail_enabled赋值为1
  • "L"    如果OS允许的话,那么向OS申请更大的内存页。OS的默认内存页为4KB。大的内存页可以有效降低页表的大小,提高效率。此选项会使得memcached预先先OS全部所需的申请内存。当然这些内存尽量是用大内存页分配的
  • "C:"  大写C。memcached默认是使用CAS的,本选项是禁用CAS。本选项会将settings.use_cas赋值为false
  • "b:"   listen函数的第二个参数。该选项的参数赋值给settings.backlog。如果不设置该选项,那么默认为1024。该选项和前面的c选项有所不同
  • "B:"  memcached支持文本协议和二进制协议。该选项的参数用于指定使用的协议。默认情况下是根据客户端的命令而自动判断(也叫协商),参数只能取auto、binary、ascii这三个字符串值。将参数将赋值给settings.binding_protocol
  • "I:"   slab分配器中,每一个页的大小。这个选项的参数是一个数值表示页的大小。默认单位是B也可以在数值后面带K或者M(大小写都行),表示KB和MB。页的大小小于1KB或者大于128MB都是不允许的。不推荐使用该选项。本选项参数会赋值给settings.item_size_max
  • "S"   大写S。打开sasl安全协议。会将settings.sasl赋值为true
  • "F"   禁止客户端的flush_all命令。默认是允许客户端的flush_all命令的。该选项将settings.flush_enabled赋值为false
  • "o:"  有下面几个子选项可以设置。这个选项是用来优化的
  • maxconns_fast:   如果连接数超过了最大同时在线数(由-c选项指定),立即关闭新连接上的客户端。该选项将settings.maxconns_fast赋值为true
  • hashpower:   哈希表的长度是2^n。可以通过选项hashpower设置指数n的初始值。如果不设置将取默认值16。该选项必须有参数,参数取值范围只能为[12, 64]。本选项参数值赋值给settings.hashpower_init
  • slab_reassign:   该选项没有参数。用于调节不同类型的item所占的内存。不同类型是指大小不同。某一类item已经很少使用了,但仍占用着内存。可以通过开启slab_reassign调度内存,减少这一类item的内存。如果使用了本选项,settings.slab_reassign赋值为true
  • slab_automove:   依赖于slab_reassign。用于主动检测是否需要进行内存调度。该选项的参数是可选的。参数的取值范围只能为0、1、2。参数2是不建议的。本选项参数赋值给settings.slab_automove。如果本选项没有参数,那么settings.slab_automove赋值为1
  • hash_algorithm:   用于指定哈希算法。该选项必须带有参数。并且参数只能是字符串jenkins或者murmur3
  • tail_repair_time:   用于检测是否有item被已死线程所引用。一般不会出现这种情况,所以默认不开启这种检测。如果需要开启这种检测,那么需要使用本选项。本选项需要一个参数,参数值必须不小于10。该参数赋值给settings.tail_repair_time
  • lru_crawler:   本选项用于启动LRU爬虫线程。该选项不需要参数。本选项会导致settings.lru_crawler赋值为true
  • lru_crawler_sleep:  LRU爬虫线程工作时的休眠间隔。本选项需要一个参数作为休眠时间,单位为微秒,取值范围是[0, 1000000]。该参数赋值给settings.lru_crawler_sleep
  • lru_crawler_tocrawl:   LRU爬虫检查每条LRU队列中的多少个item。该选项带有一个参数。参数会赋值给settings.lru_crawler_tocrawl
时间: 2024-10-10 14:19:39

memcached源码分析-----memcached启动参数详解以及关键配置的默认值的相关文章

android源码分析 android toast使用详解 toast自定义

在安卓开发过程中,toast使我们经常使用的一个类,当我们需要向用户传达一些信息,但是不需要和用户交互时,该方式就是一种十分恰当的途径. 我们习惯了这样使用toast:Toast.makeText(Context context, String info, int duration).show();该方法是 系统为我们提供的一个方便的创建toast对象的静态方法,其内部依然是调用toast的相关方法完成.下面 就从其源码对该类的实现做一个分析 在toast类中,最重要的用于显示该toast的sh

MapReduce阶段源码分析以及shuffle过程详解

MapReducer工作流程图: 1. MapReduce阶段源码分析 1)客户端提交源码分析 解释:   - 判断是否打印日志   - 判断是否使用新的API,检查连接   - 在检查连接时,检查输入输出路径,计算切片,将jar.配置文件复制到HDFS   - 计算切片时,计算最小切片数(默认为1,可自定义)和最大切片数(默认是long的最大值,可以自定义)   - 查看给定的是否是文件,如果是否目录计算目录下所有文件的切片   - 通过block大小和最小切片数.最大切片数计算出切片大小  

Vue.js 源码分析(十) ref属性详解

用法 ref 被用来给元素或子组件注册引用信息.引用信息将会注册在父组件的 $refs 对象上.如果在普通的 DOM 元素上使用,引用指向的就是 DOM 元素:如果用在子组件上,引用就指向组件实例,例如: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> <scrip

Laravel源码分析--Laravel生命周期详解

一.XDEBUG调试 这里我们需要用到php的 xdebug 拓展,所以需要小伙伴们自己去装一下,因为我这里用的是docker,所以就简单介绍下在docker中使用xdebug的注意点. 1.在phpstorm中的 Perferences >> Languages & Framework >> PHP >> debug >> DBGp Proxy 中的Host填写的是宿主机的IP地址.可以在命令行中使用ifconfig / ipconfig查看你的本

spring源码分析之spring-jms模块详解

0 概述 spring提供了一个jms集成框架,这个框架如spring 集成jdbc api一样,简化了jms api的使用. jms可以简单的分成两个功能区,消息的生产和消息的消费.JmsTemplate类用来生成消息和同步接受消息.和其它java ee的消息驱动样式一样,对异步消息,spring也提供了许多消息监听容器用来创建消息驱动的POJO(MDPs).spring同时也提供了创建消息监听器的声明方式. org.springframework.jms.core 提供了使用JMS的核心功能

spring源码分析之spring-jdbc模块详解

0 概述 Spring将替我们完成所有使用JDBC API进行开发的单调乏味的.底层细节处理工作.下表描述了哪些是spring帮助我们做好的,哪些是我们要做的. Action  Spring  You Define connection parameters.    X Open the connection.  X   Specify the SQL statement.    X Declare parameters and provide parameter values   X Prep

spring源码分析之spring-messaging模块详解

0 概述 spring-messaging模块为集成messaging api和消息协议提供支持. 其代码结构为: 其中base定义了消息Message(MessageHeader和body).消息处理MessageHandler.发送消息MessageChannel. 1. base模块 其结构如下所示: 其中: message由两部分组成, MessageHandler是一个处理消息的约定,spring messaging提供了丰富的消息处理方式. MessageChannel表现为pipe

spring源码分析之spring-web http详解

spring-web是spring webmvc的基础,它的功能如下: 1. 封装http协议中client端/server端的request请求和response响应及格式的转换,如json,rss,xml等. 2. 远程调用包括jaxws.caucho.httpinvoker 3. web相关的accept/bind/client/context/filter/jsf/method/multipart 先从http协议中的封装来看: 先了解一下http的基础:(来自:http://blog.

Hadoop1.x源码分析一:Configuration 详解

1.Hadoop配置文件的形式 Hadoop的配置文件是以XML的形式,跟元素是configuration,一般只包含子元素property.每一个property元素就是一个配置项,配置文件不支持分层或分级.每个配置项一般包括配置属性的名称name.值value和一个关于配置项的描述description;元素final和java中的关键字final类似,意味着这个配置项是"固定不变的".final一般不出现,但在合并资源的时候,可以防止配置项的值被覆盖. 在Configuratio