近期在排查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大幅降低。

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY2hvc2VuMG5l/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />

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

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY2hvc2VuMG5l/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />

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
    各种坑:

redis做RDB时请求超时case的更多相关文章

  1. springboot中redis做缓存时的配置

    import com.google.common.collect.ImmutableMap;import org.slf4j.Logger;import org.slf4j.LoggerFactory ...

  2. 用redis做简单的任务队列(二)

    是用redis做任务队列时,要思考: 用什么数据类型来做任务队列 怎样才能防止重复爬取 上一篇文章已经决定使用list来做任务队列,但是去重问题没有得到解决.这里可以用set来解决思考二的问题,就是防 ...

  3. redis持久化RDB和AOF

    Redis 持久化: 提供了多种不同级别的持久化方式:一种是RDB,另一种是AOF. RDB 持久化可以在指定的时间间隔内生成数据集的时间点快照(point-in-time snapshot). AO ...

  4. 4、解析配置文件 redis.conf、Redis持久化RDB、Redis的主从复制

    1.Units单位 配置大小单位,开头定义了一些基本的度量单位,只支持bytes,不支持bit 对大小写不敏感 2.INCLUDES包含 和我们的Struts2配置文件类似,可以通过includes包 ...

  5. redis的 rdb 和 aof 持久化的区别 [转]

    aof,rdb是两种 redis持久化的机制.用于crash后,redis的恢复. rdb的特性如下: Code: fork一个进程,遍历hash table,利用copy on write,把整个d ...

  6. redis的 rdb 和 aof 持久化的区别

    aof,rdb是两种 redis持久化的机制.用于crash后,redis的恢复. rdb的特性如下: Code: fork一个进程,遍历hash table,利用copy on write,把整个d ...

  7. REdis之RDB配置问题

    RDB配置:save 900 1save 300 10save 60 10000stop-writes-on-bgsave-error nordbcompression yesrdbchecksum ...

  8. 配置方案:Redis持久化RDB和AOF

    Redis持久化方案 Redis是内存数据库,数据都是存储在内存中,为了避免进程退出导致数据的永久丢失,需要定期将Redis中的数据以某种形式(数据或命令)从内存保存到硬盘.当下次Redis重启时,利 ...

  9. Redis持久化--RDB+AOF(转)

    1.Redis两种持久化方式 RDB 执行机制:快照,直接将databases中的key-value的二进制形式存储在了rdb文件中 优点:性能较高(因为是快照,且执行频率比aof低,而且rdb文件中 ...

随机推荐

  1. CEGUI 输入法窗口实现

    游戏中经常要输入汉字,但当我们游戏没有自己实现输入法窗口时,windows会使用用户安装的输入法,但这个输入法窗口只会显示在游戏窗口外头,而且当我们游戏全屏时(真全屏,不是那种窗口式的假全屏),屏幕上 ...

  2. c# 未能载入文件或程序集

    近期做项目时碰到这个问题了.goole.百度了半天,整理了下面几种可能: DLL文件名称与载入时的DLL文件名称不一致, DLL文件根本不存在,即出现丢失情况, 载入DLL路径错误,即DLL文件存在, ...

  3. Endnote从头开始五:修改output style(转载)

    Endnote从头开始五:修改output style Endnote中虽然有大量的期刊格式,但是并不能囊括所有我们需要的style,所以学会自己制作或编辑已有的期刊格式是很重要的,本节内容是Endn ...

  4. SQL注入(一)普通型注入

    既然说了从头开始,先从注入开始吧,先来温习一下之前会的一些注入. PHP注入 0x01: 判断是否存在注入: '   报错 ' and 1=1   正确 ' and 1=2   错误 0x01: or ...

  5. 某公司ASP.NET应聘上机试题

    ASP.NET笔试题是ASP.NET程序员面试必须经历的,一般会叫你填两个表 1个是你的详细信息表 1个是面试题答卷 两个都要注意反正面是否都有内容不要遗漏,如果考你机试一般也有两种,就是程序连接数据 ...

  6. Servlet的学习之Cookie

    从本篇开始学习Servlet技术中的Cookie专题. 首先来了解什么是“会话”.会话是web技术中的一个术语,可以简单的理解为:用户打开一个浏览器,点击多个超链接,访问服务器多个web资源,然后关闭 ...

  7. Python 自动化测试报告HTMLTestRunner

    HTMLTestRunner 是Python的一个测试报告 参考网址: http://tungwaiyip.info/software/HTMLTestRunner.html https://pypi ...

  8. hdu1114

    完全背包的水题,不过今天才学动态规划,就这样啦……hahahah!!! 完全背包跟普通背包的区别是普通背包从后往前循环,以防止被替换 完全背包是从前往后循环,后面的状态会跟着之前状态的改变而改变…… ...

  9. android端从服务器抓取的几种常见的数据的处理方式

    1.图片 public void look(View v) { String path = et_path.getText().toString(); try { URL url = new URL( ...

  10. 自适应滤波器(Adaptive Filter)

    ======= Wikipedia的解释 ======= 自适应滤波器是能够根据输入信号自动调整性能进行数字信号处理的数字滤波器.作为对比,非自适应滤波器有静态的滤波器系数,这些静态系数一起组成传递函 ...