MySQL 5.7和8.0性能測試

来源:https://www.cnblogs.com/YangJiaXin/archive/2019/07/23/11234591.html
-Advertisement-
Play Games

[toc] 背景 測試mysql5.7和mysql8.0 分別在讀寫、只讀、只寫模式下不同併發時的性能(tps,qps) 前提 測試使用版本為mysql5.7.22和mysql8.0.15 sysbench測試前先重啟mysql服務,並清空os的cache(避免多次測試時命中緩存) 每次進行測試都是 ...


目錄


背景

測試mysql5.7和mysql8.0 分別在讀寫、只讀、只寫模式下不同併發時的性能(tps,qps)

前提

  • 測試使用版本為mysql5.7.22和mysql8.0.15
  • sysbench測試前先重啟mysql服務,並清空os的cache(避免多次測試時命中緩存)
  • 每次進行測試都是新生成測試數據後再進行mysql5.7和mysql8.0的測試
  • 每次測試時保證mysql5.7和mysql8.0的配置參數一致

環境

機器
cat /etc/redhat-release | xargs echo '版本 ' && dmidecode -s system-product-name | xargs echo '是否虛擬化 ' && cat /proc/cpuinfo |grep "processor"|wc -l | xargs echo 'cpu核數 '
版本 CentOS Linux release 7.5.1804 (Core)
是否虛擬化 KVM
cpu核數 4

myql5.7.22

5.7.22-log
innodb_buffer_pool_size 128M
innodb_log_buffer_size  64M
innodb_log_file_size    48M
binlog_format   ROW
log_bin ON
transaction_isolation   REPEATABLE-READ

mysql8.0.15

8.0.15
innodb_buffer_pool_size 128M
innodb_log_buffer_size  64M
innodb_log_file_size    48M
binlog_format   ROW
log_bin ON
transaction_isolation   REPEATABLE-READ

sysbench

sysbench -V
sysbench 1.1.0 (using bundled LuaJIT 2.1.0-beta3)

測試

  • 在不同的持久化策略下(binlog, redo log持久化)mysql5.7和mysql8.0 在讀寫模式、只讀模式、只寫模式(oltp_read_write,oltp_read_only,oltp_write_only)下的性能表現
  • sysbench 測試時間為60s,測試的表數量為20
  • 測試分別在雙1模式(安全性)和0 2模式(高性能)下進行
參數 可選值 含義
sync_binlog 0 binlog刷盤持久化由操作系統完成,性能好,存在丟失binlog的風險
sync_binlog 1 事務提交後刷盤持久化,最安全
sync_binlog N 在每N個事務提交後進行刷盤持久化
innodb_flush_log_at_trx_commit 0 每秒鐘寫redo log 並刷盤持久化
innodb_flush_log_at_trx_commit 1 事務提交後寫redo log 並刷盤持久化,最安全
innodb_flush_log_at_trx_commit 2 事務提交後寫redo log , 每秒刷盤持久化

雙1模式下

SHOW GLOBAL  VARIABLES WHERE Variable_name IN('sync_binlog','innodb_flush_log_at_trx_commit');
+--------------------------------+-------+
| Variable_name                  | Value |
+--------------------------------+-------+
| innodb_flush_log_at_trx_commit | 1     |
| sync_binlog                    | 1   |
+--------------------------------+-------+

mysql5.7和mysql8.0 在讀寫模式下的表現

  • 雙1 配置,讀寫模式下,mysql5.7.22 和mysql8.0.15 tps 、qps 性能差不多,mysql8.0.15 在120 線程併發時,性能出現了下降抖動

mysql5.7和mysql8.0 在只讀模式下的表現

  • 雙1 配置,只讀模式下,mysql5.7.22 的tps、qps比mysql8.0.15 好1/3 左右;併發線程數增加後,tps、qps並沒有隨著增加,反而出現了下降的趨勢

mysql5.7和mysql8.0 在只寫模式下的表現

  • 雙1 配置,只寫模式下,隨著併發數的上升,mysql5.7.22 的性能比mysql8.0.15 好1/4左右

0 2 模式下

SHOW GLOBAL  VARIABLES WHERE Variable_name IN('sync_binlog','innodb_flush_log_at_trx_commit');
+--------------------------------+-------+
| Variable_name                  | Value |
+--------------------------------+-------+
| innodb_flush_log_at_trx_commit | 2     |
| sync_binlog                    | 0   |
+--------------------------------+-------+

mysql5.7和mysql8.0 在讀寫模式下的表現

  • 0 2配置,讀寫模式下,併發數低時,mysql5.7.22性能好於mysql8.0.15; 併發數比較高時,mysql8.0.15 性能好於mysql5.7.22;在80 線程的併發以上時,性能開始下降

mysql5.7和mysql8.0 在只讀模式下的表現

  • 0 2配置,只讀模式下,mysql5.7.22性能比mysql8.0.15 好1/3左右;隨著併發數的上升,性能也沒有上升,反而有下降的趨勢

mysql5.7和mysql8.0 在只寫模式下的表現

  • 0 2 配置,只寫模式下,mysql5.7.22的tps 抖動比較大;mysql5.7.22 的qps比mysql8.0.15好1/3左右

結論

  • 整體來看,mysql5.7.22在讀寫模式、只讀模式、只寫模式下的表現是優於mysql8.0.15的
  • 隨著並行數的增加,性能表現不會也跟著增加,還會出現下降
  • 本次測試結果是在配置很低的情況下進行的,不代表絕對

註意
sysbench 需要設置--db-ps-mode=disable 禁用預編譯語句,不然併發測試線程多時會報下麵的錯誤
FATAL: mysql_stmt_prepare() failed
FATAL: MySQL error: 1461 "Can't create more than max_prepared_stmt_count statements (current value: 16382)"
FATAL: mysql_stmt_prepare() failed
FATAL: MySQL error: 1461 "Can't create more than max_prepared_stmt_count statements (current value: 16382)"
FATAL: thread_init' function failed: /usr/local/share/sysbench/oltp_common.lua:288: SQL API error FATAL: mysql_stmt_prepare() failed FATAL: MySQL error: 1461 "Can't create more than max_prepared_stmt_count statements (current value: 16382)" FATAL:thread_init' function failed: /usr/local/share/sysbench/oltp_common.lua:288: SQL API error
FATAL: mysql_stmt_prepare() failed

使用腳本

 cat sysbench_test_mysql5.7_8.0_tps_qps.sh
#!/bin/bash
#用於sysbench 測試在讀寫模式、只讀模式、只寫模式下 mysql5.7和mysql8.0 的tps,qps
#nohup bash $0 >/tmp/sysbench_test 2>& 1 &
#

user=admin
passwd=admin
ports="8015 57222"
host=127.0.0.1
sysbench_test_mode="oltp_read_write oltp_read_only oltp_write_only"
sysbench_test_info_path=/tmp/sysbench-test

function red_echo () {

        local what="$*"
        echo -e "$(date +%F-%T) \e[1;31m ${what} \e[0m"
}

function check_las_comm(){
    if [ $1 -ne 0 ];then
        red_echo $2
        exit 1
    fi
}

function  restart_mysqld(){
  service mysqld${1} restart
  sleep 2
}

function  purge_binlog(){
port=$1
mysql -u$user -p$passwd -P$port -h$host<<EOF
purge binary logs before now();
EOF
}


function clean_os_cache(){
  echo 3 > /proc/sys/vm/drop_caches
}

function  sysbench_with_diff_thread(){


thread_num=$1
port=$2
order=$3
test_mode=$4
sysbench /usr/local/share/sysbench/${test_mode}.lua --mysql_storage_engine=innodb  --table-size=100000 --tables=20 --mysql-db=test_1 --mysql-user=$user --mysql-password=$passwd --mysql-port=$port  --mysql-host=$host --threads=$thread_num  --time=60 --report-interval=2 --db-ps-mode=disable --events=0 --db-driver=mysql $order

}

function  main(){
for test_mode in $sysbench_test_mode;do

  for port in $ports;do
    for thread_num in {5,10,20,30,40,80,120,200};do
      restart_mysqld "$port"
      check_las_comm  "$?" "restart mysqld${port} failed "
      clean_os_cache
      purge_binlog "$port"

      red_echo "sysbench $thread_num  threads cleanup mysqld${port}"
      sysbench_with_diff_thread "$thread_num" "$port" "cleanup" "$test_mode">/dev/null

      red_echo "sysbench $thread_num  threads prepare mysqld${port}"
      sysbench_with_diff_thread "$thread_num" "$port" "prepare" "$test_mode">/dev/null

      mkdir -p $sysbench_test_info_path
      red_echo "sysbench $thread_num  threads run mysqld${port} $test_mode"
      sysbench_with_diff_thread "$thread_num" "$port" "run" "$test_mode" > $sysbench_test_info_path/${test_mode}_${thread_num}_$port

      # service mysqld{port} stop
    done
  done
done

}

main

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 前言:方法為上傳本地jdk壓縮包文件到遠程linux系統 <<< 驗證系統位數 >>> 在安裝之前,先驗證Linux系統的位數。 運行結果如下,結果顯示當前系統為64位 <<< 官網下載jdk壓縮包 >>> 選擇箭頭指向的壓縮包 <<< 上傳壓縮包 >>> 首先通過在xshell上傳壓縮包 效果圖如 ...
  • 如何選擇適合自己的Linux版本: 1.Linux桌面系統,首選Ubuntu; 2.伺服器端的Linux系統,首選RHEL或CentOS,這兩種中首選CentOS,如果公司有錢,不在乎成本也可以選擇RHEL; 3.如果對安全要求很高,可選擇Debian或FreeBSD; 4.如果需要使用資料庫高級服 ...
  • [toc] 進程的優先順序 那麼在系統中如何給進程配置優先順序 在啟動進程時,為不同的進程使用不同的調度策略。 nice值越高:表示優先順序越低,例如19,該進程容易將CPU使用量讓給其他進程。 nice值越低:表示優先順序越高,例如 20,該進程更不傾向於讓出CPU。 遠程連接不上操作步驟 網路 埠 用 ...
  • 轉自:https://blog.csdn.net/maxsky/article/details/44905003 大家都知道在 Linux 下,執行 su 命令後輸入密碼即可切換到 root 用戶執行各類操作 但是 Mac 下,這樣行不通,只會返回你一句 Sorry! 解決方法很簡單,首先打開終端 ...
  • 1.查找/var目錄下不屬於root、lp、gdm的所有文件。find /var -not \ (-user root -o -user lp -user gdm) -ls 2.統計/etc/init.d/functions文件中的每個單詞出現次數,併排序,用grep和sed兩種方法實現。 sed方 ...
  • #!/bin/bash #History: #2019/07/23 Fsq #This Program will check Permissions on dir PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/ ...
  • MySQL的sql_mode合理設置 sql_mode是個很容易被忽視的變數,預設值是空值,在這種設置下是可以允許一些非法操作的,比如允許一些非法數據的插入。在生產環境必須將這個值設置為嚴格模式,所以開發、測試環境的資料庫也必須要設置,這樣在開發測試階段就可以發現問題. sql model 常用來解 ...
  • MySQL必知必會 ​ 瞭解SQL 什麼是資料庫: 資料庫(database)保存有阻止的數據的容器,可以把資料庫想象成一個文件櫃。 什麼是表: 表(table) 某種特定類型結構的結構化清單,資料庫中的表的名字是唯一的。 什麼是列: 列(column)表中的一個欄位。所有表都是有一個或多個列組成的 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...