Linux

PostgreSQL 伺服器啟動失敗:對共享記憶體段的請求超出了核心的 SHMMAX 參數

  • April 1, 2016

我將 PostgreSQL 的共享緩衝區(以及其他設置)增加到 4096M,現在 PostgreSQL 無法啟動,並給出以下錯誤消息。

我應該將核心的SHMMAX參數更改為4096M嗎?該系統有 16GB 的 RAM。這應該怎麼做?我應該改成SHMALL什麼?我希望更改是永久性的,並且在重新啟動後仍然存在。

* Starting PostgreSQL 9.1 database server                                       
* The PostgreSQL server failed to start. Please check the log output:

2013-04-15 06:15:53 UTC FATAL: could not create shared memory segment: Invalid argument 2013-04-15 06:15:53 UTC DETAIL: Failed system call was shmget(key=5432001, size=4418322432, 03600). 2013-04-15 06:15:53 UTC HINT: This error usually means that PostgreSQL's request for a shared memory segment exceeded your kernel's SHMMAX parameter. You can either reduce the request size or reconfigure the kernel with larger SHMMAX. To reduce the request size (currently 4418322432 bytes), reduce PostgreSQL's shared memory usage, perhaps by reducing shared_buffers or max_connections. If the request size is already small, it's possible that it is less than your kernel's SHMMIN parameter, in which case raising the request size or reconfiguring SHMMIN is called for. The PostgreSQL documentation contains more information about shared memory configuration.

自由

            total       used       free     shared    buffers     cached
Mem:      24744200    1244936   23499264          0      77480     670240
-/+ buffers/cache:     497216   24246984
Swap:     16775160          0   16775160

shared_buffers在我看來,您在預設配置中編輯了您。而且你有很多記憶體,所以你可能試圖比核心允許的更多。

所以創建一個像

/etc/sysctl.d/10-postgresql-shm.conf

然後裡面有以下

kernel.shmmax = 4414768

用你想放在那裡的數字替換數字。然後設置它執行以下

sudo sysctl -p

然後嘗試啟動postgresql

PostgreSQL 文件中,

最重要的共享記憶體參數是SHMMAX共享記憶體段的最大大小(以字節為單位)。如果您從 shmget 收到類似“無效參數”的錯誤消息,則可能已超出此限制。

$$ … $$雖然可以讓 PostgreSQL 以低至SHMMAX2 MB 的空間執行,但您需要更多的空間才能獲得可接受的性能。理想的設置是數百兆字節到幾千兆字節。

頁面下方是如何在 Linux 上進行更改的範例。要允許 8 GB:

$ sysctl -w kernel.shmmax=8589934592
$ sysctl -w kernel.shmall=2097152

如果可行,您可以通過編輯使設置在下次啟動時生效/etc/sysctl.conf

您選擇的值取決於您使用機器的其他用途。如果它是專用的 PostgreSQL 伺服器,請繼續並允許 PostgreSQL 將機器的大部分記憶體用於共享記憶體。如果您還打算在同一台機器上執行其他東西,那麼您可能想要更加保守。

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