- 服務器A運行著sysbench
- 服務器B運行著kingshard系統
- 服務器C運行著主庫
- 服務器D運行著從庫
</ul>
四臺服務器處在同一個網段中。具體的拓撲圖如下所示:
有關kingshard系統安裝與配置,請參考文檔安裝kingshard。
有關sysbench v0.5的安裝與命令選項,請參考sysbench。
4.測試過程
執行下面的命令準備測試數據
time sysbench --test=/data/home/test_user/software/sysbench/sysbench/tests/db/oltp.lua \
--mysql-host=host \
--mysql-port=9696 \
--mysql-user=kingshard \
--mysql-password=kingshard \
--mysql-db=kingshard \
--oltp-tables-count=1 \
--oltp-table-size=1000000 \
--num-threads=50 \
--max-requests=1000000 \
--report-interval=1 \
prepare
上述命令會創建表sbtest1,數據量為100w,建表語句如下:
CREATE TABLE `sbtest1` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `k` int(10) unsigned NOT NULL DEFAULT '', `c` char(120) NOT NULL DEFAULT '', `pad` char(60) NOT NULL DEFAULT '',
KEY `xid` (`id`),
KEY `k_1` (`k`)
) ENGINE=InnoDB AUTO_INCREMENT=1000001 DEFAULT CHARSET=utf8 MAX_ROWS=1000000;
4.1 kingshard與直連DB性能比較
利用sysbench測試通過kingshard轉發SQL請求和直連DB發送SQL請求這兩種情況下,kingshard和Mysql系統的兩項數據指標:QPS和每條SQL請求平均處理時間。
通過sysbench發送四類SQL請求:select、update、insert和delete,場景分別為只讀、讀寫4比1和只寫。
4.1.1 kingshard與直連DB只讀比較
通過修改host、port執行下面的命令分別測試kingshard轉發SQL或直連DB:
time sysbench --test=/data/home/test_user/software/sysbench/sysbench/tests/db/select.lua \
--mysql-host=host \
--mysql-port=9696 \
--mysql-user=kingshard \
--mysql-password=kingshard \
--mysql-db=kingshard \
--oltp-tables-count=1 \
--oltp-table-size=1000000 \
--num-threads=16 \
--max-requests=1000000 \
--report-interval=1 \
--max-time=20 \
run
利用sysbench測試了并發線程個數不同的情況下,分別執行最大請求次數為100w的 select操作,通過修改--num-threads可以獲得不同并發線程數。
測試連接 kingshard 和直連 DB 這兩種情況下的 QPS(QPS越大,系統性能越好), 測試連接 kingshard 和直連 DB 這兩種情況下的 執行sql平均時延(時延越小,系統性能越好), 每組數據重復測試三次后取平均值,具體數據對比如下表所示:
上表對應的QPS折線圖如下所示:
上表對應的時延折線圖如下所示:
4.1.2 kingshard與直連DB讀寫4:1比較
通過修改host、port執行下面的命令分別測試kingshard轉發SQL或直連DB:
ysbench --test=/data/home/test_user/software/sysbench/sysbench/tests/db/oltp.lua \
--mysql-host=host \
--mysql-port=3306 \
--mysql-user=kingshard \
--mysql-password=ks \
--mysql-db=kingshard \
--oltp-tables-count=1 \
--oltp-table-size=1000000 \
--num-threads=16 \
--max-requests=1000000 \
--report-interval=1 \
--max-time=20 \
run
利用sysbench測試了并發線程個數不同的情況下,分別執行最大請求次數為100w的 select、update、insert、delete等混合操作,通過修改--num-threads可以獲得不同并發線程數。
測試連接 kingshard 和直連 DB 這兩種情況下的 QPS(QPS越大,系統性能越好), 測試連接 kingshard 和直連 DB 這兩種情況下的 執行sql平均時延(時延越小,系統性能越好), 每組數據重復測試三次后取平均值,具體數據對比如下表所示:
上表對應的QPS折線圖如下所示:
上表對應的時延折線圖如下所示:
4.1.3 kingshard與直連DB只寫比較
通過修改host、port執行下面的命令分別測試kingshard轉發SQL或直連DB:
time sysbench --test=/data/home/test_user/software/sysbench/sysbench/tests/db/insert.lua \
--mysql-host=host \
--mysql-port=3306 \
--mysql-user=kingshard \
--mysql-password=ks \
--mysql-db=kingshard \
--oltp-tables-count=1 \
--oltp-table-size=1000000 \
--num-threads=16 \
--max-requests=1000000 \
--report-interval=1 \
--max-time=20 \
run
利用sysbench測試了并發線程個數不同的情況下,分別執行最大請求次數為100w的insert操作,通過修改--num-threads可以獲得不同并發線程數。
測試連接 kingshard 和直連 DB 這兩種情況下的 QPS(QPS越大,系統性能越好), 測試連接 kingshard 和直連 DB 這兩種情況下的 執行sql平均時延(時延越小,系統性能越好), 每組數據重復測試三次后取平均值,具體數據對比如下表所示:
上表對應的QPS折線圖如下所示:
上表對應的時延折線圖如下所示:
從QPS折線圖可以看出,當sysbench的并發測試線程較少時,連接kingshard和直連DB的QPS差距較大。 這主要是因為當sysbench并發線程少時,kingshard的性能沒有得到充分的發揮, sysbench只有很少的線程向kingshard發送請求,此時網絡延遲對QPS的影響是最主要的。
當sysbench的并發測試線程較大時,此時kingshard的性能就得到了充分的發揮, QPS的對比是連接kingshard與直連DB性能對比的真實的反應,網絡延遲對QPS的影響作用就顯得很小了。
從以上幾個表個的比例數據來看,通過kingshard轉發select請求時的QPS是直連DB時80%左右, 而update和insert請求對應的QPS則更高一些,相當于直連DB時的85%左右,甚至在并發更高的情況下直連mysql的性能低于通過kingshards轉發的性能。 由此看來利用kingshard轉發SQL請求帶來的性能下降雖有下降,但完全可以接受,甚至高并發場景下kingshard的性能優于直連DB的性能。這也是得益于kingshard在高并發的時候,充分利用了連接池的作用,降低了高并發帶來的競爭消耗。
sysbench并發線程高于512的數據并沒有給出,因為直連DB已經不能正常完成測試,但是kingshard可以完成。
4.2 max_conns_limit參數對kingshard性能影響
max_conns_limit 是 kingshard 初始化時創建的與后端mysql長連接個數,這個值設置的不同對 kingshard 性能也有比較明顯的影響。 我們猜測max_conns_limit除了與kingshard所在主機CPU核心數有關外還與后端mysql能接納的連接數有關。 我們分別測試將 max_conns_limit 設置為16、32、64、128、256、512時,kingshard轉發select,update和insert三類操作請求時的 QPS, SQL的混合情況為讀寫4比1,且sysbench的不同sql分別處于不同的事務中,具體對比結果如下所述:
上數測試對應的QPS折線圖如下所示:
從kingshard處理三類SQL操作的QPS對比來看,將max_conns_limit參數設置為128左右較為合理, 高于128后通過提高max_conns_limit值并沒有顯著效果。
max_conns_limit參數值與kingshard所在主機核心數并沒有必然的聯系,與后端mysql主機可承受連接數關系密切。
5.測試結論
本文主要測試了通過kingshard轉發SQL請求與直連DB發送SQL請求這兩種情形下的性能差距,和max_conns_limit值對kingshard的性能影響。
ks的讀寫性能平均可以達到原生mysql性能的80%,一定條件下可以達到90%,隨著并發數的增加甚至能超越mysql本身。
ks可以對mysql形成保護,增加了ks后,db層對外表現出可以接收更高的并發數,且執行時間長短不同的sql使用各自的資源,形成了資源隔離,mysql不會出現性能毛刺。
綜合以上測試結果來看,kingshard性能表現較為優秀,并沒有明顯的性能下降。同時在測試中發現kingshard系統屬于CPU密集型任務,相對于磁盤IO和內存占用率而言,kingshard對CPU消耗顯得最為明顯,所以建議在部署kingshard的時候需要優先考慮服務器的CPU性能。
來自:https://github.com/flike/kingshard/blob/master/doc/KingDoc/kingshard_performance_test.md
本文由用戶
jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!
sesese色