redis做RDB时请求超时case

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
简介:
  近期在排查redis做rdb时会有部分请求超时的case。初步推断是我们 redisserver上开启了THP(Transparent Huge Pages)
    
1) Linux本身的页大小是固定的4KB,在2.6.38内核新增了THP,透明地支持huge page(2MB)的使用。而且默认开启。开启THP的优势在于:
        - 降低page fault。一次page fault能够载入更大的内存块。
        - 更小的页表。同样的内存大小,须要更少的页。

        - 因为页表更小,虚拟地址到物理地址的翻译也更快。
    劣势在于:
        - 降低分配内存效率。

须要大块、连续内存块。内核线程会比較激进的进行compaction。解决内存碎片。加剧锁争用。

        - 降低IO吞吐。因为swapable huge page,在swap时须要切分成原有的4K的页。Oracle的測试数据显示会降低30%的IO吞吐。

2) 对于redis而言,开启THP的优势在于:
        - fork子进程的时间大幅降低。fork进程的主要开销是拷贝页表、fd列表等进程数据结构。因为页表大幅较小(2MB / 4KB = 512倍),fork的耗时也会大幅降低。
   劣势在于:
        - fork之后,父子进程间以copy-on-write方式共享地址空间。

假设父进程有大量写操作,而且不具有locality。会有大量的页被写。并须要拷贝。同一时候,因为开启THP,每一个页2MB,会大幅添加内存拷贝。


3) 针对这个特性,我做了一个測试,分别在开启和关闭THP的情况下,測试redis的fork、响应时间。
     測试条件:
        redis数据集大小:16G
        rdb文件大小:3.4G
        ./redis-benchmark -P 4 -t set -r 5000000 -n 1000000000

    (1) fork时间对照
开启THP后。fork大幅降低。


(2)超时次数
        使用redis-benchmark測试,单个kv仅仅有几字节,没办法模拟真实线上的延迟,这里任务延迟超过300us的请求即为超时,统计这些请求的个数。
        开启THP后,超时次数明显增多,可是每次超时时间较短。而关闭THP后,仅仅有4次超时,原因是与fork在同一事件循环的请求受到fork的影响,chu'l。
         关闭THP影响的仅仅是零星几个请求。而开启后,尽管超时时间短了,可是影响面扩大了。



4)查看THP状态
$ cat /sys/kernel/mm/transparent_hugepage/enabled 
        [always] madvise never
always表示总是开启, madvise依据程序的配置开启,never关闭。

关闭THP
sudo echo never >  /sys/kernel/mm/transparent_hugepage/enabled
须要重新启动进程

5) 结论
    集合业界的经验,建议关闭我们线上redis、mysql、mongodb等机器的THP。

6)references
    各种坑:




本文转自mfrbuaa博客园博客,原文链接:http://www.cnblogs.com/mfrbuaa/p/5093266.html,如需转载请自行联系原作者

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
5月前
|
NoSQL Redis 数据库
【Redis】RDB和AOF
【Redis】RDB和AOF
|
4月前
|
NoSQL 关系型数据库 MySQL
Redis持久化机制 RDB 和 AOF 的选择
Redis持久化机制 RDB 和 AOF 的选择
60 0
|
4月前
|
存储 缓存 NoSQL
Redis之持久化(RDB和AOF)
Redis之持久化(RDB和AOF)
|
6月前
|
存储 缓存 NoSQL
【Redis 系列】redis 学习八,redis 持久化 RDB 和 AOF
【Redis 系列】redis 学习八,redis 持久化 RDB 和 AOF
|
4天前
|
缓存 NoSQL 关系型数据库
深入浅出Redis(四):Redis基于RDB、AOF的持久化
深入浅出Redis(四):Redis基于RDB、AOF的持久化
|
5天前
|
NoSQL 算法 关系型数据库
Redis持久化 RDB & AOF
Redis持久化 RDB & AOF
13 0
|
18天前
|
存储 运维 NoSQL
|
2月前
|
缓存 NoSQL Redis
[Redis]——Redis持久化的两种方式RDB、AOF
[Redis]——Redis持久化的两种方式RDB、AOF
|
2月前
|
NoSQL 关系型数据库 MySQL
Redis 两种持久化方式 AOF 和 RDB
Redis 两种持久化方式 AOF 和 RDB
|
3月前
|
NoSQL Redis 数据库
Redis的安全网:掌握RDB和AOF的持久化技术【redis第四部分】
Redis的安全网:掌握RDB和AOF的持久化技术【redis第四部分】
124 0