ホームページ  >  記事  >  データベース  >  mysql_MySQL の sysbench ストレス テストに関する詳細なチュートリアル

mysql_MySQL の sysbench ストレス テストに関する詳細なチュートリアル

WBOY
WBOYオリジナル
2016-11-30 23:59:401217ブラウズ

はじめに

ウェブサイトの全体的なパフォーマンスをベンチマークする場合、有名な ab (Apache ベンチ)、http_load やその他のツールなど、さまざまなツールを使用できます。ここではその使用法には注意しません。知りたい場合は、オンラインで自分で答えを見つけることができます。

MySQL ベンチマークテストをどのように行うかがポイントです。mysqlslap、sysbench、Super Smack など、さまざまなツールがあります。その中でも、MySQL 公式 Web サイトで mysqlslap の使用方法が紹介されています。はサーバー ストレス テスト用の強力なツールであり、sysbench は MySQL ベンチマーク テストを実行するための非常に優れたツールです。

システムベンチ

sysbench は、CPU/メモリ/スレッド/IO/データベースなどのパフォーマンス テストを実行できるオープンソースのマルチスレッド パフォーマンス テスト ツールです。データベースは現在、MySQL/Oracle/PostgreSQL をサポートしています。

主に次の方法でのテストが含まれます:

1. CPUのパフォーマンス

2. ディスク IO パフォーマンス

3. スケジューラのパフォーマンス

4. メモリ割り当てと通信速度

5. POSIX スレッドのパフォーマンス

6. データベースのパフォーマンス (OLTP ベンチマーク テスト)

sysbench のデータベース OLTP テストは、MySQL、PostgreSQL、Oracle をサポートしており、現在は主に Linux オペレーティング システムで使用されており、オープン ソース コミュニティは sysbench を Windows に移植し、SQL Server ベンチマーク テストをサポートしています。

早速、始めましょう。

1.sysbenchのインストール

mysql バージョン: mysql-community-server-5.6.29

OS: CentOS 6.7 X86_64

sysbench 0.5 には、バージョン 0.4 と比較していくつかの変更があり、lua スクリプトと組み合わせた oltp テストや、この記事で説明するさらにいくつかの隠しオプションなどがあります。

リーリー

PostgreSQL と Oracle をテストする必要がある場合は、構成時に –with-oracle 或者 –with-pgsql パラメータ

を追加する必要があります

2. sysbench を使用して mysql をストレス テストします

2.1 読み取り専用の例

リーリー

最後の行に注意してください。テストを開始する前に、prepare を使用してテーブルとデータを準備し、run を使用して実際のストレス テストを実行し、cleanup を使用してデータとテーブルをクリアする必要があります。実際に用意されたテーブル構造:

リーリー

上記のテスト コマンドは、mysql での oltp ベンチマーク テストを表します。テーブルの数は 10、各テーブルの行数は約 50w (挿入とほぼ同じ数の削除)、非トランザクション読み取りです。テストのみ、60 秒継続、同時スレッド数 12。

説明が必要なオプション:

mysql-db=dbtest1a: テストに使用するターゲット データベースは事前に作成する必要があります。

: 生成されたテーブルの数 --oltp-tables-count=10

: 各テーブルによって生成されたレコード行の数 --oltp-table-size=500000

: ランダム サンプリング タイプを指定します。オプションの値は、uniform (一様分布)、Gaussian (ガウス分布)、special (空間分布) です。デフォルトは特別です--oltp-dist-type=uniform

: 単なる読み取り専用 SQL が生成されるだけではないことを示します。つまり、oltp.lua を使用する場合、読み取り/書き込み混合モードが使用されます。デフォルトはオフです。オンに設定すると、更新、削除、および挿入の SQL は生成されません。 --oltp-read-only=off

: 実行モード。ここでは非トランザクションです。オプションの値は、simple、complex、nontrx です。デフォルトは複雑です--oltp-test-mode=nontrx
️簡単なクエリ、

SELECT c FROM sbtest WHERE id=N

複雑 (高度なトランザクション) <br>: トランザクション モードでは、トランザクションの開始と終了の前に begin と commit が追加されます。トランザクションには、ポイント クエリ、範囲クエリ、並べ替えクエリ、更新、削除、挿入などの複数のステートメントが存在する可能性があります。 , テストテーブルのデータを破壊しないために、このモードでレコードを削除した後、同じトランザクションに同一のレコードが追加されます。

nontrx (非トランザクション): シンプルに似ていますが、更新/挿入などの操作を実行できるため、継続的な比較ストレス テストを行う場合は、クリーンアップして再度準備する必要がある場合があります。

--oltp-skip-trx=[on|off] : begin/commit ステートメントを省略します。デフォルトはオフです
D an --rand-init = On

: データをランダムに初期化するかどうか。ランダム化されていない場合は、初期の適切なデータが使用されます。各行はメインキーと同じであることを除きます。

     --num-threads=12: 并发线程数,可以理解为模拟的客户端并发连接数

     --report-interval=10:表示每10s输出一次测试进度报告

     --max-requests=0:压力测试产生请求的总数,如果以下面的max-time来记,这个值设为0

     --max-time=120:压力测试的持续时间,这里是2分钟。

注意,针对不同的选项取值就会有不同的子选项。比如oltp-dist-type=special,就有比如oltp-dist-pct=1、oltp-dist-res=50两个子选项,代表有50%的查询落在1%的行(即热点数据)上,另外50%均匀的(sample uniformly)落在另外99%的记录行上。

再比如oltp-test-mode=nontrx时, 就可以有oltp-nontrx-mode,可选值有select(默认), update_key, update_nokey, insert, delete,代表非事务式模式下使用的测试sql类型。

以上代表的是一个只读的例子,可以把num-threads依次递增(16,36,72,128,256,512),或者调整my.cnf参数,比较效果。另外需要注意的是,大部分mysql中间件对事务的处理,默认都是把sql发到主库执行,所以只读测试需要加上oltp-skip-trx=on来跳过测试中的显式事务。

ps1: 只读测试也可以使用share/tests/db/select.lua进行,但只是简单的point select。

ps2: 我在用sysbench压的时候,在mysql后端会话里有时看到大量的query cache lock,如果使用的是uniform取样,最好把查询缓存关掉。当然如果是做两组性能对比压测,因为都受这个因素影响,关心也不大。

2.2 混合读写

读写测试还是用oltp.lua,只需把--oltp-read-only等于off。

./bin/sysbench --test=./share/tests/db/oltp.lua --mysql-host=10.0.201.36 --mysql-port=8066 --mysql-user=ecuser --mysql-password=ecuser --mysql-db=dbtest1a --oltp-tables-count=10 --oltp-table-size=500000 --report-interval=10 --rand-init=on --max-requests=0 --oltp-test-mode=nontrx --oltp-nontrx-mode=select --oltp-read-only=off --max-time=120 --num-threads=128 prepare
./bin/sysbench --test=./share/tests/db/oltp.lua --mysql-host=10.0.201.36 --mysql-port=8066 --mysql-user=ecuser --mysql-password=ecuser --mysql-db=dbtest1a --oltp-tables-count=10 --oltp-table-size=500000 --report-interval=10 --rand-init=on --max-requests=0 --oltp-test-mode=nontrx --oltp-nontrx-mode=select --oltp-read-only=off --max-time=120 --num-threads=128 run
./bin/sysbench --test=./share/tests/db/oltp.lua --mysql-host=10.0.201.36 --mysql-port=8066 --mysql-user=ecuser --mysql-password=ecuser --mysql-db=dbtest1a --oltp-tables-count=10 --oltp-table-size=500000 --report-interval=10 --rand-init=on --max-requests=0 --oltp-test-mode=nontrx --oltp-nontrx-mode=select --oltp-read-only=off --max-time=120 --num-threads=128 cleanup

然而oltp-test-mode=nontrx一直没有跟着我预期的去走,在mysql general log里面看到的sql记录与complex模式相同。所以上面示例中的--oltp-test-mode=nontrx --oltp-nontrx-mode=select可以删掉。

update:

原来sysbench 0.5版本去掉了这个选项,因为作者正在准备1.0版本,所以也就没有更新0.5版本的doc。网上的博客漫天飞,就没有一个提出来的,也是没谁了。

分析一下oltp.lua脚本内容,可以清楚单个事务各操作的默认比例:select:update_key:update_non_key:delete:insert = 14:1:1:1:1,可通过oltp-point-selectsoltp-simple-rangesoltp-sum-rangesoltp-order-rangesoltp-distinct-rangesoltp-index-updatesoltp-non-index-updates这些选项去调整读写权重。

同只读测试一样,在atlas,mycat这类中间件测试中如果不加oltp-skip-trx=on,那么所有查询都会发往主库,但如果在有写入的情况下使用--oltp-skip-trx=on跳过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)

原因也很容易理解,每个线程将选择一个随机的表,不加事务的情况下高并发更新(插入)出现重复key的概率很大,但我们压测不在乎这些数据,所以需要跳过这个错误--mysql-ignore-errors=1062,这个问题老外有出过打补丁的方案允许--mysql-ignore-duplicates=on,但作者新加入的忽略错误码这个功能已经取代了它。mysql-ignore-errors选项是0.5版本加入的,但目前没有文档标明。

这里不得不佩服老外的办事效率和责任心,提个疑惑能立马得到回复,反观国内,比如在atlas,mycat项目里提到问题到现在都没人搭理。。。

2.3 只更新

如果基准测试的时候,你只想比较两个项目的update(或insert)效率,那可以不使用oltp脚本,而直接改用update_index.lua

./bin/sysbench --test=./share/tests/db/update_index.lua \
--mysql-host=10.0.201.36 --mysql-port=8066 --mysql-user=ecuser --mysql-password=ecuser \
--mysql-db=dbtest1a --oltp-tables-count=10 --oltp-table-size=500000 \
--report-interval=10 --rand-init=on --max-requests=0 \
--oltp-read-only=off --max-time=120 --num-threads=128 \
[ prepare | run | cleanup ]

此时像oltp-read-only=off许多参数都失效了。需要说明的是这里 (非)索引更新,不是where条件根据索引去查找更新,而是更新索引列上的值。

三. 结果解读

sysbench 0.5: multi-threaded system evaluation benchmark
Running the test with following options:
Number of threads: 128
Report intermediate results every 20 second(s)
Initializing random number generator from timer.
Random number generator seed is 0 and will be ignored
Initializing worker threads...
Threads started!
[ 20s] threads: 128, tps: 2354.54, reads: 33035.89, writes: 9423.39, response time: 66.80ms (95%), errors: 0.00, reconnects: 0.00
[ 40s] threads: 128, tps: 2377.75, reads: 33274.26, writes: 9507.55, response time: 66.88ms (95%), errors: 0.00, reconnects: 0.00
[ 60s] threads: 128, tps: 2401.35, reads: 33615.30, writes: 9607.40, response time: 66.40ms (95%), errors: 0.00, reconnects: 0.00
[ 80s] threads: 128, tps: 2381.20, reads: 33331.50, writes: 9522.55, response time: 67.30ms (95%), errors: 0.00, reconnects: 0.00
[ 100s] threads: 128, tps: 2388.85, reads: 33446.10, writes: 9556.35, response time: 67.00ms (95%), errors: 0.00, reconnects: 0.00
[ 120s] threads: 128, tps: 2386.40, reads: 33421.35, writes: 9545.35, response time: 66.94ms (95%), errors: 0.00, reconnects: 0.00
OLTP test statistics:
  queries performed:
    read:              4003048 //总select数量
    write:              1143728 //总update、insert、delete语句数量
    other:              571864  //commit、unlock tables以及其他mutex的数量
    total:              5718640
  transactions:            285932 (2382.10 per sec.) //通常需要关注的数字(TPS)
  read/write requests:         5146776 (42877.85 per sec.)
  other operations:          571864 (4764.21 per sec.)
  ignored errors:           0   (0.00 per sec.) //忽略的错误数
  reconnects:             0   (0.00 per sec.)
General statistics:
  total time:             120.0334s //即max-time指定的压测实际
  total number of events:       285932  //总的事件数,一般与transactions相同
  total time taken by event execution: 15362.6623s
  response time:
     min:                 17.60ms
     avg:                 53.73ms //95%的语句的平均响应时间
     max:                252.90ms
     approx. 95 percentile:       66.88ms
Threads fairness:
  events (avg/stddev):      2233.8438/9.04
  execution time (avg/stddev):  120.0208/0.01

我们一般关注的用于绘图的指标主要有:

     response time avg: 平均响应时间。(后面的95%的大小可以通过--percentile=98的方式去更改)

transactions: 精确的说是这一项后面的TPS 。但如果使用了-oltp-skip-trx=on、トランザクション数は常に 0 です。tps を取得するには、合計時間をイベントの合計数で割る必要があります (実際には、読み取り tps と書き込み tps に分割することもできます)

read/write requests: スループット QPS を取得する合計時間で割ります

もちろん、システムレベルの CPU、IO、メモリ関連のインジケーターもいくつかあります

sysbench では、ファイル システム IO、CPU パフォーマンス、メモリ割り当てと転送速度をテストすることもできますが、ここでは紹介しません。

概要

sysbench の欠点は、シミュレートされたテーブル構造が単純すぎて、tpcc-mysql のような完全なトランザクション システムではないことです。ただし、sysbench で使用される環境パラメータ制限は同じであるため、パフォーマンス ストレス テストの比較には非常に役立ちます。以上がこの記事の内容です。この記事の内容が皆さんの勉強や仕事に少しでもお役に立てれば幸いです。ご不明な点がございましたら、メッセージを残してご連絡ください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。