Redis的做者给出的性能数据是每秒200K的set和get。但是我测的结果老是在30K这个水平。到底哪里出了问题?redis
先说说本身的测试机器:性能
操做系统是solaris 10. 4个CPU,Intel3.4Ghz。8G的物理内存。Redis是最新版本2.2.11. 客户端是jedis,版本是2.0测试
客户端和redis运行在同一台机器上。spa
测试思路:操作系统
1.用ExecutorService起一个线程池(初始化的线程数是100)线程
new ThreadPoolExecutor(THREAD,THREAD,1000,TimeUnit.MILLISECONDS,queue);对象
2.new了一个JedisPool。这个pool我增长了maxActive=15内存
3.for循环向executor.submit(new JedisWriteJob())get
4.executor.shutdown().it
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占用率立刻就下来了。
教训就是轮训害死人。