我收到了一个Redis用户的报告,我不知道该怎么回答,因为我不是Linux领域的专家和调度员,但是我们(作为Redis项目)需要特别指出这种问题在未来,与Redis Cluster一样,我们将有许多Redis实例同时在一个盒子中运行。 所以我在这里寻求帮助。
问题:
基本上,一旦你重新启动一个大的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上的这篇文章,了解更多关于这个主题的信息 。 虽然如果你采取格雷格的话,这应该只发生在微型实例。