Redis 和 Postgresql 在同一台机器上:vm.overcommit_memory=?

Nie*_*ian 3 postgresql sysctl redis

在 Redis 文档中,它明确指出vm.overcommit_memory应设置1为确保后台保存更新失败:http://redis.io/topics/faq

然而

在 postgresql 文档中,它说,vm.overcommit_memory应该设置2为避免 post master 进程不会被 oom 杀手杀死:http://www.postgresql.org/docs/9.3/static/kernel-resources.html

现在看来,这是自相矛盾的。我应该怎么办?

我的 redis 数据库的限制为 20GB。服务器拥有 252GB 物理 RAM。Postgresql 很少使用超过 100GB 的物理内存。

PS:我使用的是 ubuntu 14、Redis 3.0 和 Postgresql 9.3

Dan*_*ité 5

您可以选择 Redis 推荐,因为 Ubuntu 的 PostgreSQL 软件包已经实现了文档中提到的方法,以防止不明智的 OOM 终止 postmaster 进程。

它就在您在文档中引用的部分之后。摘自Linux 内存过量使用

另一种方法(可以在更改或不更改 vm.overcommit_memory 的情况下使用)是将 postmaster 进程的特定于进程的 oom_score_adj 值设置为 -1000,从而保证它不会成为 OOM 杀手的目标。最简单的方法是执行

echo -1000 > /proc/self/oom_score_adj

在调用 postmaster 之前的 postmaster 启动脚本中。注意此操作必须以root身份执行,否则不会有任何效果;因此,root 拥有的启动脚本是最简单的地方。如果您这样做,您可能还希望构建 PostgreSQL,并将 -DLINUX_OOM_SCORE_ADJ=0 添加到 CPPFLAGS。这将导致 postmaster 子进程以正常的 oom_score_adj 值为零运行,以便 OOM 杀手仍然可以根据需要瞄准它们。

在 Ubuntu 14 上,pg_ctlcluster启动 postgres 实例的脚本如下:

   # have the postmaster start with increased OOM killer protection; 9.1 and
    # later has builtin support for resetting the adjustment of child processes
    if ($action eq 'start' && $version >= '9.1') {
        if (-w '/proc/self/oom_score_adj') {
            open F, '>/proc/self/oom_score_adj';
            print F "-900\n";
            close F;
        }
    }
Run Code Online (Sandbox Code Playgroud)

所以它-900为邮政局长的 OOM 分数分配一个固定值,

/usr/lib/postgresql/9.3/bin/pg_config pg_config --cflags说:

-g -O2 -fstack-protector --param=ssp-buffer-size=4 -Wformat -Werror=format-security -fPIC -pie -I/usr/include/mit-krb5 -DLINUX_OOM_SCORE_ADJ=0 -fno-omit-帧指针 -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement -Wendif-labels -Wmissing-format-attribute -Wformat-security -fno-strict-aliasing -fwrapv -fexcess- precision=standard -g

因此,postmasterOOM 杀手永远不应该选择该进程,但子后端进程(每个连接一个)可以。