Sysbench ShardingSphere Proxy 空 Rules 性能测试

测试目的

对 ShardingSphere-Proxy 及 MySQL 进行性能对比

  1. sysbench 直接压测 MySQL 性能
  2. sysbench 压测 ShardingSphere-Proxy(底层透传 MySQL)

基于以上两组实验,得到使用 ShardingSphere-Proxy 对于 MySQL 的损耗。

测试环境搭建

服务器信息

  1. DB 相关配置:推荐内存大于压测的数据量,使得数据均在内存热块中,其余可自行调整;
  2. ShardingSphere-Proxy 相关配置:推荐使用高性能多核 CPU,其余可自行调整;
  3. 压测涉及服务器均关闭 swap 分区。

数据库

  1. [mysqld]
  2. innodb_buffer_pool_size=${MORE_THAN_DATA_SIZE}
  3. innodb-log-file-size=3000000000
  4. innodb-log-files-in-group=5
  5. innodb-flush-log-at-trx-commit=0
  6. innodb-change-buffer-max-size=40
  7. back_log=900
  8. innodb_max_dirty_pages_pct=75
  9. innodb_open_files=20480
  10. innodb_buffer_pool_instances=8
  11. innodb_page_cleaners=8
  12. innodb_purge_threads=2
  13. innodb_read_io_threads=8
  14. innodb_write_io_threads=8
  15. table_open_cache=102400
  16. log_timestamps=system
  17. thread_cache_size=16384
  18. transaction_isolation=READ-COMMITTED
  19. # 可参考进行适当调优,旨在放大底层 DB 性能,不让实验受制于 DB 性能瓶颈。

压测工具

可通过 sysbench 官网自行获取

ShardingSphere-Proxy

bin/start.sh

  1. -Xmx16g -Xms16g -Xmn8g # 调整 JVM 相关参数

config.yaml

  1. databaseName: sharding_db
  2. dataSources:
  3. ds_0:
  4. url: jdbc:mysql://***.***.***.***:****/test?serverTimezone=UTC&useSSL=false # 参数可适当调整
  5. username: test
  6. password:
  7. connectionTimeoutMilliseconds: 30000
  8. idleTimeoutMilliseconds: 60000
  9. maxLifetimeMilliseconds: 1800000
  10. maxPoolSize: 200 # 最大链接池设为 ${压测并发数} 与压测并发数保持一致,屏蔽压测过程中额外的链接带来的影响
  11. minPoolSize: 200 # 最小链接池设为 ${压测并发数} 与压测并发数保持一致,屏蔽压测过程中初始化链接带来的影响
  12. rules: []

测试阶段

环境准备

  1. sysbench oltp_read_write --mysql-host=${DB_IP} --mysql-port=${DB_PORT} --mysql-user=${USER} --mysql-password=${PASSWD} --mysql-db=test --tables=10 --table-size=1000000 --report-interval=10 --time=100 --threads=200 cleanup
  2. sysbench oltp_read_write --mysql-host=${DB_IP} --mysql-port=${DB_PORT} --mysql-user=${USER} --mysql-password=${PASSWD} --mysql-db=test --tables=10 --table-size=1000000 --report-interval=10 --time=100 --threads=200 prepare

压测命令

  1. sysbench oltp_read_write --mysql-host=${DB/PROXY_IP} --mysql-port=${DB/PROXY_PORT} --mysql-user=${USER} --mysql-password=${PASSWD} --mysql-db=test --tables=10 --table-size=1000000 --report-interval=10 --time=100 --threads=200 run

压测报告分析

  1. sysbench 1.0.20 (using bundled LuaJIT 2.1.0-beta2)
  2. Running the test with following options:
  3. Number of threads: 200
  4. Report intermediate results every 10 second(s)
  5. Initializing random number generator from current time
  6. Initializing worker threads...
  7. Threads started!
  8. # 每 10 秒钟报告一次测试结果,tps、每秒读、每秒写、95% 以上的响应时长统计
  9. [ 10s ] thds: 200 tps: 11161.70 qps: 223453.06 (r/w/o: 156451.76/44658.51/22342.80) lat (ms,95%): 27.17 err/s: 0.00 reconn/s: 0.00
  10. ...
  11. [ 120s ] thds: 200 tps: 11731.00 qps: 234638.36 (r/w/o: 164251.67/46924.69/23462.00) lat (ms,95%): 24.38 err/s: 0.00 reconn/s: 0.00
  12. SQL statistics:
  13. queries performed:
  14. read: 19560590 # 读总数
  15. write: 5588740 # 写总数
  16. other: 27943700 # 其他操作总数 (COMMIT 等)
  17. total: 27943700 # 全部总数
  18. transactions: 1397185 (11638.59 per sec.) # 总事务数 ( 每秒事务数 )
  19. queries: 27943700 (232771.76 per sec.) # 执行语句总数 ( 每秒执行语句次数 )
  20. ignored errors: 0 (0.00 per sec.) # 忽略错误数 ( 每秒忽略错误数 )
  21. reconnects: 0 (0.00 per sec.) # 重连次数 ( 每秒重连次数 )
  22. General statistics:
  23. total time: 120.0463s # 总共耗时
  24. total number of events: 1397185 # 总共发生多少事务数
  25. Latency (ms):
  26. min: 5.37 # 最小延时
  27. avg: 17.13 # 平均延时
  28. max: 109.75 # 最大延时
  29. 95th percentile: 24.83 # 超过 95% 平均耗时
  30. sum: 23999546.19
  31. Threads fairness:
  32. events (avg/stddev): 6985.9250/34.74 # 平均每线程完成 6985.9250 次 event,标准差为 34.74
  33. execution time (avg/stddev): 119.9977/0.01 # 每个线程平均耗时 119.9977 秒,标准差为 0.01

压测过程中值得关注的点

  1. ShardingSphere-Proxy 所在服务器 CPU 利用率,充分利用 CPU 为佳;
  2. DB 所在服务器磁盘 IO,物理读越低越好;
  3. 压测中涉及服务器的网络 IO。