Idea 的提出
- Redis 有其高效的异步网络框架
- Memcached 有其高效的内存管理机制
将这两者结合在一起后,会如何呢?
本篇博客的姊妹篇链接: 《工程师手记-将Memcached内存管理机制移植至Redis》
调研和选型
Memcached 的几个缺点:
- 使用封装较多的 libevent 异步库
- Memcached 1.2.2 版本后,开始使用多线程,而多线程上下文切换、互斥锁的竞争带来了一定的性能开销
- 每次新建tcp 连接都进行系统调用(malloc)申请空间
对Memcached 的一项性能测试
实验验证,多线程不会对Memcached带来性能的提高
参考链接:
软件选型
- 从 Redis 3.2.0 (截止此文最新稳定版) 版本中选择 libae、 libanet (ae.h、ae.c、anet.h、anet.c 四个文件)
- 选择 Memcached 1.2.0 作为移植受体
选取这两个版本的主要原因是,作为Redis 和 memcached 的早期版本,特性较少,代码复杂度低,适合进行初步实验移植。
为什么不直接使用epoll呢? 因为除了异步框架之外,还需要定时器的功能,而redis的异步库中已经有现成的实现。
代码托管地址
给新的memcached起了一个新名字ae-memcached,源代码托管于Github上:
https://github.com/zuocheng-liu/ae-memcached
性能测试实验
硬件
- Memcached 服务端 GenuineIntel 6 Common KVM processor 6 核 2.0GHZ 4G 内存
- Memcache 客户端 和服务端相同的另外一台服务器
测试方法
- 分别运行Memcached 和 ae-memcached, 参数为 memcached -m 1024M -t 6 , 其中原本memcached运行6个线程,而ae-memcached 是单线程
- 使用memslap 1.0.2, 测试10W次请求,100的并发度的情况下,memcached的处理时间
- 测试命令 ./memslap –servers=test-server:11211 –concurrency=100 –execute-number=1000 –tcp-nodelay –non-blocking
测试结果
- ae-memcached 6.709 / 6.878 / 7.362 / 7.196 (seconds) 平均7秒
- 原版 memcached 5.079 / 5.043 / 5.069 / 5.206 (seconds) 平均5秒多
结论
原版Memcache 处理10W条数据的时间要比 ae-memcached少很多。多线程的确会给Memcached带来性能的提升.我们前面的假想并不正确。
对 Memcached 的持续优化
本文作者不仅只把Redis的异步库移植至Memcached,还对Memcached进行了持续的优化,详细请阅下面链接:
继续关注
谢谢关注! [可爱]
谢谢关注!? [可爱]
大神,
谢谢关注,嘿嘿,多提建议啊
Pingback引用通告: 工程师手记-将Memcached内存管理机制移植至Redis | 作程的技术博客