使用sysbench来测试Row Cache解惑

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,高可用系列 2核4GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介:

最近大牛 姜承尧  也在测试Row Cache,发现使用sysbench来进行测试效果不是很明显.

分析了一下 sysbench的三个测试场景uniform,gaussian,special都不是很符合Row Cache的使用场景导致效果不明显

先来解释一下 Row Cache要解决的问题主要是在有 热门数据 且热门数据分布 很离散 的情况下Page缓存导致的内存利用率低的问题,我们做过测试,在innodb内部对Page访问打点的统计来看,一个row有500字节大小,热门数据大概占千分之一地情况下,Page缓存的利用率(就是16K读进来,真正被上层read的数据大小的比例)在20%以下,就是说 80%的内存是被浪费的.

而现在MySQL的应用由于数据量巨大使用MySQL后都是分库分表,而且为了能每个库没有热点,基本都是按取模的方式进行分表,导致热门数据基本都是很平均的分布在各个不同的Page上.而分库分表之后基本没有了range查询,都是类似select  from test where uuid=XX这样的key-value类型的查询,这样的查询就导致了内存利用率低的问题

Row Cache就是为了解决这样的场景(一般互联网应用规模到了一定程度应该都会有这个问题).

接下来我们看看sysbench 3个场景的实现 
uniform:

*
?
1
2
3
4
unsigned ``int  rnd_func_uniform(``void``)
{
  ``return  1 + sb_rnd() % args.table_size;
}
  • 完全按随机数从整个table_size取id
  • 这个场景下没有热门数据一说* gaussian:

  • ?
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    unsigned ``int  rnd_func_gaussian(``void``)
    {
      ``int           sum;
      ``unsigned ``int  i;
     
      ``for``(i=0, sum=0; i < args.dist_iter; i++)
        ``sum += (1 + sb_rnd() % args.table_size);
     
      ``return  sum / args.dist_iter;
    }
  • 按高斯分布取id,默认取值范围也是整个tabel_size,默认方差是12,当然方差越高,分布是越集中的.但也会导致结算量大增

  • 这个场景下基本也是没有热门数据一说* special:
    既然都不符合,那我们就来改一下sysbench让他符合Row Cache的场景.3个场景来说special最符合,只要改一行代码就可以啦

    ?
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    unsigned ``int  rnd_func_special(``void``)
    {
      ``int           sum = 0;
      ``unsigned ``int  i;
      ``unsigned ``int  d;
      ``unsigned ``int  res;
      ``unsigned ``int  range_size;
     
      ``if  (args.table_size == 0)
        ``return  0;
     
      ``/* Increase range size for special values. */
      ``range_size = args.table_size * (100 / (100 - args.dist_res));
     
      ``/* Generate evenly distributed one at this stage  */
      ``res = (1 + sb_rnd() % range_size);
     
      ``/* For first part use gaussian distribution */
      ``if  (res <= args.table_size)
      ``{
        ``for``(i = 0; i < args.dist_iter; i++)
        ``{
          ``sum += (1 + sb_rnd() % args.table_size);
        ``}
        ``return  sum / args.dist_iter;
      ``}
     
      ``/*
       ``* For second part use even distribution mapped to few items
       ``* We shall distribute other values near by the center
       ``*/
      ``d = args.table_size * args.dist_pct / 100;
      ``if  (d < 1)
        ``d = 1;
      ``res %= d;
     
      ``/* Now we have res values in SPECIAL_PCT range of the data */
      ``//res += (args.table_size / 2 - args.table_size * args.dist_pct / (100 * 2));
      ``res *= (100/args.dist_pct); ``//这下够离散了
      ``return  res;
    }

 

可以直接下载我修改好的包哦

http://code.google.com/p/row-cache-for-innodb/downloads/detail?name=sysbench-0.4.8.tar.gz&can=2&q=#makechanges

 

参考执行命令:

sysbench --test=oltp --oltp-test-mode=simple  --oltp-skip-trx=on
--oltp-table-size=80000000  --oltp-range-size=1
--mysql-host=localhost --mysql-user=xx --mysql-password=xx
--oltp-read-only=on --init-rng=on --num-threads=70
--oltp-dist-type=special --oltp-dist-pct=1 --oltp-dist-res=80
--max-requests=0 --max-time=1800 run
</div>

 本文来源于"阿里中间件团队播客",原文发表时间"  2011-09-10 "

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
相关文章
|
10月前
|
关系型数据库 MySQL 测试技术
【赵渝强老师】MySQL的基准测试与sysbench
本文介绍了MySQL数据库的基准测试及其重要性,并详细讲解了如何使用sysbench工具进行测试。内容涵盖sysbench的安装、基本使用方法,以及具体测试MySQL数据库的步骤,包括创建测试数据库、准备测试数据、执行测试和清理测试数据。通过这些步骤,可以帮助读者掌握如何有效地评估MySQL数据库的性能。
332 5
|
关系型数据库 MySQL OLTP
性能工具之 MySQL OLTP Sysbench BenchMark 测试示例
【8月更文挑战第6天】使用 pt-query-digest 工具分析 MySQL 慢日志性能工具之 MySQL OLTP Sysbench BenchMark 测试示例
669 0
性能工具之 MySQL OLTP Sysbench BenchMark 测试示例
|
缓存 NoSQL 测试技术
【Azure Redis 缓存 Azure Cache For Redis】使用Redis自带redis-benchmark.exe命令测试Azure Redis的性能
【Azure Redis 缓存 Azure Cache For Redis】使用Redis自带redis-benchmark.exe命令测试Azure Redis的性能
116 0
|
缓存 NoSQL 网络协议
【Azure Redis 缓存 Azure Cache For Redis】在创建高级层Redis(P1)集成虚拟网络(VNET)后,如何测试VNET中资源如何成功访问及配置白名单的效果
【Azure Redis 缓存 Azure Cache For Redis】在创建高级层Redis(P1)集成虚拟网络(VNET)后,如何测试VNET中资源如何成功访问及配置白名单的效果
117 0
|
关系型数据库 MySQL C语言
mysql的压力测试软件sysbench
mysql的压力测试软件sysbench
77 1
|
存储 缓存 UED
接口测试开发之:一篇搞懂 Cache、Cookie及Session的爱恨情仇
接口测试开发之:一篇搞懂 Cache、Cookie及Session的爱恨情仇
232 1
接口测试开发之:一篇搞懂 Cache、Cookie及Session的爱恨情仇
|
关系型数据库 PostgreSQL
|
存储 Oracle 固态存储
用sysbench测试mysql
在github上有安装说明
222 0
|
SQL 缓存 Oracle
Sysbench测试神器:一条命令生成百万级测试数据
Sysbench测试神器:一条命令生成百万级测试数据
1677 0
Sysbench测试神器:一条命令生成百万级测试数据
|
缓存 NoSQL 前端开发
【测试开发】知识点-项目中使用 Spring Cache + Redis 缓存数据
【测试开发】知识点-项目中使用 Spring Cache + Redis 缓存数据
【测试开发】知识点-项目中使用 Spring Cache + Redis 缓存数据