首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

[linux][redis]redis支持disable-thp了

前言 前文《[linux][redis]bgsave引起的latency突刺问题分析》中记录了在执行bgsave的时候,因为fork子进程之后,会出现page fault导致了redis的延迟受到了影响。 前文《[THP][redis]THP对redis的影响》中分析了THP(transparent hugepage)对redis的延迟突刺的影响。 大约两年半以前,作者给redis提了PR(https://github.com/redis/redis/pull/5124),但是maintainer并没有回复,一段时间后关闭。 几个月前,第二次提PR(https://github.com/redis/redis/pull/7381)希望解决这个问题,新任的maintainer Oran对THP问题比较感兴趣,同时也把三年多以前的另外一个PR(https://github.com/redis/redis/pull/4001)翻了出来。大约经过一周的讨论和修改,两个PR都已经合入了upstream。 分析 THP的内核逻辑 内核提供了THP开关可以控制,/sys/kernel/mm/transparent_hugepage/enabled,这个开关需要root权限,且是系统级别的影响。 always表示所有的进程都会被khugepaged扫描,尝试使用2M的透明大页。 madvise表示如果有进程调用了THP开关,则打开/关闭。 never表示khugepaged不会对任何进程生效,包括使用madvise的进程。 warning判断 redis的原有的逻辑是在启动阶段检查系统的THP配置,如果不是never,就会产生一个warning。redis自身并没有使用过madvise进行THP操作,即使使用了jemalloc,也不会对主要的内存进行THP操作。所以改成不是always就应该是安全的,所以,Oran接受了这个改动(https://github.com/redis/redis/pull/4001)。 关闭redis的进程THP 更加理想的做法是不管系统配置如何,redis都可以把自己进程的THP开关禁用掉,这样子不需要root权限控制,且不会影响其他的进程。Linux恰好提供了这样了一个syscall,所以在(https://github.com/redis/redis/pull/7381)中,会关闭掉。同时,根据Oran的意见,增加了配置项,在多数情况下,默认都是会自动关闭掉THP,除非用户强制指定了不关闭的配置。这样下来,在大多数情况下,用户都可以避免THP引起的fork之后的剧烈抖动问题。 关于conf的描述 在redis.conf中增加了一个新的配置项“disable-thp”,作者最初的描述是

02
您找到你想要的搜索结果了吗?
是的
没有找到

[linux][redis]bgsave引起的latency突刺问题分析

前言: redis启动的时候,可能会提示“WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled.” redis的作者antirez的解释:http://ntireza.com/news/84 在stackoverflow上也能找到类似的问题,在执行bgsave的时候,redis的latency监控能看到明显的突刺。 作者看到这个问题后,比较担心THP对虚拟化产生影响,于是做了对比实验,以及分析了这个突刺问题发生的原因。 分析: 1,THP 前文《[linux][memory]hugetlb和hugepage技术分析 》中提到了透明大页,在复现bgsave引起的latency突刺问题的时候,关闭THP的情况下,依然可以复现到突刺现象。鉴于这种情况,先来关闭THP,分析一下bgsave对redis的影响。 2,复现现象 关闭THP:echo never > /sys/kernel/mm/transparent_hugepage/enabled 启动redis-server:redis-server /etc/redis.conf 启动压测:redis-benchmark -t set -n 1000000 -r 1000000 -d 1024 -l 抓取latency数据:while (true); do redis-cli --latency >> latency.log; done 抓取redis的major和minor fault数据:while (true); do ps -o majflt,minflt -p 16321 >>flt.log ; sleep 1; done 启动bgsave:redis-cli bgsave 停止抓取数据,处理 latency.log 执行:cat latency.log | awk '{print $3}' | tr "\n" "," 处理后的数据画图分析:

02

全网最硬核 JVM 内存解析 - 3.大页分配 UseLargePages

前面提到了虚拟内存需要映射物理内存才能使用,这个映射关系被保存在内存中的页表(Page Table)。现代 CPU 架构中一般有 TLB (Translation Lookaside Buffer,翻译后备缓冲,也称为页表寄存器缓冲)存在,在里面保存了经常使用的页表映射项。TLB 的大小有限,一般 TLB 如果只能容纳小于 100 个页表映射项。 我们能让程序的虚拟内存对应的页表映射项都处于 TLB 中,那么能大大提升程序性能,这就要尽量减少页表映射项的个数:页表项个数 = 程序所需内存大小 / 页大小。我们要么缩小程序所需内存,要么增大页大小。我们一般会考虑增加页大小,这就大页分配的由来,JVM 对于堆内存分配也支持大页分配,用于优化大堆内存的分配。那么 Linux 环境中有哪些大页分配的方式呢?

01

6.Redis数据库性能测试及优化配置

前置知识学习补充 Redis数据库基础入门介绍与安装 - https://blog.weiyigeek.top/2019/4-17-49.html Redis数据库基础数据类型介绍与使用 - https://blog.weiyigeek.top/2020/5-17-50.html Redis基础运维之原理介绍和主从配置 - https://blog.weiyigeek.top/2019/4-17-97.html Redis基础运维之哨兵和集群安装配置 - https://blog.weiyigeek.top/2019/4-17-576.html Redis基础运维之在K8S中的安装与配置 - https://blog.weiyigeek.top/2019/4-17-524.html Redis数据库性能测试及优化配置 - https://blog.weiyigeek.top/2019/4-17-527.html Redis数据库容灾备份企业实战 - https://blog.weiyigeek.top/2019/4-17-51.html Redis数据库客户端操作实践及入坑出坑 - https://blog.weiyigeek.top/2019/4-17-577.html

02
领券