致命錯(cuò)誤:無(wú)法創(chuàng)建信號(hào)量
1、問(wèn)題現(xiàn)象
數(shù)據(jù)庫(kù)啟動(dòng)時(shí)報(bào)錯(cuò)如下:
提示: 該錯(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 |
或使用命令語(yǔ)句進(jìn)入管理員用戶修改:
alter system set max_connections = 500; |
修改該數(shù)據(jù)庫(kù)參數(shù)重啟數(shù)據(jù)庫(kù)生效。
pg_ctl restart |
(2)調(diào)大內(nèi)核配置 kernel.sem
[root@zeng ]# cat /proc/sys/kernel/sem |
輸出的4個(gè)值分別對(duì)應(yīng)如下內(nèi)核信號(hào)量參數(shù):
semmsl 250 max semaphores per array每個(gè)信號(hào)量集中的最大信號(hào)量數(shù)。 |
通過(guò)以下系統(tǒng)命令修改: