Redis的作者给出的性能数据是每秒200K的set和get。可是我测的结果总是在30K这个水平。到底哪里出了问题?
先说说自己的测试机器:
操作系统是solaris 10. 4个CPU,Intel3.4Ghz。8G的物理内存。Redis是最新版本2.2.11. 客户端是jedis,版本是2.0
客户端和redis运行在同一台机器上。
测试思路:
1.用ExecutorService起一个线程池(初始化的线程数是100)
new ThreadPoolExecutor(THREAD,THREAD,1000,TimeUnit.MILLISECONDS,queue);
2.new了一个JedisPool。这个pool我增加了maxActive=15
3.for循环向executor.submit(new JedisWriteJob())
4.executor.shutdown().
5.for(;;)判断executor.isTerminated()来决定是否所有的task都已经完成。然后计数,算tps。
6. JedisWriteJob的逻辑是:
for循环里面生成一个Jedis对象,然后调用Jedis.set()方法。
我在运行中发现,机器的总cpu的占用率已经接近100%。这个时候redis大概占用了20%多,我的测试客户端大概占用了60%多。
这个机器上装的是vmware。不是我独享的。这是不是一个问题?不知道。没有更好的机器了。
还是自己的测试思路有问题?
问题的根源在与不应该用for(;;) execute.isTerminated()方法来判断是否所有的task都已经完成。应该用下面这个方法:
executor.awaitTermination(Long.MAX_VALUE, TimeUnit.SECONDS);
这样机器的cpu占用率马上就下来了。
教训就是轮训害死人。