全部产品
云市场

DRDS Sysbench 测试说明

更新时间:2019-09-20 13:36:47

Sysbench 说明

Sysbench是一款开源的、模块化的、跨平台的多线程性能测试工具,可以执行数据库/CPU/内存/线程/IO等方面的性能测试。目前支持的数据库有MySQL、Oracle和PostgreSQL。以下验证DRDS在Sysbench OLTP和SELECT场景中的性能表现。

测试设计

  • 购买DRDS、ECS、RDS
    • DRDS(6种规格) :入门版8C32G、标准版 16C64G | 32C128G | 64C256G、企业版 32C128G | 64C256G
    • ECS压力机(1台):32C64G、操作系统 Aliyun Linux 2.1903 64位、计算网络增强型
    • RDS(12台):16C64G、MySQL 5.7、独享型
    • 备注:DRDS、ECS、RDS都处于同一可用区,同一VPC
  • 在DRDS控制台创建水平拆分库,选择已经购买的12台RDS
  • 在ECS安装Sysbench,并准备1.6亿数据,如果第一次使用Sysbench,请参考Sysbench使用指南

测试参数说明

  1. --test='/usr/local/share/sysbench/oltp_drds.lua' OLTP场景使用oltp_drds.lua, SELECT场景使用select.lua
  2. --mysql_table_options='dbpartition by hash(`id`) tbpartition by hash(id) tbpartitions 2' DRDS分库分表语法,表示每个分库2张分表
  3. --oltp-table-size=160000000 准备1.6亿数据
  4. --oltp_auto_inc=off 关闭自增主键
  5. --oltp_skip_trx=on 跳过事务
  6. --oltp_secondary id 设置为非主键防止主键冲突
  7. --oltp_range_size=5 连续取值 5 个,必定走到 5 个分片
  8. --rand-init=on 每个测试表都是用随机数据来填充的sysbench
  9. --num-threads=200 具体每个场景的并发数,请参考结果表格

测试语句范例:

  1. sysbench --test='/usr/local/share/sysbench/oltp_drds.lua' --oltp_tables_count=1 --report-interval=5 --oltp-table-size=160000000 --mysql-user=**** --mysql-password=**** --mysql-table-engine=innodb --rand-init=on --mysql-host=**** --mysql-port=3306 --mysql-db=**** --max-requests=0 --oltp_skip_trx=on --oltp_auto_inc=off --oltp_secondary --oltp_range_size=5 --mysql_table_options='dbpartition by hash(`id`) tbpartition by hash(id) tbpartitions 2' --num-threads=200 --max-time=300 run

OLTP 测试结果

1

规格 并发数 每秒 read/write 数量
入门版 8C32G 100 20807.12
标准版 16C64G 230 49667.48
标准版 32C128G 450 101277.78
标准版 64C256G 900 196413.34
企业版 32C128G 450 90693.70
企业版 64C256G 900 177506.48

SELECT 测试结果

2

规格 并发数 每秒 read/write 数量
入门版 8C32G 200 41401
标准版 16C64G 300 98182.26
标准版 32C128G 600 197845.06
标准版 64C256G 1200 385349.70
企业版 32C128G 600 180500.00
企业版 64C256G 1200 366863.48

OLTP 场景测试脚本详情

  1. pathtest = string.match(test, "(.*/)")
  2. if pathtest then
  3. dofile(pathtest .. "common.lua")
  4. else
  5. require("common")
  6. end
  7. function get_range_end(start)
  8. return start + oltp_range_size - 1
  9. end
  10. function thread_init(thread_id)
  11. set_vars()
  12. if (((db_driver == "mysql") or (db_driver == "attachsql")) and mysql_table_engine == "myisam") then
  13. local i
  14. local tables = {}
  15. for i=1, oltp_tables_count do
  16. tables[i] = string.format("sbtest%i WRITE", i)
  17. end
  18. begin_query = "LOCK TABLES " .. table.concat(tables, " ,")
  19. commit_query = "UNLOCK TABLES"
  20. else
  21. begin_query = "BEGIN"
  22. commit_query = "COMMIT"
  23. end
  24. end
  25. function event(thread_id)
  26. local rs
  27. local i
  28. local table_name
  29. local range_start
  30. local c_val
  31. local pad_val
  32. local query
  33. table_name = "sbtest".. sb_rand_uniform(1, oltp_tables_count)
  34. if not oltp_skip_trx then
  35. db_query(begin_query)
  36. end
  37. if not oltp_write_only then
  38. for i=1, oltp_point_selects do
  39. rs = db_query("SELECT c FROM ".. table_name .." WHERE id=" .. sb_rand(1, oltp_table_size))
  40. end
  41. if oltp_range_selects then
  42. for i=1, oltp_simple_ranges do
  43. range_start = sb_rand(1, oltp_table_size)
  44. rs = db_query("SELECT c FROM ".. table_name .." WHERE id BETWEEN " .. range_start .. " AND " .. get_range_end(range_start))
  45. end
  46. for i=1, oltp_sum_ranges do
  47. range_start = sb_rand(1, oltp_table_size)
  48. rs = db_query("SELECT SUM(K) FROM ".. table_name .." WHERE id BETWEEN " .. range_start .. " AND " .. get_range_end(range_start))
  49. end
  50. for i=1, oltp_order_ranges do
  51. range_start = sb_rand(1, oltp_table_size)
  52. rs = db_query("SELECT c FROM ".. table_name .." WHERE id BETWEEN " .. range_start .. " AND " .. get_range_end(range_start) .. " ORDER BY c")
  53. end
  54. for i=1, oltp_distinct_ranges do
  55. range_start = sb_rand(1, oltp_table_size)
  56. rs = db_query("SELECT DISTINCT c FROM ".. table_name .." WHERE id BETWEEN " .. range_start .. " AND " .. get_range_end(range_start) .. " ORDER BY c")
  57. end
  58. end
  59. end
  60. if not oltp_read_only then
  61. for i=1, oltp_index_updates do
  62. rs = db_query("UPDATE " .. table_name .. " SET k=k+1 WHERE id=" .. sb_rand(1, oltp_table_size))
  63. end
  64. for i=1, oltp_non_index_updates do
  65. c_val = sb_rand_str("###########-###########-###########-###########-###########-###########-###########-###########-###########-###########")
  66. query = "UPDATE " .. table_name .. " SET c='" .. c_val .. "' WHERE id=" .. sb_rand(1, oltp_table_size)
  67. rs = db_query(query)
  68. if rs then
  69. print(query)
  70. end
  71. end
  72. for i=1, oltp_delete_inserts do
  73. i = sb_rand(1, oltp_table_size)
  74. rs = db_query("DELETE FROM " .. table_name .. " WHERE id=" .. i)
  75. c_val = sb_rand_str([[
  76. ###########-###########-###########-###########-###########-###########-###########-###########-###########-###########]])
  77. pad_val = sb_rand_str([[
  78. ###########-###########-###########-###########-###########]])
  79. rs = db_query("INSERT INTO " .. table_name .. " (id, k, c, pad) VALUES " .. string.format("(%d, %d, '%s', '%s')",i, sb_rand(1, oltp_table_size) , c_val, pad_val))
  80. end
  81. end -- oltp_read_only
  82. if not oltp_skip_trx then
  83. db_query(commit_query)
  84. end
  85. end