這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
kingshard的效能測試報告
之前的幾篇blog,給大家分享的都是kingshard(https://github.com/flike/kingshard )的架構與設計。其實很多人對kingshard的效能也非常關心。最近熱心的網友bigpyer對kingshard做了詳細的效能測試。在此分享一下。
1.測試環境
1.1伺服器配置
類別 |
名稱 |
OS |
雲主機 Ubuntu 14.04 LTS |
CPU |
Common KVM CPU @ 2.40GHz *4 |
RAM |
8GB |
DISK |
500GB |
kingshard |
master分支 |
Mysql |
v5.6.25 |
Sysbench |
v0.5 |
2.效能需求
測試通過kingshard轉寄SQL請求與直連DB發送SQL請求這兩種情形下的效能差距。
測試組態檔案中max_conns_limit參數對kingshard的影響,並找出最優值。
3.測試準備工作
3.1 kingshard效能測試環境搭建
利用上述配置的4台伺服器搭建了一個kingshard效能測試環境:
伺服器A運行著sysbench
伺服器B運行著kingshard系統
伺服器C運行著主庫
伺服器D運行著從庫
四台伺服器處在同一個網段中。具體的拓撲圖如下所示:
有關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 '0', `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效能。