当前位置: 首页 > 知识库问答 >
问题:

什么会导致Redis RDB快照停止?

贲绪
2023-03-14

我在Ubuntu 14.04上安装了redis,而且我似乎几乎每周都有完成RDB快照的问题。Redis版本是3.0.4 64位。

3838:M 24 Feb 09:46:28.826*后台保存成功终止
3838:M 24 Feb 09:47:29.088*在60秒内更改100000次。拯救
3838:M 24 Feb 09:47:29.230*后台保存由pid 17281启动
17281:信号处理程序(1456338079)收到SIGTERM调度关闭
3838:M 24 Feb 13:24:19.358#后台保存由信号9终止
3838:M 24 Feb 13:24:19.622*900秒内发生10次更改。正在保存
3838:M 24 Feb 13:24:19.730*后台保存由pid 17477启动

你可以看到,后台保存在上午9:47开始,但当我在下午1:24发现它时,它似乎完全停止了。我发现分叉进程基本上没有活动——它消耗的内存量没有增加。我试图“杀死”子进程,但它从未真正退出,所以我不得不带着极端的偏见杀死它(-9)。

当情况变得糟糕时,我的应用程序中会出现以下错误:

2016-02-24 13:11:12,046[2344]错误kCollection。Main-添加到Redis时出错:没有可用的连接来服务此操作:SADD ALLCH

我的redis配置只做rdb快照(没有AOF)。负载很重,每秒有数千次写入。

目前,我的redis后台保存没有成功,后台进程变得比常规进程大得多,以至于我的VM开始交换。这是我的TOP。3838是我的redis实例,17477是后台保存进程(如上所述):

Top-14:06:42起118天,2:05,1个用户,平均负载:1.07, 1.07, 1.13
任务:总共81个,3个运行,78个睡眠,0个停止,0个僵尸
%Cpu(s):0.8 us,1.5 sy,0.0 ni,45.8 id,51.3 wa,0.0 hi,0.5 si,0.0 st
KiB Mem:总共8176996,使用8036792,140204免费,120个缓冲区
KiB交换:总共6289404,使用3968236,2321168免费。4044缓存Mem

PID USER PR NI VIRT RES SHR S%CPU%MEM time COMMAND
36 root 20 0 0 0 S2.3 0.0 288:05.05kswapd0
3838 rrr20 0 7791836 3.734g 612 S2.0 47.9 330:08.65redis-server
17477 rrr20 0 7792228 6.606g 364 D1.0 84.7 0:43.49redis-server

共有1个答案

沃威
2023-03-14

这很有趣,因为我不记得读过这样的问题,所以发现根本原因可能非常有用。

因此,这里您报告了一个子进程,它长时间保持活动状态,甚至继续分配内存。如果不是进程内存中的数据损坏,导致RDB进程发现意外情况并以某种方式永远循环,我无法解释这一点。

几个问题:

  1. 即使重新启动流程,也会发生这种情况吗?(但是,如果您可以避免重新启动并且尚未重申,请不要这样做,否则我们可能无法再理解根本原因)
  2. 当RDB保存处于活动状态时,您是否看到CPU使用率很高,并且进程使用ps/top运行
  3. 你能试着用gdb-p中断这个过程吗

TLDR:有没有可能系统内存溢出,交换了很多?所以子进程在保存RDB文件时访问了所有页面,并强制所有内容都在驻留集中。系统无法处理这么多输入/输出,所以需要很长时间才能完成RDB保存。

编辑:我刚刚注意到你报告了内存信息:

KiB内存:总共8176996个,使用8036792个,可用140204个,120个缓冲区

因此,系统内存不足,正在疯狂地交换,这导致了上述行为。随着RDB保存的开始,COW将使用大量额外的内存,从而将服务器推向内存限制。

谢谢

 类似资料:
  • 问题内容: 好吧,我试图理解并阅读可能导致它的原因,但我却无法理解: 我的代码中有这个地方: 事实是,当它尝试调用某些方法时,它将引发而不是其他预期的异常(特别是)抛出 。我实际上知道调用了什么方法,所以我直接转到该方法代码,并为应该抛出的行添加了一个块 ,它实际上按预期抛出。然而,当它上升时,以某种方式更改了上面的代码并没有 按预期进行。 是什么原因导致这种行为的?我该如何检查? 问题答案: 通

  • 问题内容: 即使模型类中没有验证约束,我也会收到此错误(所有成员变量均已正确设置,但我在创建对象时仍然遇到此异常)。如何调试此错误? 问题答案: 每个都有一个数组。每个显示了您要保留的bean的哪个属性被侵犯。正如@Arthur正确指出的那样,违反Java持久性注释的结果也以s 结尾。 要调试你的问题,我会暂时赶在并打印出每个如下:

  • 我在标题中所述的内容仅在chrome浏览器中出现,如在firefox中“(“navigator”中的“serviceWorker”)总是错误的,“console.warn('此浏览器不支持服务工作者');”而是触发。 如果你清除浏览器或隐姓埋名运行,那么它最初是工作的,但是当你第一次注销,然后重新登录时,问题就开始了。 这就是网络日志里的样子 以下是我注册软件的代码: '/service-Work

  • 为什么我在下面的代码段中的X轴上有一个溢出? 在我的网格容器上应用时,就会产生溢出。 null null https://codepen.io/anon/pen/wdjexz?editors=1100

  • 应用程序可以持久化用户,以后可以修改。最近无法修改用户,引发了异常。用户实体被持久化,没有错误或验证。有人知道是什么导致了这种行为,或者我如何找到更多细节吗?

  • 问题内容: 遇到一个错误地使用 而不是 在其代码中的人,它没有显示为编译错误。 是因为 是相同的 ? 问题答案: 没有编译错误,因为它是有效的(尽管相当无用) 一元运算符 ,其使用方式与以下方式相同: Java语言规范中的相关部分是Unary Plus运算符+(第15.15.3节) 。它指定调用一元运算会导致操作数的一元数值提升(第5.6.1节)。这意味着: * 如果操作数是编译时类型的,,,或,