memcached性能优化(六)

来源:互联网 发布:中创软件地址 编辑:程序博客网 时间:2024/05/21 21:02

这周工作主要是修改代码和调整bug了,目前的思路是放弃skiplist了,因为上周测试了一下基本不靠谱。。。插入效果一般但是读取效果更差,这一周主要采用以下的三个优化思路

1. 在item中添加一个为tag的标记位,这个的目的其实很简单就是优化查找的效率,当hash有冲突的时候,比较字符串的时候先比较tag,注意这个tag是采用不同的hash函数构成的,目的是减少长的字符串的比较做的这么一个设计

2. 将hash表分块,分成16个块,每个hash块自己维护自己的hash表和lru链表,这样做的目的其实就是减少了锁的粒度,能够在一定程度上提高并发空间,提高并发的性能。

3. 最后一个优化还没做完,是将LRU的链表做成循环的链表,当有元素插入的时候,首先检测能否分配,如果可以,分配内存直接插入,否则的话,采用clock算法进行替换,这么做的目的其实就是为了减少get的时候,将lru提到表头的问题,因为get的访问其实很频繁而insert其实相对较少,比例看facebook的一个调查大约是1:500,所以应当以优化get为主,删除还是简单的lazy操作,只标记而不替换,只有在插入的时候上锁,希望这样可以提高并发度。

这一周一直再改代码,昨天修改好的代码让我今天修改的bug了,一直是segment fault,折腾一天了,这周的总结就这些了。。。我还是赶紧fix bug去。。。下周的话应当可以完成相应的工作。预计性能肯定是有所提升的,希望能够达到要求。

周一更新:

分块的这个hash的优化目前原始的处理是10万次insert每秒,而我的优化是13万次每秒,get的话两个差不多,主要还是和workthread的数目相关,workthread越多我这边的优化比较明显,在workthread为20的情况下两个处理能力都是11万,但是我把workthread加大之后原始的处理能力稍微下降,而我的则有点上升,所以今天继续优化,这周把clock置换算法添加进去,估计能把get优化下,然后继续测试吧,看看workthread的上限大概是个多少,看看insert的处理能优化到什么程度吧。

0 0
原创粉丝点击