Guide for memcached source code - LianWaiYuChanChan/java-memcached GitHub Wiki
其他人的源码分析资料
- https://github.com/Mudenng/inside-memcached
- http://files.cppblog.com/xguru/Memcached.pdf
- http://www.programering.com/a/MzM3MjMwATU.html
- http://prog3.com/sbdm/blog/initphp/article/category/3107757
- http://www.programering.com/a/MjM1gjMwATM.html
目录结构
- 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用的,对里面宏的调用,我认为是可以忽略掉的,不影响任何代码行为。