当Redis加载大数据集时,一些Linux系统变得非常慢

我收到了一个Redis用户的报告,我不知道该怎么回答,因为我不是Linux领域的专家和调度员,但是我们(作为Redis项目)需要特别指出这种问题在未来,与Redis Cluster一样,我们将有许多Redis实例同时在一个盒子中运行。 所以我在这里寻求帮助。

问题:

  • 内核:“Linux redis1 2.6.32-305-ec2#9-Ubuntu SMP Thu Apr 15 08:05:38 UTC 2010 x86_64 GNU / Linux”
  • 大量的可用RAM,没有其他进程执行重要的I / O。
  • 重要的是 ,在EC2大实例上运行,而不是真正的服务器。 我从来没有在非虚拟化的环境中看到类似的东西。 EC2实例是: “高内存超大实例17.1 GB内存,6.5 ECU(2个虚拟核心,每个3.25 EC2计算单元),420 GB本地实例存储,64位平台”

基本上,一旦你重新启动一个大的Redis实例,系统会变得很慢,你不能再在shell上input。 当Redis加载实例时,它使用100%的CPU(它尽可能快地加载数据)并顺序读取dump.rdb文件。 加载是CPU限制,而不是I / O限制,I / O不是特别高。

为什么地球上有两个CPU和大量RAM的盒子,没有交换磁盘上的东西,基本上应该停止工作这个工作负载?

我有一个印象,这与它是一个EC2实例有很大关系,所以与我使用的虚拟化技术有关,因为我一直加载Redis 24 GB数据集 ,没有任何问题(即使Redis的其他实例高负荷运转)。

感谢任何提示!

萨尔瓦多

编辑 :添加一些我从twitter收到的反馈:

从@ezmobius:@antirez首先要做的是从/ mnt或本地短暂的驱动器试试看,如果它的EBS flakiness,第二是要确保它不是“第一次写惩罚”(谷歌它),如果是你需要首先在磁盘的dd 0。

从@dvirsky:@antirez我正在这样ec2节点上运行许多redis实例。 我注意到bgsave有一些放缓,但不是这种现象。

“顶”的输出可能会产生一些线索。 在左上angular有一个标记为“%被盗”的字段,它反映了硬件CPU转移到同一物理盒上的其他客人的数量。 当pipe理程序决定将更多的CPU分配给另一个guest虚拟机时,尤其是当我执行一些长时间运行的CPU密集型任务时,我已经看到了这种缓慢的下降。

不知道这是否是你的问题,但值得检查。

我在EC2实例上遇到同样的问题。 这可能与Redis无关 – 当发生高IO时(例如,当redis加载转储文件时)。

在亚马逊论坛上看看这个主题: https : //forums.aws.amazon.com/thread.jspa? messageID =215406

我已经尝试了不同的内核/映像,现在它运行良好(在旧的2.6.21内核上)。

您应该检查当您遇到100%负载和冻结的shell时, top显示的CPU窃取(cpu线右侧的xx.x%st )。 窃取代表你的机器上有多less实际的CPU周期被虚拟机pipe理程序窃取,并被分配给另一台机器。 CPU窃取仅在虚拟化环境中相关。 我有微型实例的确切问题,基本上使我的实例大约1个小时左右(直到我的任务完成ofc)如果执行CPU密集型任务不可用。

您可以阅读Greg's Ramblings上的这篇文章,了解更多关于这个主题的信息 。 虽然如果你采取格雷格的话,这应该只发生在微型实例。