目的
主要是了解MemcachedClient4J实际性能,对下步优化提供依据
场景
采用跟spymecached对比测试,分别在大负荷的情况下,观察两者性能表现,主要观察指标有耗时和出错率。
测试环境
mecached服务器
数量:1
系统:centos 6.4
cpu:Intel(R) Core(TM) i3-2120 CPU @ 3.30GHz
内存:4G
mecached参数:内存512M
客户端
系统:centos 6.4
cpu:Intel(R) Core(TM) i3-2120 CPU @ 3.30GHz
内存:4G
jdk:1.6.0_38-b05
Netty : 3.7.0.Final 设置TCP_NODELAY为true io worker为cpus个数
测试结果
结论和分析
MemcahcedClient4J在同样的压力下表现比spymemcached较好,但差距不是很大,这也是我意料之中。memcachedClient4J所使用的netty框架是支持多线程worker,测试只有一个memcached节点,实际上所有读写处理还是由同一个worker线程处理,跟单线程nio的spymemcached基本处理同一个等级水平。但是netty对IO写都有一个小优化,通常的NIO写操作都是放入一个缓冲队列,等待reactor去写。在队列为空的情况下,netty都会直接调用channel.write,而非放入缓冲队列注册OP_WRITE,减少了线程切换和注册事件的开销。这个优化的前提是写的线程就是Reactor线程,否则如果是用户线程,用户线程的的中断会引起channel的关闭。spymecache代码非常复杂,每个节点要维护三个队列(inputQueue,writeQueue,readQueue),三个队列数据变化都要调用fixupOPS,这个方法主要是根据节点状态来注册读写事件,经常注册事件也是一笔不少开销。
来源:oschina
链接:https://my.oschina.net/u/866190/blog/171166