Heim > Datenbank > MySQL-Tutorial > Detailliertes Tutorial zum Sysbench-Stresstest für mysql_MySQL

Detailliertes Tutorial zum Sysbench-Stresstest für mysql_MySQL

WBOY
Freigeben: 2016-11-30 23:59:40
Original
1256 Leute haben es durchsucht

Vorwort

Beim Benchmarking der Gesamtleistung der Website können Sie verschiedene Tools verwenden, z. B. das berühmte ab (Apache Bench), http_load und andere Tools. Wir konzentrieren uns hier nicht auf ihre Verwendung. Wenn Sie es wissen möchten, können Sie die Antwort selbst online finden.

Der entscheidende Punkt ist, wie man MySQL-Benchmark-Tests durchführt. Es gibt viele Tools, aus denen wir wählen können, wie MySQLslap, Sysbench, Super Smack usw. Unter anderem wird die Verwendung von MySQLSlap auf der offiziellen MySQL-Website vorgestellt. Super Smack ist ein leistungsstarkes Server-Stresstest-Tool, und Sysbench ist für uns ein sehr schönes Tool zur Durchführung von MySQL-Benchmark-Tests.

sysbench

sysbench ist ein Open-Source-Multithread-Leistungstesttool, das Leistungstests für CPU/Speicher/Thread/IO/Datenbank usw. durchführen kann. Die Datenbank unterstützt derzeit MySQL/Oracle/PostgreSQL;

Es umfasst hauptsächlich Tests auf folgende Weise:

1. CPU-Leistung

2. Festplatten-IO-Leistung

3. Scheduler-Leistung

4. Speicherzuweisung und Übertragungsgeschwindigkeit

5. POSIX-Thread-Leistung

6. Datenbankleistung (OLTP-Benchmark-Test)

Der Datenbank-OLTP-Test von Sysbench unterstützt MySQL, PostgreSQL und Oracle. Er wird derzeit hauptsächlich für Linux-Betriebssysteme verwendet. Die Open-Source-Community hat Sysbench auf Windows portiert und unterstützt SQL Server-Benchmark-Tests.

Ohne weitere Umschweife fangen wir an.

1. Sysbench-Installation

MySQL-Version: mysql-community-server-5.6.29


Betriebssystem: CentOS 6.7 X86_64


Sysbench 0.5 weist im Vergleich zu Version 0.4 einige Änderungen auf, darunter den OLTP-Test in Kombination mit Lua-Skripten und einige weitere versteckte Optionen, die in diesem Artikel behandelt werden.


// 先安装编译依赖环境
$ sudo yum install gcc gcc-c++ automake make libtool mysql-community-devel
$ cd /tmp && git clone https://github.com/akopytov/sysbench.git
$ cd /tmp/sysbench && ./autogen.sh
$ ./configure --prefix=/usr/local/sysbench-0.5
$ ./make && sudo make install
// 0.5版本需要oltp.lua测试脚本
// 如果是rpm包方式安装的,在 /usr/share/doc/sysbench/tests/db/ 下可找到
$ cd /usr/local/sysbench && sudo mkdir -p share/tests/db
$ cp /tmp/sysbench/sysbench/tests/db/*.lua share/tests/db/
$ ./bin/sysbench --version
sysbench 0.5
Nach dem Login kopieren

Wenn Sie PostgreSQL oder Oracle testen müssen, müssen Sie bei der Konfiguration

oder –with-oracle Parameter–with-pgsql hinzufügen

2. Verwenden Sie Sysbench, um MySQL einem Stresstest zu unterziehen

2.1 Schreibgeschütztes Beispiel

./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 --oltp-dist-type=uniform --rand-init=on --max-requests=0 \
--oltp-test-mode=nontrx --oltp-nontrx-mode=select \
--oltp-read-only=on --oltp-skip-trx=on \
--max-time=120 --num-threads=12 \
[prepare|run|cleanup]
Nach dem Login kopieren

Bevor Sie einen Test starten, müssen Sie „prepare“ verwenden, um die Tabellen und Daten vorzubereiten, „run“, um den eigentlichen Stresstest durchzuführen, und „cleanup“, um die Daten und Tabellen zu löschen. Tatsächlich vorbereitete Tabellenstruktur:

mysql> desc dbtest1a.sbtest1;
+-------+------------------+------+-----+---------+----------------+
| Field | Type       | Null | Key | Default | Extra     |
+-------+------------------+------+-----+---------+----------------+
| id  | int(10) unsigned | NO  | PRI | NULL  | auto_increment |
| k   | int(10) unsigned | NO  | MUL | 0    |        |
| c   | char(120)    | NO  |   |     |        |
| pad  | char(60)     | NO  |   |     |        |
+-------+------------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)
Nach dem Login kopieren

Der obige Testbefehl stellt dar: OLTP-Benchmark-Test auf MySQL, die Anzahl der Tabellen beträgt 10, die Anzahl der Zeilen in jeder Tabelle beträgt etwa 500.000 (fast so viele Löschvorgänge wie Einfügungen) und es handelt sich um einen nicht transaktionalen Vorgang Nur-Lese-Test, Dauer 60 Sekunden. Die Anzahl gleichzeitiger Threads beträgt 12.

Erklärungsbedürftige Optionen:

: Die zum Testen verwendete Zieldatenbank. Dieser Bibliotheksname muss im Voraus erstellt werden mysql-db=dbtest1a

: Die Anzahl der generierten Tabellen --oltp-tables-count=10

: Die Anzahl der von jeder Tabelle generierten Datensatzzeilen --oltp-table-size=500000

: Geben Sie den Zufallsstichprobentyp an: „Uniform“ (Gleichverteilung), „Gauß“ (Gaußverteilung) und „Spezial“ (räumliche Verteilung). Der Standardwert ist speziell--oltp-dist-type=uniform

: Zeigt an, dass mehr als nur schreibgeschütztes SQL generiert wird, d. h. bei Verwendung von oltp.lua wird ein gemischter Lese-/Schreibmodus verwendet. Die Standardeinstellung ist „Aus“. Wenn diese Option aktiviert ist, werden Aktualisierungs-, Lösch- und Einfügungs-SQL nicht generiert. --oltp-read-only=off

: Ausführungsmodus, hier ist nicht transaktional. Zu den optionalen Werten gehören „einfach“, „komplex“ und „nicht trx“. Der Standardwert ist komplex--oltp-test-mode=nontrx

      

einfach: einfache Abfrage, SELECT c FROM sbtest WHERE id=N</strong> SELECT c FROM sbtest WHERE id=N<br />

      

komplex (erweiterte Transaktion) : Der Transaktionsmodus fügt „Begin“ und „Commit“ hinzu, bevor die Transaktion gestartet und beendet wird. Eine Transaktion kann mehrere Anweisungen enthalten, z. B. Punktabfrage, Bereichsabfrage, Sortierabfrage, Aktualisierung. Löschen, Einfügen usw. Um die Daten der Testtabelle nicht zu zerstören, wird nach dem Löschen eines Datensatzes in diesem Modus ein identischer Datensatz in derselben Transaktion hinzugefügt.

     

nontrx (nicht transaktional): Ähnlich wie einfach, kann aber Vorgänge wie Aktualisieren/Einfügen ausführen. Wenn Sie also kontinuierlich vergleichende Stresstests durchführen, müssen Sie möglicherweise erneut aufräumen und vorbereiten.

: Lassen Sie die begin/commit-Anweisung weg. Die Standardeinstellung ist deaktiviert--oltp-skip-trx=[on|off]

: Gibt an, ob die Daten zufällig initialisiert werden sollen. Wenn nicht, ist der Inhalt jeder Zeile der initialisierten Daten bis auf den Primärschlüssel genau derselbe

--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
Nach dem Login kopieren

然而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)
Nach dem Login kopieren

原因也很容易理解,每个线程将选择一个随机的表,不加事务的情况下高并发更新(插入)出现重复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 ]
Nach dem Login kopieren

此时像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
Nach dem Login kopieren

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

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

transactions: Genauer gesagt ist es das TPS hinter diesem Artikel. Wenn jedoch -oltp-skip-trx=on verwendet wird, ist die Anzahl der Transaktionen immer 0, und die Gesamtzeit muss durch die Gesamtzahl der Ereignisse geteilt werden, um TPS zu erhalten (tatsächlich kann sie auch in Lese-TPS und Schreib-TPS unterteilt werden)

read/write requests: Teilen Sie es durch die Gesamtzeit, um den Durchsatz QPS zu erhalten

Natürlich gibt es einige CPU-, IO- und MEM-bezogene Indikatoren auf Systemebene

sysbench kann auch Dateisystem-E/A, CPU-Leistung, Speicherzuweisung und Übertragungsgeschwindigkeit testen, was hier nicht vorgestellt wird.

Zusammenfassung

Der Nachteil von Sysbench besteht darin, dass die simulierte Tabellenstruktur zu einfach ist und kein so vollständiges Transaktionssystem wie tpcc-mysql darstellt. Es ist jedoch immer noch sehr nützlich für den Leistungs-Stresstest-Vergleich, da die von Sysbench verwendeten Umgebungsparametergrenzwerte dieselben sind. Das Obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, dass der Inhalt dieses Artikels für das Studium oder die Arbeit von Nutzen sein kann. Wenn Sie Fragen haben, können Sie eine Nachricht hinterlassen.

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage