致命錯(cuò)誤:無(wú)法創(chuàng)建信號(hào)量

1、問(wèn)題現(xiàn)象

數(shù)據(jù)庫(kù)啟動(dòng)時(shí)報(bào)錯(cuò)如下:

img

提示: 該錯(cuò)誤信息不表示磁盤空間已經(jīng)用完,導(dǎo)致該錯(cuò)誤信息可能有如下兩方面原因:

1)超過(guò)系統(tǒng)對(duì)于最大數(shù)量信號(hào)燈集合(由參數(shù)SEMMNI表示);

2)對(duì)系統(tǒng)范圍內(nèi)最大可使用信號(hào)燈(由參數(shù) SEMMNS 表示)的限制。

可通過(guò)增加這兩個(gè)系統(tǒng)核心參數(shù)的值解決,也可通過(guò)降低PostgreSQL參數(shù) max_connections 的值來(lái)減少它所消耗的信號(hào)燈總數(shù)。

kernel.sem信號(hào)量是一種鎖機(jī)制用于協(xié)調(diào)進(jìn)程之間互斥的訪問(wèn)臨界資源,以確保某種共享資源不被多個(gè)進(jìn)程同時(shí)訪問(wèn)。數(shù)據(jù)庫(kù)使用信號(hào)量來(lái)管理對(duì)操作系統(tǒng)資源的訪問(wèn)(比如內(nèi)存共享段),若所有數(shù)據(jù)庫(kù)進(jìn)程所需的信號(hào)量不足,會(huì)導(dǎo)致數(shù)據(jù)庫(kù)無(wú)法啟動(dòng)或者運(yùn)行時(shí)出錯(cuò)。

2、解決方案

可通過(guò)以下任一方法解決此問(wèn)題:

(1)減小max_connections大小

max_connections 參數(shù)控制最大連接數(shù);通過(guò)以下方式修改max_connections:

[highgo@hgdb data]$ vi $PGDATA/postgresql.auto.conf
max_connections = 500

或使用命令語(yǔ)句進(jìn)入管理員用戶修改:

alter system set max_connections = 500;

修改該數(shù)據(jù)庫(kù)參數(shù)重啟數(shù)據(jù)庫(kù)生效。

pg_ctl restart

img

(2)調(diào)大內(nèi)核配置 kernel.sem

[root@zeng ]# cat /proc/sys/kernel/sem

250 32000 100 200

輸出的4個(gè)值分別對(duì)應(yīng)如下內(nèi)核信號(hào)量參數(shù):

semmsl 250 max semaphores per array每個(gè)信號(hào)量集中的最大信號(hào)量數(shù)。

semmns 32000 max semaphores system wide 整個(gè)系統(tǒng)中的最大信號(hào)量數(shù)。

semopm 100 max ops per semop call 調(diào)用單個(gè)信號(hào)集中最大信號(hào)數(shù)量。

semmni 200 max number of arrays 信號(hào)量集最大數(shù)。

通過(guò)以下系統(tǒng)命令修改:

img