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-Leistung2. 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
// 先安装编译依赖环境 $ 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
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]
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)
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
然而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-selects
、oltp-simple-ranges
、oltp-sum-ranges
、oltp-order-ranges
、oltp-distinct-ranges
,oltp-index-updates
、oltp-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
: 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.