点击上方“朱小厮的博客”,选择“设为星标”

做积极的人,而不是积极废人

一个老外的有关Redis的博客文章中提到一个有趣的事情:它们在测试期间获得的延迟图。为了持久化Redis的数据到磁盘(例如:RDB持久化),Redis需要调用fork()系统命令。 通常使用物理服务器和大多数虚拟机管理程序进行fork是很快的,即使很大的进程也是如此。 然而,Xen的fork()速度很慢,因此对于某些EC2实例类型(以及其他虚拟服务器提供程序),每次父进程调用fork()以便进行RDB持久化时,可能会出现严重的延迟峰值。 如下图所示,清晰的展示了延迟峰值:

stripe-latency.png

您可以想象一下,如果您在fork()的时候做一个延迟测试,那么在父进程fork()的时候,所有请求将延迟一秒(以上图为例)。 这将产生大量具有高延迟的样本,并且将影响99%的结果。

要更改实例类型,配置,设置或其他任何内容以改善此行为是一个好主意,并且有些用例即使单个请求具有过高延迟也是不可接受的。然而很明显的是,每30分钟发生1秒的延迟峰值不是很明显,因为这与在请求中均匀分布延迟峰值有很大不同。

如果是均匀分布的峰值,如果访问某个页面需要对Redis服务器执行大量请求,则访问页面很可能会碰到延迟:这会严重影响服务质量。

然而,如上图所示,每运行30分钟后1秒的延迟是完全不同的事情。具有良好延迟表现的百分比随着请求数量的增加而变得更好,因为请求越多,这个延迟就越不可能在样本中过度表示出来,反而会被隐藏。如果您每分钟只有1个请求,并且其中一个请求恰好碰到fork()导致的高延迟,那就会让延迟测试结果非常难看。

另外:大多数页面浏览不受影响。 因为唯一那几个用户碰到1秒延迟的,是刚好他们的请求和fork()在同一时间,其他用户的请求只会有极低的概率碰到这样糟糕的事情。 另外请注意,与fork()撞上的页面访问(即使由100个请求组成)也不会延迟超过一秒,因为fork()完成后请求就会完成,并不需要等到RDB持久化完成。

只有fork()会导致延迟毛刺,fork出来的子进程在生成RDB文件过程中,并不会对系统有很大的影响。除非子进程生成RDB文件的过程中(这个过程使用了操作系统的copy-on-write机制)有大量的写入,而且服务器可用内存不多,这时候可能会发生swapping导致出现延迟。

在当今最流行的运行时环境EC2实例中,fork延迟是Redis用户最糟糕的体验之一,所以redis作者正着手测试Redis和EC2:相信很快就会在Redis官方文档中有对EC2进行特定优化的说明 ,到时候会有比在master-slaves中禁用持久性操作更安全的方案。

如果您现在需要EC2 + Redis主机并且已禁用持久性,则最简单的部署方式是禁用Redis实例的自动重启,并使用Sentinel进行故障转移,以便崩溃的主服务器不会自动返回可用状态。 在检查故障转移成功并且有新的可用的master后,系统管理员可以手动重新启动实例。

需要说明的是,并非所有EC2实例都是相同的,恰恰相反,各种EC2实例fork表现差异还很大。如下图所示,是老外做的一些测试:

image.png

图片来自:https://redislabs.com/blog/testing-fork-time-on-awsxen-infrastructure/#.VFJQ-JPF8yF

  • 总结

Redis持久化时调用fork可能引起严重的延迟(RDB持久化以及AOF rewrite都会调用fork命令);
只是fork时引起延迟,fork完成后,子进程生成RDB/AOF文件的过程并不会引起延迟;
即使Redis是单线程处理命令,但是服务器配置最好还是需要双核,如果有多个Redis实例,那么核心数相应的翻倍;
除了fork会引起延迟外,Redis中那些时间复杂度为O(n)的也会引起性能毛刺,例如keys命令等。

文章参考:http://antirez.com/news/83

想知道更多?描下面的二维码关注我

相关推荐:

  • 这才是实现分布式锁的正确姿势

  • Redis分布式锁最牛逼的实现

  • Redission实现Redis分布式锁的N种姿势

  • 基于数据库实现的分布式锁

  • 基于Redis实现的分布式锁

>>>Learn More<<

喜欢就点个"在看"呗^_^

Redis在持久化时产生的延迟相关推荐

  1. Redis的持久化方案

    Redis 持久化策略浅析 (qq.com) Redis的持久化方案 Redis 是内存数据库,数据都是存储在内存中,为了避免进程退出导致数据的永久丢失,需要定期将 Redis 中的数据以某种形式(数 ...

  2. Redis AOF 持久化详解

    来自公众号:程序员历小冰 Redis 是一种内存数据库,将数据保存在内存中,读写效率要比传统的将数据保存在磁盘上的数据库要快很多.但是一旦进程退出,Redis 的数据就会丢失. 为了解决这个问题,Re ...

  3. Redis数据持久化

    总的来说有两种持久化方案:RDB和AOF RDB方式按照一定的时间间隔对数据集创建基于时间点的快照. AOF方式记录Server收到的写操作到日志文件,在Server重启时通过回放这些写操作来重建数据 ...

  4. 深入理解Redis的持久化机制和原理

    Redis是一种面向"key-value"类型数据的分布式NoSQL数据库系统,具有高性能.持久存储.适应高并发应用场景等优势.它虽然起步较晚,但发展却十分迅速. 近日,Redis ...

  5. Redis数据持久化机制AOF原理分析一---转

    http://blog.csdn.net/acceptedxukai/article/details/18136903 http://blog.csdn.net/acceptedxukai/artic ...

  6. Redis哨兵主备切换的数据丢失及Redis数据持久化

    一 两种数据丢失的情况 异步复制导致数据丢失 master->slave复制数据是异步的,可能有部分数据还没复制到slave,master就宕机了,此时导致数据丢失 集群脑裂导致数据丢失 mas ...

  7. 转-Redis AOF 持久化详解

    转自: https://juejin.cn/post/6844903902991630349 Redis AOF 持久化详解 Redis 是一种内存数据库,将数据保存在内存中,读写效率要比传统的将数据 ...

  8. android平台上持久化存储3种手段_深入学习Redis :持久化

    前言 在上一篇文章中,介绍了Redis的内存模型,从这篇文章开始,将依次介绍Redis高可用相关的知识--持久化.复制(及读写分离).哨兵.以及集群. 本文将先说明上述几种技术分别解决了Redis高可 ...

  9. 【重难点】【Redis 02】Redis 的持久化、Redis 的主从复制和集群、哨兵

    [重难点][Redis 02]Redis 的持久化.Redis 的主从复制和集群.哨兵 文章目录 [重难点][Redis 02]Redis 的持久化.Redis 的主从复制和集群.哨兵 一.Redis ...

最新文章

  1. 安装配置解压版Mysql方法
  2. tableau技术小积累
  3. c++ 高通、低通、带通滤波器_射频/微波滤波器
  4. fullfile函数作用
  5. 【Paper】2016_A Learning-Based Fault Tolerant Tracking Control of an Unmanned Quadrotor Helicopter
  6. Taro+react开发(47)taro中消息机制
  7. 【项目管理】技术债务
  8. ckfinder java 源码,关于不再找java使用CKFinder的原因
  9. Sqli-labs less 29
  10. Ubuntu、CentOS、redHat的区别与联系
  11. java对象赋值_Java对象引用和对象赋值
  12. python查看opencv版本_如何在Python和C ++中输出OpenCV版本号
  13. (转)2007北京高考作文题目(太有才了.我都看了无数遍了)
  14. 用易康对遥感影像进行面向对象分类
  15. 在测试集PARSEC测试集简介与使用
  16. NVIDIA GeForce Go 6100 for Wndows 7 (笔记本)
  17. PON系统向单波速率25G演进
  18. SylixOS 经得起检验的国产操作系统 (三)
  19. 一个基于 Docker 的私有云方案
  20. 2021.3.12日报:修复miniblink vip版本的性能问题

热门文章

  1. 共模干扰和差模干扰(图解)---摘自: 硬件十万个为什么
  2. webpack 4.0 小记
  3. win10 家庭版 CredSSP加密Oracle修正 设置方法
  4. Java集合--TreeMap
  5. 上海网域CEO肖确伟:IDC精细化运营探讨
  6. 一条insert语句导致的性能问题分析(一)
  7. 大数据时代的技术hive:hive介绍
  8. Android开发技巧——自定义控件之自定义属性
  9. Android 组件系列-----Activity的传值和回传值
  10. 水晶报表提示“需要数字字段”