Redis 和 Postgresql 在同一台機器上:vm.overcommit_memory=?
在 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
所以
postmaster
OOM殺手永遠不應該選擇它,但是子後端程序(每個連接一個)可以。