【问题标题】:Redis process was killed by OS, Is there a bug?Redis 进程被操作系统杀死了,有问题吗?
【发布时间】:2020-03-17 20:36:04
【问题描述】:

Redis 进程突然消失了。

我试图重新启动它,但又被杀死了(见下文):

/usr/local/bin/redis-server /etc/redis.conf
Killed

以下是日志内容,无一例外。

> [19724] 26 Nov 10:45:29.457 # Server started, Redis version 2.6.16
> [19724] 26 Nov 10:46:13.172 * DB loaded from disk: 43.715 seconds
> [19724] 26 Nov 10:46:13.182 * The server is now ready to accept
> connections on port 6379

dump.rdb 文件为 1.5GB,并且有大约 5GB 可用 RAM(我认为这已经足够了)。

我注意到当 Redis 加载数据库时,可用 RAM 从 5GB 减少到 0。在它被杀死后,空闲 RAM 再次变为 5GB。

为什么 1.5GB dump.rdb 需要 5GB RAM,这是一个错误吗? 如何解决这个问题呢?我不想删除当前的dump.rdp,有一些重要的数据。

操作系统版本:Ubuntu 12.04.1 LTS 64bit

Redis 版本:2.6.16

【问题讨论】:

    标签: ubuntu redis


    【解决方案1】:

    dump.rdb 的大小与 RAM 使用率不是 1:1。见Why a 500MB Redis dump.rdb file takes about 5.0GB memory?。

    Redis 好像被OOM杀死了。

    牺牲一个或多个是 linux“oom 杀手”的工作 进程以便在其他所有情况下为系统释放内存 失败。它还将杀死任何共享相同 mm_struct 的进程 选择的过程,原因很明显。

    如果您的 Redis 数据集大于可用 RAM,在您的情况下,OOM 将尝试释放内存并将其杀死。您可以在 Redis 上禁用 OOM:

    任何特定的进程领导者都可以免疫 oom 杀手 如果其 /proc//omadj 的值设置为常量 OOM_DISABLE(目前定义为-17)。

    ...请参阅How to Configure the Linux Out-of-Memory Killer,但如果可用内存不足,您的服务器将开始交换。

    因此,您可能希望使用redis-rdb-tool 或rdb2csv 等工具来分析和导出有价值的数据,或者使用内存更大的服务器。

    【讨论】:

    • 非常感谢!我们可以设置 Redis 服务器可以使用的最大 RAM 大小吗?例如4GB。如果数据集大于 4GB,则将新数据保存到磁盘中。 Redis被称为RAM + Disk,难道这个磁盘只是用来存储dump数据的?
    • 是的,您可以在 redis 配置文件中使用 maxmemory `maxmemory-policy` 参数设置最大 RAM sie。
    • “Redis 不完全是 RAM + Disk”,Redis 只是内存数据库(所有数据集必须存在于内存中),磁盘仅用于持久化。
    • 我可以使用 Swap 来避免这样的问题吗?
    • 嗯,这真的不是一个好主意,交换会让你的系统真的很慢(如果不是不稳定的话)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多