天天看點

MySQL 壓測

3.2.2 網絡參數問題

  • 問題描述

使用 mysqlslap 壓測某個語句,當并發數提升到200或400時,CDB性能下降,不符合業務預期。

  • 排查過程

     這裡隻和高并發有關,CDB團隊首先想到的是MySQL是否開啟了thread pool功能,對于CDB和自建均未開啟thread pool功能,而在CDB上打開了thread pool功能後問題仍然存在。而且在本地和遠端壓測都存在同樣問題,這也排除了網絡的因素。

     有一個細節是CDB團隊觀察到壓測過程中資料庫的連接配接數并不穩定,忽上忽下,就開始懷疑是mysqlslap壓測工具的問題。于是CDB團隊開始檢視mysqlslap源碼, 确認mysqlslap用的是否是短連接配接。然而mysqlslap用的是長連接配接,并不是短連接配接。但有一種情況,當mysqlslap執行完一輪(number_of_querys)語句後會建立連接配接。當壓測參數iterations設定較大,number_of_querys較小,并且調大并發數時,每個連接配接執行的語句相對就少了。也就是說,當并發數增大時,壓測過程中的建立連接配接增加了。為了驗證這個問題, CDB團隊調大壓測參數number_of_querys後,壓測性能就上去了。

     到這裡,問題可以歸結為大量建立連接配接影響了性能。于是CDB團隊開始查找TCP相關系統參數的差別,通過修改主機參數tcp_rmem/tcp_wmem/tcp_max_syn_backlog/somaxconn,解決了高并發下的性能下降問題。

  • 問題原因

      mysqlslap的實作方式是每次疊代都後重建立立連接配接,即所有用戶端執行完number_of_queries數量的SQL後會重建立連連接配接,當并發增加時,每個用戶端執行的sql相對較少,mysqlslap這種長連接配接測試方式退化類似于短連接配接的測試方式,而CDB主機對短連接配接處理的不是特别好。解決方案

      修改主機參數, 提高了建立連接配接效率

tcp_rmem="4096 873800 4194304" (原"4096 87380 4194304", TCP receive memory buffers)

tcp_wmem = "4096 163840 4194304" (原"4096 16384 4194304", TCP send memory buffers)

tcp_max_syn_backlog=3240000 (原4096, sync queue size)

somaxconn = 2048(原128, accept queue size)

  • 方案效果

      通過優化騰訊雲CDB主機參數tcp_rmem/tcp_wmem/tcp_max_syn_backlog/somaxconn,解決了通過短連高并發下的性能下降問題。