天天看點

開源alisql壓測批處理性能

最近我們業務上也遇到資料庫性能問題,我們有一個環節是扣費操作,在并發度較高的場景下,資料庫延遲較高,吞吐降低。我們業務中的這個場景和秒殺場景一緻。是以想使用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的同學看到,覺得不對的地方可以聯系我,看是否我哪個步驟不對。