Guide for memcached source code - LianWaiYuChanChan/java-memcached GitHub Wiki

其他人的源码分析资料

目录结构

  • scripts : 一些有用的脚本
  • t: 测试脚本
  • devtools: 脚本
  • m4: ?

代码量分布

memached.c, slabs.c, items.c 是大头

c4dev@sles12-zhangj52-dev:/c4_working/github/memcached> find *.c | xargs -n 1 -I {} xargs wc -l {}| sort -k 1 -n
21 hash.c
26 globals.c
29 sizes.c
44 solaris_priv.c
89 daemon.c
102 timedrun.c
124 murmur3_hash.c
149 itoa_ljust.c
155 cache.c
180 bipbuffer.c
190 sasl_defs.c
196 util.c
306 assoc.c
375 stats.c
431 jenkins_hash.c
636 crawler.c
751 logger.c
763 thread.c
1220 slabs.c
1580 items.c
2025 testapp.c
6643 memcached.c

memcached.h/memached.c

Some critical call stacks:

  • event_handler -> driver_machine -> try_read_command -> process_command.
  • process_get_command -> item_get(计算了Hash值) -> do_item_get -> assoc_find

内存组织结构

slabclass -> 1:n -> slab(page:default 1MB) -> chunks (<=1MB). 代码中slabclass_t结构体的perslab指的是一个slab或者page中,有多少个chunk. Chunk里面存的数据,逻辑上讲,就是Item: Key+元数据+Value(数据).

默认设置

memcached.c: settings_init.

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.oldest_cas = 0;          /* supplements accuracy of oldest_live */
    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.slab_page_size = 1024 * 1024; /* chunks are split from 1MB pages. */
    settings.slab_chunk_size_max = settings.slab_page_size;
    settings.sasl = false;
    settings.maxconns_fast = false;
    settings.lru_crawler = false;
    settings.lru_crawler_sleep = 100;
    settings.lru_crawler_tocrawl = 0;
    settings.lru_maintainer_thread = false;
    settings.lru_segmented = false;
    settings.hot_lru_pct = 32;
    settings.warm_lru_pct = 32;
    settings.hot_max_age = 3600;
    settings.warm_max_factor = 2.0;
    settings.inline_ascii_response = true;
    settings.temp_lru = false;
    settings.temporary_ttl = 61;
    settings.idle_timeout = 0; /* disabled */
    settings.hashpower_init = 0;
    settings.slab_reassign = false;
    settings.slab_automove = 0;
    settings.shutdown_command = false;
    settings.tail_repair_time = TAIL_REPAIR_TIME_DEFAULT;
    settings.flush_enabled = true;
    settings.dump_enabled = true;
    settings.crawls_persleep = 1000;
    settings.logger_watcher_buf_size = LOGGER_WATCHER_BUF_SIZE;
    settings.logger_buf_size = LOGGER_BUF_SIZE;
}

每个文件的基本介绍

  • trace.h: 好像是为debug用的,对里面宏的调用,我认为是可以忽略掉的,不影响任何代码行为。

看懂memcached的必备知识

官方资料