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


14

我收到了来自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上键入内容。当Redis加载实例时,它将使用100%的CPU(它会尽快加载数据)并顺序读取dump.rdb文件。I / O并不是特别高,因为加载受CPU约束,而不是I / O约束。

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

我觉得这与EC2实例有很大关系,这与所使用的虚拟化技术有关,因为我一直将Redis 24 GB数据集加载到我的盒子中而没有任何问题(即使是Redis的其他实例)高负载运行)。

感谢您的提示!

救世主

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

来自@ezmobius:@antirez首先要做的是从/ mnt或本地临时驱动器中进行尝试,以查看其EBS脆弱性,第二是确保其不是“首次写罚”(用谷歌搜索),如果是,那么您需要先在磁盘上dd 0。

来自@dvirsky:@antirez我正好在这样的ec2节点上运行许多redis实例。我注意到bgsave的速度有所下降,但没有出现这种现象。

Answers:


4

来自“ top”的输出可能会产生一些线索。左上角附近有一个字段,标记为“%偷”,它反映了转移到同一物理设备上的其他guest虚拟机的硬件CPU数量。当虚拟机管理程序决定为另一个来宾分配更多的CPU时,尤其是在执行一些长时间运行的CPU密集型任务时,我已经看到了这种类型的速度下降。

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


谢谢凯文,这非常有趣,我完全没有意识到这一点。
antirez 2011年

2

我在EC2实例上遇到了同样的问题。它可能与Redis无关-它发生在有大量IO的情况下(例如,当Redis加载转储文件时)。

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

我已经尝试过使用不同的内核/映像,现在可以正常运行(在旧的2.6.21内核上)。


谢谢mhdk,我的猜测也是与虚拟化+ Linux调度程序有关。即使磁盘I / O速度较慢,也看不到其他进程如果不使用磁盘且没有交换页面而阻塞的任何原因。尝试不同的内核/调度程序配置可能确实值得一试。
antirez 2011年

2

您应该检查CPU偷窃(xx.x%st在cpu行的右侧),该偷窃在top遇到100%负载和冻结外壳时显示。窃取表示虚拟机管理程序从您的计算机窃取了多少实际CPU周期并将其分配给另一台计算机。CPU盗用仅在虚拟化环境中相关。我在使用微实例时遇到了确切的问题,如果执行CPU密集型任务,它基本上会使我的实例在大约1个小时左右无法使用(直到我的任务完成为止)。

通过阅读有关Greg的Ramblings的文章,您可以找到有关此主题的更多信息。尽管如果您遵循Greg的话,这应该仅在微型实例上发生。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.