【MySQL】sysbench 测试结果

1,327 阅读5分钟

使用 sysbench 对 MySQL 进行性能测试,测试结果示例:

sysbench 1.0.20 (using bundled LuaJIT 2.1.0-beta2)

Running the test with following options:
Number of threads: 1000
Report intermediate results every 10 second(s)
Initializing random number generator from current time


Initializing worker threads...

Threads started!

[ 10s ] thds: 1000 tps: 373.36 qps: 9083.26 (r/w/o: 6656.54/1576.82/849.90) lat (ms,95%): 5507.54 err/s: 3.30 reconn/s: 0.00
[ 20s ] thds: 1000 tps: 451.51 qps: 9174.67 (r/w/o: 6450.09/1813.15/911.43) lat (ms,95%): 5312.73 err/s: 8.30 reconn/s: 0.00
[ 30s ] thds: 1000 tps: 492.89 qps: 9980.35 (r/w/o: 6996.99/1989.57/993.78) lat (ms,95%): 4855.31 err/s: 8.00 reconn/s: 0.00
[ 40s ] thds: 1000 tps: 466.71 qps: 9441.82 (r/w/o: 6635.78/1866.12/939.91) lat (ms,95%): 4683.57 err/s: 6.50 reconn/s: 0.00
[ 50s ] thds: 1000 tps: 479.69 qps: 9695.32 (r/w/o: 6804.47/1925.46/965.38) lat (ms,95%): 5217.92 err/s: 6.00 reconn/s: 0.00
[ 60s ] thds: 1000 tps: 417.20 qps: 8438.40 (r/w/o: 5920.83/1677.18/840.39) lat (ms,95%): 5709.50 err/s: 6.70 reconn/s: 0.00
[ 70s ] thds: 1000 tps: 449.92 qps: 9146.85 (r/w/o: 6425.35/1812.87/908.63) lat (ms,95%): 5124.81 err/s: 8.10 reconn/s: 0.00
[ 80s ] thds: 1000 tps: 299.10 qps: 6028.05 (r/w/o: 4231.84/1195.11/601.11) lat (ms,95%): 6960.17 err/s: 2.90 reconn/s: 0.00
[ 90s ] thds: 1000 tps: 289.60 qps: 5834.17 (r/w/o: 4092.68/1159.39/582.10) lat (ms,95%): 7895.16 err/s: 2.90 reconn/s: 0.00
[ 100s ] thds: 1000 tps: 275.20 qps: 5544.43 (r/w/o: 3881.55/1109.09/553.79) lat (ms,95%): 7895.16 err/s: 3.40 reconn/s: 0.00
[ 110s ] thds: 1000 tps: 246.20 qps: 5013.35 (r/w/o: 3531.14/985.21/497.01) lat (ms,95%): 9284.15 err/s: 4.60 reconn/s: 0.00
[ 120s ] thds: 1000 tps: 238.20 qps: 4827.83 (r/w/o: 3390.72/956.81/480.30) lat (ms,95%): 9452.83 err/s: 3.90 reconn/s: 0.00
[ 130s ] thds: 1000 tps: 279.89 qps: 5641.99 (r/w/o: 3950.72/1127.88/563.39) lat (ms,95%): 8638.96 err/s: 3.60 reconn/s: 0.00
[ 140s ] thds: 1000 tps: 240.90 qps: 4905.55 (r/w/o: 3451.64/967.71/486.21) lat (ms,95%): 9452.83 err/s: 4.40 reconn/s: 0.00
[ 150s ] thds: 1000 tps: 301.80 qps: 6083.81 (r/w/o: 4264.24/1212.98/606.59) lat (ms,95%): 8955.74 err/s: 3.90 reconn/s: 0.00
[ 160s ] thds: 1000 tps: 310.59 qps: 6275.97 (r/w/o: 4407.81/1242.57/625.59) lat (ms,95%): 7215.39 err/s: 3.50 reconn/s: 0.00
[ 170s ] thds: 1000 tps: 292.11 qps: 5927.00 (r/w/o: 4161.54/1176.44/589.02) lat (ms,95%): 8333.38 err/s: 4.80 reconn/s: 0.00
[ 180s ] thds: 1000 tps: 307.89 qps: 6213.57 (r/w/o: 4360.81/1233.27/619.49) lat (ms,95%): 7346.49 err/s: 3.70 reconn/s: 0.00
SQL statistics:
    queries performed:
        read:                            896238                         # 读请求数,占总查询 70%
        write:                           253492                         # 写请求数,占总查询 20%
        other:                           127145                         # 其他请求,占总查询 10%
        total:                           1276875                        # 请求数总和,等于下面的 Queries
    transactions:                        63128  (345.34 per sec.)       # 事务数与 TPS
    queries:                             1276875 (6985.20 per sec.)     # 请求数与 QPS
    ignored errors:                      889    (4.86 per sec.)         # 忽略错误数
    reconnects:                          0      (0.00 per sec.)         # 重连数

General statistics:
    total time:                          182.7966s                      # 总时间
    total number of events:              63128                          # 总事件,这里等于事务数

Latency (ms):
         min:                                   30.69                   # 最低时延
         avg:                                 2874.65                   # 平均时延
         max:                                20481.61                   # 最高时延
         95th percentile:                     7346.49                   # 95% 时延低于
         sum:                            181470972.53                   # 总时延

Threads fairness:
    events (avg/stddev):           63.1280/5.92                         # 平均线程事件
    execution time (avg/stddev):   181.4710/0.67                        # 平均线程执行时间

测试机器原为腾讯云服务器,但远程测试容易发生错误,让 sysbench 无法断开连接准时停止,同时服务器配置为至强(2 核 4 线程)+ 4G 内存 + 50G 存储。性能并不好,后面选择使用自己的机器 + docker 来搭建 MySQL 服务,配置为 AMD 4800U(8 核 16 线程)+ 16G 内存 + 512G 存储。

综合性能测试

综合性能测试包含 selectupdateinsertdelete

单表并发测试

数据量:100000,测试时间:180s,事务比例:5%。测试命令示例:

sysbench /usr/share/sysbench/tests/include/oltp_legacy/oltp.lua \
--db-driver=mysql \ 
--mysql-db=sysbench \ 
--mysql-user=sysbench \
--mysql-password=123456 \
--mysql-port=3306 \ 
--mysql-host=127.0.0.1 \
--oltp-tables-count=1 \ 
--oltp-table-size=100000 \
--threads=100 \
--time=180 \ 
--report-interval=10 \
run
并发线程总请求数QPS平均延迟95th 百分比时延
106954203862.6851.7673.13
100247003313710.58145.81235.74
200288834616018.62249.41411.96
500253498414013.10712.641973.38
80015872828739.791835.754943.53
100012768756985.202874.657346.49
morexxxx

image.png

多表并发测试

数据量:100000,测试时间:180s,事务比例:5%。测试命令示例:

sysbench /usr/share/sysbench/tests/include/oltp_legacy/oltp.lua \
--db-driver=mysql \ 
--mysql-db=sysbench \ 
--mysql-user=sysbench \
--mysql-password=123456 \
--mysql-port=3306 \ 
--mysql-host=127.0.0.1 \
--oltp-tables-count=10 \ 
--oltp-table-size=100000 \
--threads=100 \
--time=180 \ 
--report-interval=10 \
run
并发线程总请求数QPS平均延迟95th 百分比时延
105084402823.9070.8195.81
100208906011597.23172.40257.95
200211629711741.18340.511191.92
500274384415168.02657.791069.86
800212084011633.671360.013208.88
1000260218614375.651388.812159.29
morexxxx

image.png

单表数据量测试

线程数:200,测试时间:180s,事务比例:5%。测试命令示例:

sysbench /usr/share/sysbench/tests/include/oltp_legacy/oltp.lua \
--db-driver=mysql \
--mysql-db=sysbench \
--mysql-user=sysbench \
--mysql-password=123456 \
--mysql-port=3306 \
--mysql-host=127.0.0.1 \
--oltp-tables-count=1 \
--oltp-table-size=50000000 \
--threads=200 \
--time=180 \
--report-interval=10 \
run
数据量总请求数QPS平均延迟95th 百分比时延最大时延最小时延
10k5012962764.851512.962040.148948.0137.82
100k295738616400.41243.67397.391087.8069.51
1m262148014545.32274.85434.832234.6845.53
5m196996010935.26365.59601.299762.2540.08
10m14529808054.12495.96877.6117556.6240.45
50m179200982.944043.1215650.4254546.9869.09
100m176740970.814100.7214302.9449566.8154.09

image.png

  • 当数据量太少时,并发太容易产生锁,因此 QPS 非常低。
  • 当数据量达到数十万时,并发执行的效果最好,此时 QPS 较高,延迟较低。
  • 当数据量超百万时,QPS 开始逐渐下降,超千万时下降尤为明显。

由此可得出简单推论,单表数据量最好保持十万级,此时综合性能最好。

读性能测试

线程数:200,测试事件:180s,事务比例:0.0625,测试命令示例:

sysbench /usr/share/sysbench/tests/include/oltp_legacy/oltp.lua \
--db-driver=mysql \
--mysql-db=sysbench \
--mysql-user=sysbench \
--mysql-password=123456 \
--mysql-port=3306 \
--mysql-host=127.0.0.1 \
--oltp-tables-count=1 \
--oltp-table-size=1000000 \
--oltp-read-only=on \
--threads=200 \
--time=180 \
--report-interval=10 \
run
数据量总请求数QPS平均延迟95th 百分比时延最大时延最小时延
10k426624023685.39125.05167.44375.7555.05
100k410112022766.96140.49173.58352.8265.41
1m425518423623.67135.40167.44432.2148.31
5m386454421453.53149.10204.1136.91427.68
10m365067220267.05157.82219.36420.5238.01
50m337635218742.69170.67240.02906.2531.00
100m324992018039.97177.31248.84613.1447.80

image.png

可以看到,200 连接时,单机单表最高可以抗两万多的读 QPS,而综合操作最高抗一万六左右的 QPS,同时只读的时延非常低,因此对于并发要求高的场景,分库分表是非常必要的。