zoukankan      html  css  js  c++  java
  • redis做RDB时请求超时case

        近期在排查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
        各种坑:

  • 相关阅读:
    VSCode 预览 .md 文件
    ubuntu 16.04安装visual studio code 提示libnss3版本低:NSS >= 3.26 is required
    spring-tool-suite(STS) 创建 spring boot项目
    win10正式版开始菜单无法打开,右边的网络连接、操作中心也打不开
    nginx配置事例
    spring 集成 redis -- pub/sub
    springMVC--全局异常处理
    dubbo入门使用
    dubbo配置约束
    zookeeper安装与集群搭建
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/5093266.html
Copyright © 2011-2022 走看看