最近我們業務上也遇到資料庫性能問題,我們有一個環節是扣費操作,在并發度較高的場景下,資料庫延遲較高,吞吐降低。我們業務中的這個場景和秒殺場景一緻。是以想使用alisql來替換mysql,帶來性能上的提升。
硬體配置
使用alisql之前,我們先對alisql的性能做壓測。自己從alisql項目倉庫 clone 了一份代碼,然後編譯安裝。硬體采用8C-16G配置,為了做對照,另外弄了一個完全一樣的機器部署mysql,同時,購買了8C-16G配置的阿裡雲rds,版本都是mysql 5.6。
軟體配置
alisql 采用推薦配置推薦配置,mysql和rds采用預設配置。
名額
資料庫的qps和rt
壓測過程
采用性能基準測試工具sysbench,腳本采用alisql團隊給出的測試腳本alisql_ic.lua
因為我們就想測試對于單表單行更新的性能,是以sysbench測試的表數量和表大小都設定為1。
這裡順便解釋一下alisql_ic.lua腳本,其中有這麼一段語句:
if (oltp_inventory_mysql_type == "alisql") then
db_query("UPDATE COMMIT_ON_SUCCESS ROLLBACK_ON_FAIL QUEUE_ON_PK 1 TARGET_AFFECT_ROW 1 " .. table_name .. " SET c=c+1 WHERE id = 1")
else
db_query("UPDATE " .. table_name .. " SET c=c+1 WHERE id = 1")
end
如果參數
oltp_inventory_mysql_type
設定為alisql,則語句執行會有
COMMIT_ON_SUCCESS
,作用是,如果帶此hint的語句執行成功,事務就預設送出。這個有什麼好處呢?正常的使用方法是更新、等待成功、發commit。加這個hint可以減少事務送出的最後一次互動,在系統壓力大或者網絡較長的場景下,這是可以減少事務持續時間,提升整體吞吐量的,另外還有參數是提示排隊的。
接下來就是設定不同的線程數,采用sysbench 來壓測了,prepare、run、cleanup和其他壓測情況一下。我們所采用的壓測語句如下:
sysbench --mysql-host=localhost --mysql-port= --mysql-user=username --mysql-password=passwd /opt/sysbench-/tests/include/oltp_legacy/alisql_ic.lua --oltp-table-size= --oltp-tables-count= --num-threads= --time= --max-requests= --report-interval= --db-driver=mysql prepare
結果
thread | alisql_qps | alisql_rt | mysql_qps | mysql_rt | rds_qps | rds_rt |
---|---|---|---|---|---|---|
1 | 513.64 | 5.84 | 948.69 | 3.16 | 853.73 | 3.51 |
2 | 540.91 | 11.09 | 988.01 | 6.07 | 1732.29 | 3.46 |
4 | 569.68 | 21.06 | 980.23 | 12.24 | 2218.52 | 5.41 |
8 | 552.33 | 43.43 | 953.41 | 25.16 | 2174.28 | 11.03 |
16 | 561.18 | 85.47 | 975.10 | 49.20 | 2205.97 | 21.75 |
32 | 553.12 | 173.28 | 1007.76 | 95.18 | 2250.48 | 42.64 |
64 | 554.19 | 345.41 | 983.85 | 194.82 | 2210.52 | 86.79 |
其實看結果,很明顯能夠看出來。alisql比普通的mysql的性能還差。
我們自己也用寫了個小工具來做壓測對比,得到的結果也是alisql表現的性能比mysql差。仔細想想alisql性能比較差,應該是采用了推薦配置導緻的,推薦配置和mysql的預設配置不一樣。
結果比較意外,這裡我們懷疑的是開源的這部分alisql并沒有把批處理特性開放出來,是以用起來感覺就是個普通的mysql,毫無差别,這裡我還黑了我們運維是否編譯的是一個原生mysql。看結果rds的性能最好,rds是阿裡雲提供的收費的資料庫服務,這些好不容易開發出來的特性,肯定不會那麼容易開放出來吧。
在我們業務中當然沒有采用alisql,我們自己在業務層做了一些優化,這個後續會拿出來介紹。
如果有alisql的同學看到,覺得不對的地方可以聯系我,看是否我哪個步驟不對。