postgresql安裝過程中核心資源的配置

lusklusklusk發表於2019-07-01

官方文件https://www.postgresql.org/docs/current/kernel-resources.html 


以下僅針對linux系統 (其他系統請參考上面的官方文件連結),涉及/etc/security/limits.conf、/etc/sysctl.conf、/etc/systemd/logind.conf檔案對應的引數


1、共享記憶體和訊號量Shared Memory and Semaphores

修改/etc/sysctl.conf檔案,linux一般只修改如下兩個引數即可,其中kernel.shmmax值和shared_buffers一樣,一般設定為實體記憶體的40%即可,其他的引數的預設值非常大,通常不需要更改。

kernel.shmmax=XXX

kernel.shmall=XX


SHMMAX:共享記憶體段的最大大小,單位bytes

SHMALL:可用共享記憶體的總數,單位bytes的話值和SHMMAX一樣,單位是pages的話值等於SHMMAX/PAGE_SIZE


linux檢視Block size大小的方法

tune2fs -l /dev/sda1 |grep 'Block size'


linux檢視Page size大小的方法

getconf PAGESIZE



2、systemd RemoveIPC

修改/etc/systemd/logind.conf檔案,增加RemoveIPC=no即可


在RHEL7.2中,systemd-logind 服務引入了一個新特性,該新特性是:當一個user完全退出os之後,remove掉這個user所有的IPC objects。系統使用者除外。“系統使用者”由/etc/login.defs中的SYS_UID_MAX設定確定。該特性由/etc/systemd/logind.conf引數檔案中RemoveIPC選項來控制。



3、資源限制Resource Limits

修改/etc/security/limits.conf檔案,主要是限制每個使用者的程式數,每個程式開啟的檔案數,示例如下

postgres  soft  nproc   2047

postgres  hard  nproc   16384

postgres  soft  nofile  1024

postgres  hard  nofile  65536



4、Linux記憶體過量使用Linux Memory Overcommit

修改/etc/sysctl.conf檔案,增加vm.overcommit_memory=2


Linux對大部分申請記憶體的請求都回復"yes",以便能跑更多更大的程式。因為申請記憶體後,並不會馬上使用記憶體。這種技術叫做 Overcommit。當linux發現記憶體不足時,會發生OOM killer(OOM=out-of-memory)。它會選擇殺死一些程式(使用者態程式,不是核心執行緒),以便釋放記憶體。

在Linux 2.4及更高版本中,預設的虛擬記憶體行為對於PostgreSQL不是最優的。由於核心實現記憶體過度提交的方式,如果PostgreSQL或其他程式的記憶體需求導致系統耗盡虛擬記憶體,核心可能會終止PostgreSQL postmaster(主伺服器程式)。如果記憶體緊張,增加作業系統的交換空間可以幫助避免這個問題,因為只有當實體記憶體和交換空間耗盡時才會呼叫記憶體不足(out- memory, OOM)殺手。如果PostgreSQL本身是導致系統記憶體不足的原因,那麼可以透過更改配置來避免這個問題。最好減少max_connections,而使用外部連線池軟體。在Linux 2.6及更高版本上,可以修改核心的行為sysctl -w vm.overcommit_memory=2。

overcommit_memory可選值:0、1、2。

0, 表示核心將檢查是否有足夠的可用記憶體供應用程式使用;如果有足夠的可用記憶體,記憶體申請允許;否則,記憶體申請失敗,並把錯誤返回給應用程式。

1, 表示核心允許分配所有的實體記憶體,而不管當前的記憶體狀態如何。

2, 表示核心允許分配超過所有實體記憶體和交換空間總和的記憶體 



5、大頁記憶體Linux Huge Pages

系統支援大頁記憶體的情況下 ,修改/etc/sysctl.conf檔案,增加vm.nr_hugepages=XX,即啟用大頁記憶體。


PostgreSQL中大頁記憶體的預設行為是儘可能使用它們,並在失敗時回退到正常頁面 。要強制使用大頁記憶體,可以在postgresql.conf中將huge_pages設定為on。


檢視記憶體是否支援大頁記憶體,cat /proc/meminfo檢視是否有PageTables、HugePages_Total、Hugepagesize、HugePages_Free、HugePages_Rsvd等項,如果沒有,需要核心配置CONFIG_HUGETLBFS=y、CONFIG_HUGETLB_PAGE=y支援大記憶體頁


確定vm.nr_hugepages值的方法

$ head -1 $PGDATA/postmaster.pid

4170

$ pmap 4170 | awk '/rw-s/ && /zero/ {print $2}'

6490428K

$ grep ^Hugepagesize /proc/meminfo

Hugepagesize:       2048 kB

以上6490428/2048=3170,所以編輯/etc/sysctl.conf檔案修改vm.nr_hugepages=3170


oracle的演算法

# grep Hugepagesize /proc/meminfo

For example, if /proc/meminfo lists the large page size as 2 MB, and the total SGA size for the instance is 1.6 GB, then set the value for the vm.nr_hugepages kernel parameter to 820 (1.6 GB / 2 MB = 819.2).

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/30126024/viewspace-2649259/,如需轉載,請註明出處,否則將追究法律責任。

相關文章