InnoDB memcached插件 vs 原生memcached對比性能測試
轉載自:http://imysql.cn/2013/08/15/innodb-memcached-vs-native-memcached-benchmark.shtml
MySQL 5.6開始支持InnoDB memcached插件,也就是可以通過SQL高效讀寫memcached裏的緩存內容,也支持用原生的memcache協議讀寫,並且可以實現緩存數據 持久化,以及crash recovery、mysql replication、觸發器、存儲過程等衆多特性,詳細介紹可以查看:Benefits of the InnoDB / memcached Combination。看起來非常誘人,那就測試下看看吧,是驢子是馬拉出來溜溜便知。
環境準備
測試機 | DELL PE R710 |
CPU | E5620 @ 2.40GHz(4 core, 8 threads, L3 Cache 12 MB) * 2 |
內存 | 48G(8G * 6) |
RAID卡 | PERC H700 Integrated, 512MB, BBU, 12.10.1-0001 |
系統 | Red Hat Enterprise Linux Server release 6.4 (Santiago) |
內核 | 2.6.32-358.el6.x86_64 #1 SMP |
raid級別 | raid 5(10K RPM SAS 300G * 6) |
文件系統 | xfs |
硬盤 | 10K RPM SAS 300G * 6, 1 hotspare |
測試方案
方案一 | server端運行InnoDB MC,本地/遠程調用memslap執行benchmark |
方案二 | server端運行Native MC,本地/遠程調用memslap執行benchmark |
測試腳本
cat memslap_run.sh
#!/bin/sh . ~/.bash_profile > /dev/null 2>&1 cd /home/mc-bench exec 3>&1 4>&2 1>> memcache_memslap_${RANDOM}.log 2>&1 #不斷循環 while [ 1 ] do #併發線程數 4 ~ 256 for THREAD in 4 8 16 32 64 128 256 do #每種併發測試5次 count=1 max=5 while [ $count -le ${max} ] do #取樣 echo "memstat" memstat # --flush 每次測試完畢錢,都先清空數據 # --binary 採用binary模式 # 初始化數據: 5000000, 每個併發線程存取數據量: 100000 # 併發256線程時, 總數據量可達 30,600,000 # 未指定 --test 選項,默認是進行 set 測試 memslap --server=mc_server:11211 --concurrency=${THREAD} --execute-number=100000 --initial-load=5000000 --flush --binary count=`expr ${count} + 1` #每次測試完畢後,都休息2分鐘,等待服務器恢復空負載 if [ ${count} -lt ${max} ] ; then sleep 120 fi echo "" echo "" done done done
測試結果
1. 寫MC
線程數 | 256 | 128 | 64 | 32 | 16 | 8 | 4 |
NativeMC(單位:1秒) | 104.315 | 47.646 | 24.486 | 12.162 | 6.351 | 5.525 | 5.078 |
InnoDBMC(單位:100秒) | 339.1431 | 68.11128 | 27.67265 | 11.26917 | 4.968556 | 2.24988 | 1.104334 |
直接以曲線圖方式對比:
nativemc-vs-innodbmc-benchmark-02-set-result-20130828
2. 讀MC
線程數 | 4線程併發,2千萬記錄 |
本地Native MC | 198.5016 |
本地InnoDB MC | 327.239 |
遠程Native MC | 846.286 |
遠程InnoDB MC | 912.467 |
曲線圖方式對比:
nativemc-vs-innodbmc-benchmark-03-get-result-20130828
結論
InnoDB MC看起來很美好,現實很骨感,其併發4線程寫數據需呀的耗時,和原生memcached的256線程相當,差的不是一丁半點啊,還有很大優化空間。
而如果是緩存只讀,InnoDB MC本地讀取的效率大概是原生memcached的2/3,如果是遠程讀取,則相當於是本地讀取效率的1/4 ~ 1/3。
建議應用場景
鑑於上面的測試結果,建議將InnoDB MC這麼來用:
1. 數據寫入通過觸發器(trigger)或者調度器(event scheduler)將待緩存數據同步到InnoDB MC緩存表中;
2. 以memcache API方式,通過本地/遠程讀取InnoDB MC中的緩存記錄;
3. 儘可能減少通過遠程方式往InnoDB MC寫緩存數據;