天天看點

使用sysbench對mysql壓力測試

它主要包括以下幾種方式的測試:

cpu性能

磁盤io性能

排程程式性能

記憶體配置設定及傳輸速度

posix線程性能

資料庫性能(oltp基準測試)

sysbench的資料庫oltp測試支援mysql、postgresql、oracle,目前主要用于linux作業系統,開源社群已經将sysbench移植到了windows,并支援sql server的基準測試。

廢話不多說,開始。

mysql版本: mysql-community-server-5.6.29 

os: centos 6.7 x86_64

sysbench 0.5相比0.4版本有一些變化,包括oltp測試結合了lua腳本,還多了一些隐藏選項,本文會涉及得到一部分。

如果需要測試postgresql、oracle,則在configure時需要加上 --with-oracle 或者 –with-pgsql 參數

注意最後一行,一項測試開始前需要用<code>prepare</code>來準備好表和資料,<code>run</code>執行真正的壓測,<code>cleanup</code>用來清除資料和表。實際prepare的表結構:

上面的測試指令代表的是:對mysql進行oltp基準測試,表數量10,每表行數約50w(幾乎delete多少就會insert的多少),并且是非事務的隻讀測試,持續60s,并發線程數12。

需要說明的選項:

<code>mysql-db=dbtest1a</code>:測試使用的目标資料庫,這個庫名要事先建立

<code>--oltp-tables-count=10</code>:産生表的數量

<code>--oltp-table-size=500000</code>:每個表産生的記錄行數

<code>--oltp-dist-type=uniform</code>:指定随機取樣類型,可選值有 uniform(均勻分布), gaussian(高斯分布), special(空間分布)。預設是special

<code>--oltp-read-only=off</code>:表示不止産生隻讀sql,也就是使用oltp.lua時會采用讀寫混合模式。預設 off,如果設定為on,則不會産生update,delete,insert的sql。

<code>--oltp-test-mode=nontrx </code>:執行模式,這裡是非事務式的。可選值有simple,complex,nontrx。預設是complex

simple:簡單查詢,select c from sbtest where id=n

complex (advanced transactional):事務模式在開始和結束事務之前加上begin和commit, 一個事務裡可以有多個語句,如點查詢、範圍查詢、排序查詢、更新、删除、插入等,并且為了不破壞測試表的資料,該模式下一條記錄删除後會在同一個事務裡添加一條相同的記錄。

nontrx (non-transactional):與simple相似,但是可以進行update/insert等操作,是以如果做連續的對比壓測,你可能需要重新cleanup,prepare。

<code>--oltp-skip-trx=[on|off]</code>:省略begin/commit語句。預設是off

<code>--rand-init=on</code>:是否随機初始化資料,如果不随機化那麼初始好的資料每行内容除了主鍵不同外其他完全相同

<code>--num-threads=12</code>: 并發線程數,可以了解為模拟的用戶端并發連接配接數

<code>--report-interval=10</code>:表示每10s輸出一次測試進度報告

<code>--max-requests=0</code>:壓力測試産生請求的總數,如果以下面的<code>max-time</code>來記,這個值設為0

<code>--max-time=120</code>:壓力測試的持續時間,這裡是2分鐘。

注意,針對不同的選項取值就會有不同的子選項。比如<code>oltp-dist-type=special</code>,就有比如<code>oltp-dist-pct=1</code>、<code>oltp-dist-res=50</code>兩個子選項,代表有50%的查詢落在1%的行(即熱點資料)上,另外50%均勻的(sample uniformly)落在另外99%的記錄行上。

再比如<code>oltp-test-mode=nontrx</code>時, 就可以有<code>oltp-nontrx-mode</code>,可選值有select(預設), update_key, update_nokey, insert, delete,代表非事務式模式下使用的測試sql類型。

以上代表的是一個隻讀的例子,可以把<code>num-threads</code>依次遞增(16,36,72,128,256,512),或者調整my.cnf參數,比較效果。另外需要注意的是,大部分mysql中間件對事務的處理,預設都是把sql發到主庫執行,是以隻讀測試需要加上<code>oltp-skip-trx=on</code>來跳過測試中的顯式事務。

ps1: 隻讀測試也可以使用<code>share/tests/db/select.lua</code>進行,但隻是簡單的point select。

ps2: 我在用sysbench壓的時候,在mysql後端會話裡有時看到大量的query cache lock,如果使用的是uniform取樣,最好把查詢緩存關掉。當然如果是做兩組性能對比壓測,因為都受這個因素影響,關心也不大。

讀寫測試還是用oltp.lua,隻需把<code>--oltp-read-only</code>等于<code>off</code>。

然而<code>oltp-test-mode=nontrx</code>一直沒有跟着我預期的去走,在mysql general log裡面看到的sql記錄與<code>complex</code>模式相同。是以上面示例中的<code>--oltp-test-mode=nontrx --oltp-nontrx-mode=select</code>可以删掉。

update: 

分析一下oltp.lua腳本内容,可以清楚單個事務各操作的預設比例:select:update_key:update_non_key:delete:insert = 14:1:1:1:1,可通過<code>oltp-point-selects</code>、<code>oltp-simple-ranges</code>、<code>oltp-sum-ranges</code>、<code>oltp-order-ranges</code>、<code>oltp-distinct-ranges</code>,<code>oltp-index-updates</code>、<code>oltp-non-index-updates</code>這些選項去調整讀寫權重。

同隻讀測試一樣,在atlas,mycat這類中間件測試中如果不加<code>oltp-skip-trx=on</code>,那麼所有查詢都會發往主庫,但如果在有寫入的情況下使用<code>--oltp-skip-trx=on</code>跳過begin和commit,會出現問題:

alert: failed to execute mysql query: `insert into sbtest4 (id, k, c, pad) values (48228, 47329, '82773802508-44916890724-85859319254-67627358653-96425730419-64102446666-75789993135-91202056934-68463872307-28147315305',  '13146850449-23153169696-47584324044-14749610547-34267941374')`: alert: error 1062 duplicate entry '48228' for key 'primary' fatal: failed to execute function `event': (null)

這裡不得不佩服老外的辦事效率和責任心,提個疑惑能立馬得到回複,反觀國内,比如在atlas,mycat項目裡提到問題到現在都沒人搭理。。。

如果基準測試的時候,你隻想比較兩個項目的update(或insert)效率,那可以不使用oltp腳本,而直接改用<code>update_index.lua</code>:

此時像<code>oltp-read-only=off</code>許多參數都失效了。需要說明的是這裡 (非)索引更新,不是where條件根據索引去查找更新,而是更新索引列上的值。

我們一般關注的用于繪圖的名額主要有:

response time avg: 平均響應時間。(後面的95%的大小可以通過<code>--percentile=98</code>的方式去更改)

transactions: 精确的說是這一項後面的tps 。但如果使用了<code>-oltp-skip-trx=on</code>,這項事務數恒為0,需要用<code>total number of events</code> 去除以總時間,得到tps(其實還可以分為讀tps和寫tps)

read/write requests: 用它除以總時間,得到吞吐量qps

當然還有一些系統層面的cpu,io,mem相關名額

sysbench還可以對檔案系統io測試,cpu性能測試,以及記憶體配置設定與傳輸速度測試,這裡就不介紹了。

總結起來sysbench的缺點就是,模拟的表結構太簡單,不像tpcc-mysql那樣完整的事務系統。但對于性能壓測對比還是很有用的,因為sysbench使用的環境參數限制是一樣的。