欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

redis学习笔记2-性能测试

程序员文章站 2022-05-07 08:38:45
...

redis 性能测试的基本命令如下:

redis-benchmark [option] [option value]

可选参数如下:

序号 选项 描述 默认值
1 -h 指定服务器主机名 127.0.0.1
2 -p 指定服务器端口 6379
3 -s 指定服务器 socket
4 -c 指定并发连接数 50
5 -n 指定请求数 10000
6 -d 以字节的形式指定 SET/GET 值的数据大小 2
7 -k 1=keep alive 0=reconnect 1
8 -r SET/GET/INCR 使用随机 key, SADD 使用随机值
9 -P 通过管道传输 <numreq> 请求 1
10 -q 强制退出 redis。仅显示 query/sec 值
11 --csv 以 CSV 格式输出
12 -l(L 的小写字母) 生成循环,永久执行测试
13 -t 仅运行以逗号分隔的测试命令列表。
14 -I(i 的大写字母) Idle 模式。仅打开 N 个 idle 连接并等待。

举例:

主机为 127.0.0.1,端口号为 6379,执行的命令为 set,lpush,请求数为 10000,通过 -q 参数让结果只显示每秒执行的请求数。

$ redis-benchmark -h 127.0.0.1 -p 6379 -t set,lpush -n 10000 -q

SET: 146198.83 requests per second
LPUSH: 145560.41 requests per second

内存碎片率

mem_fragmentation_ratio = used_memory_rss / used_memory
used_memory :当前使用的内存量,即Redis 执行的所有分配的总和
used_memory_rss :Resident Set Size(也称为 RSS,即进程消耗的内存页数)操作系统分配给Redis实例的内存大小,表示该进程所占物理内存的大小。
包括了实际缓存占用的内存和Redis自身运行所占用的内存。

内存碎片率有以下几种情况:

mem_fragmentation_ratio < 1表示Redis内存分配超出了物理内存,操作系统正在进行内存交换,内存交换会引起非常明显的响应延迟;
mem_fragmentation_ratio > 1 是合理的;稍稍高于1是比较理想的情况。
mem_fragmentation_ratio > 1.5 说明Redis消耗了实际需要物理内存的150%以上,其中50%是内存碎片率,可能是操作系统或Redis实例中内存管理变差的表现。

redis内存碎片率过高排查:大多数是由于,写负载较高,存储的K-V值,长短不一,差异较大导致的。

常见解决方案:

  • 目前没有什么实际方案好于重启。(重启Redis服务器可以让额外产生的内存碎片失效并重新作为新内存来使用,使操作系统恢复高效的内存管理)
  • 有条件扩大内存大小。
  • 添加内存监控,当内存使用率到阈值之后重启redis,回收内存。
  • 使用驱逐政策,对数据进行清理

常见驱逐政策,可根据应用程序的访问模式选择正确的驱逐策略,更多详情可见redis官网(https://redis.io/topics/memory-optimization):

  • noeviction:当达到内存限制并且客户端尝试执行可能导致使用更多内存的命令时返回错误(大多数写命令,但DEL和一些例外)。
  • allkeys-lru:通过首先尝试删除最近较少使用的 (LRU) 键来驱逐键,以便为添加的新数据腾出空间。
  • volatile-lru:通过首先尝试删除最近使用的 (LRU) 键来驱逐键,但仅限于设置过期时间的键,以便为添加的新数据腾出空间。
  • allkeys-random随机驱逐**以便为添加的新数据腾出空间。
  • volatile-random随机驱逐**以便为添加的新数据腾出空间,但仅驱逐具有过期设置的**。
  • volatile-ttl:驱逐设置过期时间的键,并尝试首先驱逐具有较短生存时间(TTL)的键,以便为添加的新数据腾出空间。

但需要注意的是:

1.根据峰值内存使用情况来配置内存。删除键时,Redis 不会总是向操作系统释放(返回)内存。例如,如果用 5GB 的数据填充一个实例,然后删除相当于 2GB 的数据,RSS可能仍然是大约 5GB,即使 Redis 会声称用户内存在 3GB 左右。发生这种情况是因为底层分配器不能轻易释放内存。大多数已删除的键通常与仍然存在的其他键分配在相同的页面中。因此在配置内存时,需要根据峰值内存使用情况来配置内存 。如果您的工作负载不时需要 10GB,即使大多数情况下 5GB 可以满足,您也需要配置 10GB。

2.内存使用量峰值远大于当前使用的内存时,碎片率是不可靠的。因为RSS反映了峰值内存,当(虚拟)使用的内存很低,因为很多键值被释放,但RSS很高,比例RSS / mem_used会很高。