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佔用率立刻就下來了。
教訓就是輪訓害死人。