专栏首页皮振伟的专栏[linux][redis]bgsave引起的latency突刺问题分析

[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" "," 处理后的数据画图分析:

处理flt.log的数据: cat flt.log | grep -v "FLT" | awk '{print $2}' | tr "\n" "," 处理后的数据,计算minor fault的增量,画图分析:

可见,redis-server的latency增高的时间基本和minor fault的曲线趋势吻合。 Minor fault画图示例python代码: import numpy as np import matplotlib as mpl import matplotlib.pyplot as plt data = [4940016,4940023,4940026,4940029,4940029,4940033,5067128,5176081,5228731,5251478,5261030,5265256,5267831,5268176,5268389,5268470,5268534,5268576,5268584,5268588,5268592,5268593,5268621,5268625] delta = [] cnt = len(data) for index in range(1, cnt) : delta.append(data[index] - data[index-1]) #print "delta = %s"% delta plt.plot(delta) plt.show() 3,bgsave gbsave的实现在redis/src/rdb.c中:

由上面关键代码可以看到,background的save就是fork出来一个子进程执行save,父进程进度对外提供服务。 4,fork Linux的fork实现上,采用了轻量级的fork实现,尤其是内存,采用了COW(copy on write)策略。比如说作者的实验环境上,redis-server执行fork的时候,redis-server有超过1G的内存在运行,如果是完整的fork,则需要拷贝完整的1G的内存。而实际上,很多时候fork之后都会加上exec运行其他的进程(glibc的system函数就是这么实现的),执行exec则会刷新运行环境,那么复制的内存则没有太多价值。为了节约fork的成本,就有了COW策略。 5,minor fault 在内核中,缺页中断导致的异常叫做page fault。其中,因为filemap映射导致的缺页,或者swap导致的缺页,叫做major fault;匿名映射导致的page fault叫做minor fault。 作者一般这么区分:需要IO加载的是major fault;minor fault则不需要IO加载。 上文中提到了fork的COW策略,在执行fork之后,redis-server父进程的page table中也处于写保护状态,执行了大量的redis set命令,就意味着大量的写操作,于是产生了大量的minor fault。 6, redis-benchmark get 对比上述实验,使用 redis-benchmark执行get操作,执行bgsave,latency处理数据看到:

7,解决办法 作者看了madvise和mlock的实现,没有发现有什么好的解决办法。 请教了一个资深DBA朋友,给的建议是在凌晨或者深夜的时候执行bgsave,还有就是使用备机做bgsave操作。

本文分享自微信公众号 - AlwaysGeek(gh_d0972b1eeb60)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-05-03

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 【倒计时7天】2018教育部-腾讯公司产学合作协同育人项目申请即将截止!

    腾讯高校合作
  • SQL中GROUP BY用法示例

    GROUP BY我们可以先从字面上来理解,GROUP表示分组,BY后面写字段名,就表示根据哪个字段进行分组,如果有用Excel比较多的话,GROUP BY比较类...

    Awesome_Tang
  • 【系统设置】CentOS 修改机器名

    ken.io
  • 知识体系解决迷茫的你

    最近在星球里群里都有小伙伴说道自己对未来的路比较迷茫,一旦闲下来就不知道自己改干啥,今天我这篇文章就是让你觉得一天给你 25 个小时你都不够用,觉得睡觉都是浪费...

    桃翁
  • 复杂业务下向Mysql导入30万条数据代码优化的踩坑记录

    从毕业到现在第一次接触到超过30万条数据导入MySQL的场景(有点low),就是在顺丰公司接入我司EMM产品时需要将AD中的员工数据导入MySQL中,因此楼主负...

    haifeiWu
  • 理工男图解零维到十维空间,烧脑已过度,受不了啦!

    让我们从一个点开始,和我们几何意义上的点一样,它没有大小、没有维度。它只是被想象出来的、作为标志一个位置的点。它什么也没有,空间、时间通通不存在,这就是零维度。

    钱塘数据
  • 考研英语-1-导学

    英二图表作文要重视。总体而言,英语一会比英语二难点。不过就写作而言,英语二会比英语一有难度,毕竟图表作文并不好写。

    用户1335799
  • ISUX Xcube智能一键生成H5

    腾讯ISUX
  • 不只是软件,在线也可以免费下载百度文库了。

    不管是学生,还是职场员工,下载各种文档几乎是不可避免的,各种XXX.docx,XXX.pptx更是家常便饭,人们最常用的就是百度文库,豆丁文库,道客巴巴这些下载...

    课代表
  • 中国互联网协会发布:《2018中国互联网发展报告》

    在2018中国互联网大会闭幕论坛上,中国互联网协会正式发布《中国互联网发展报告2018》(以下简称《报告》)。《中国互联网发展报告》是由中国互联网协会与中国互联...

    钱塘数据

扫码关注云+社区

领取腾讯云代金券