Mysql

使用 MySQL 中的正常日誌擷取的查詢對 MySQL 進行壓力測試

  • March 2, 2021

是否有任何工具可以使用 MySQL 通用日誌創建的日誌文件進行壓力測試?在Google上大量搜尋後,我發現很少有壓力測試工具只使用一些基准進行壓力測試。一種解決方案是使用 Apache JMeter,但它不會從 MySQL 日誌文件創建測試計劃,並且為我擁有的所有查詢創建自定義測試計劃太耗時了。

或者是否有至少可以從 MySQL 日誌創建 .sql 文件的工具?

這只是一個跟踪而不是一個完整的解決方案,“你的”解決方案是基於你的幻想(和一些工作);)

我已經完成了這種由通用查詢日誌生成的測試擷取和清理查詢,並在編寫自己的文件後使用sysbench 0.5lua,您可以在官方原始碼中找到一些範例,在我的數據庫(硬體和模式/數據的鏡像)上-快照,以便我可以立即恢復數據的原始狀態-)。

然後你可以執行這樣的命令:

./sysbench --mysql-table-engine=myisam --mysql-db=<yourdb> --mysql-user=<user> --mysql-host=<host> --mysql-password=<pass> --test=tests/db/<yourlua>.lua --num-threads=8 --max-requests=8 run

收集並繪製結果、更改並發和請求,並監控您的數據庫和硬體狀態。

我的lua文件包含大約 80.000 個查詢,它由插入、更新和刪除組成

更新#1

您可以嘗試的一個很好的起點是開始(簡單地)編寫您的lua文件,如下所示:

pathtest = string.match(test, "(.*/)") or ""

dofile(pathtest .. "common.lua")

function thread_init(thread_id)
  set_vars()

  if (db_driver == "mysql" and mysql_table_engine == "myisam") then
     -- begin_query = "LOCK TABLES ".. table_name .." WRITE"
     -- commit_query = "UNLOCK TABLES"
     begin_query = "SELECT 1>0"
     commit_query = "SELECT 1>0"
  else
     begin_query = "BEGIN"
     commit_query = "COMMIT"
  end
end

function event(thread_id)
   local table_name
   db_query(begin_query)
   rs = db_query("INSERT INTO .....")
   rs = db_query("INSERT INTO .....")
   rs = db_query("SELECT ... FROM ...")
   rs = db_query("DELETE ...")
   db_query(commit_query)
end

將您的查詢放入db_query("")函式中,為此類過程清理您的一般查詢日誌需要一些工作

這裡是一個“個人”lua文件的簡單輸出,就像上面一樣,有 9 個查詢,7 個插入和 2 個選擇,+2 BEGIN/COMMIT:

sysbench 0.5:  multi-threaded system evaluation benchmark

Running the test with following options:
Number of threads: 8
Random number generator seed is 0 and will be ignored


Threads started!

OLTP test statistics:
   queries performed:
       read:                            32
       write:                           56
       other:                           0
       total:                           88
   transactions:                        0      (0.00 per sec.)
   deadlocks:                           0      (0.00 per sec.)
   read/write requests:                 88     (7728.11 per sec.)
   other operations:                    0      (0.00 per sec.)

General statistics:
   total time:                          0.0114s
   total number of events:              8
   total time taken by event execution: 0.0252s
   response time:
        min:                                  2.87ms
        avg:                                  3.15ms
        max:                                  3.65ms
        approx.  95 percentile:               3.65ms

Threads fairness:
   events (avg/stddev):           1.0000/0.00
   execution time (avg/stddev):   0.0032/0.00

希望這可以幫助

引用自:https://dba.stackexchange.com/questions/39221