项目基本,成型关键还是性能有点上不去,这周首先完成了以下的几个工作:
1. 把clock算法添加进LRU替换算法中去,目前insert的话每秒操作能到15万,但是get有略微的提升,大约是14万左右。
2. 完成了分块hash的这个东西,具体的修改主要是在assoc.c,这个主要多加了以下几个字段:
这周首先完成了以下的几个工作:
typedef struct _stritem {
struct _stritem *next;
struct _stritem *prev;
struct _stritem *h_next; /* hash chain next */
rel_time_t time; /* least recent access */
rel_time_t exptime; /* expire time */
int nbytes; /* size of data */
unsigned short refcount;
uint8_t nsuffix; /* length of flags-and-length string */
uint8_t it_flags; /* ITEM_* above */
uint8_t slabs_clsid;/* which slab class we're in */
uint8_t nkey; /* key length, w/terminating null and padding */
uint8_t tag; /* tag, use different hash algorithm */
uint8_t part; /* part*/
/* this odd type prevents type-punning issues when we do
* the little shuffle to save space when not using CAS. */
union {
uint64_t cas;
char end;
} data[];
/* if it_flags & ITEM_CAS we have 8 bytes CAS */
/* then null-terminated key */
/* then " flags length\r\n" (no terminating null) */
/* then data with terminating \r\n (no terminating null; it's binary!) */
} item;
然后修改了item相关的代码,多变成多块的hash的过程。
这个版本是目前的master的版本,通过了测试的过程。然后这周主要是把LRU的替换算法变成clock置换,置换的原因的出发点还是减少锁的粒度,上面的那个优化已经是得try——lock不是主要的瓶颈了,但是get的效率还是上不来,初步分析下可能还是和锁有关系,所以目前继续优化,代码还是在code上。
周一晚update:
这个重新做了个更新,发现以前跑性能测试的问题了,以前memcached都是跑在工作站上的,24核工作站性能刚刚的,2个24核的同时测试插入操作都是12万,cpu居然吃不满,之前一只单机测试,看着cpu是满的,其实cpu压根没满,只是YCSB把cpu占满了,这次分开后测试发现之前测下来差不多主要是那边处理性能太高,最多只用6-8个核,换成一个普通pc就明显有优势了
2个48threads进行YCSB的测试,然后1个普通pc做memcached,这个性能的优化就明显上来了,原始的memcached再插入的时候单个只有5到6万,2个同时开就降到了3万左右,而且cpu也快占满,优化后的明显有所提升,单个在10万左右,而且同时还可以处理get请求,cpu大概只有一半的占用率,总算是达到性能优化的指标了。。。
不过有2个小问题,第一个是多路插入有时候会死锁,第二个是get的效率还是差不了太多都是20万左右,项目也快结束了,目前做完最后的2个优化,解决死锁问题,准备报告:)