Postgresql

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

  • February 16, 2016

在 Redis 文件中,它明確指出vm.overcommit_memory應該設置1為確保後台保存更新失敗:http ://redis.io/topics/faq

然而

在 postgresql 文件中它說,vm.overcommit_memory應該設置2為避免後主程序不會被 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

您可能會選擇 Redis 建議,因為 Ubuntu 的 PostgreSQL 包已經實現了文件中提到的方法,以防止不明智的 OOM 殺死 postmaster 程序。

它就在您在文件中引用的部分之後。摘自Linux 記憶體過量使用

另一種方法(無論是否更改 vm.overcommit_memory 都可以使用)是將 postmaster 程序的特定於程序的 oom_score_adj 值設置為 -1000,從而保證它不會成為 OOM 殺手的目標。最簡單的方法是執行

迴聲 -1000 > /proc/self/oom_score_adj

在呼叫 postmaster 之前在 postmaster 的啟動腳本中。請注意,此操作必須以 root 身份執行,否則將不起作用;所以 root 擁有的啟動腳本是最簡單的地方。如果您這樣做,您可能還希望在 CPPFLAGS 中添加 -DLINUX_OOM_SCORE_ADJ=0 來建構 PostgreSQL。這將導致 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;
       }
   }

所以它為-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殺手永遠不應該選擇它,但是子後端程序(每個連接一個)可以。

引用自:https://serverfault.com/questions/755772