zabbix監控PostgreSQL服務器時unable to create mutex for log file

打算用zabbix監控PostgreSQL服務器。數據庫

裝上agent以後,卻發現啓動不了,日誌裏面報錯以下:服務器

zabbix_agentd [10555]: cannot create Semaphore: [28] No space left on device多線程

zabbix_agentd [10555]: unable to create mutex for log fileide

google搜索了一下,發現是信號量不足
函數

修改/etc/sysctl.confgoogle

添加以下行:spa

kernel.sem = 500        64000   64      256線程

修改以後,執行sysctl -p /etc/sysctl.conf使其生效。日誌

這樣就把系統默認的信號量擴大了一倍orm

啓動就成功了,其餘機器沒有出現這種狀況,多是PG太佔信號量了吧


下面是搜索到的信號量的相關知識:


信號量 
信號量(Semaphore),有時被稱爲信號燈,是在多線程環境下使用的一種設施, 它負責協調各個線程, 以保證它們可以正確、合理的使用公共資源。
Semaphore分爲單值和多值兩種,前者只能被一個線程得到,後者能夠被若干個線程得到。
以一個停車場是運做爲例。爲了簡單起見,假設停車場只有三個車位,一開始三個車位都是空的。這時若是同時來了五輛車,看門人容許其中三輛不受阻礙的進入,而後放下車攔,剩下的車則必須在入口等待,此後來的車也都不得不在入口處等待。這時,有一輛車離開停車場,看門人得知後,打開車攔,放入一輛,若是又離開兩輛,則又能夠放入兩輛,如此往復。
在這個停車場系統中,車位是公共資源,每輛車比如一個線程,看門人起的就是信號量的做用。
更進一步,信號量的特性以下:信號量是一個非負整數(車位數),全部經過它的線程(車輛)都會將該整數減一(經過它固然是爲了使用資源),當該整數值爲零時,全部試圖經過它的線程都將處於等待狀態。在信號量上咱們定義兩種操做: Wait(等待) 和 Release(釋放)。 當一個線程調用Wait(等待)操做時,它要麼經過而後將信號量減一,要麼一直等下去,直到信號量大於一或超時。Release(釋放)其實是在信號量上執行加操做,對應於車輛離開停車場,該操做之因此叫作「釋放」是由於加操做其實是釋放了由信號量守護的資源。


查看kernel.sem大小

sem實際上是semaphores的縮寫,查看當前設置
#cat /proc/sys/kernel/sem

250                         32000         100           128

或者

#sysctl -a|grep kernel.sem
error: permission denied on key 'kernel.cad_pid'
kernel.sem = 250    32000    32    128

或者 

# ipcs -ls
------ Semaphore Limits --------
max number of arrays = 128
max semaphores per array = 250
max semaphores system wide = 32000
max ops per semop call = 32
semaphore max value = 32767

參數含義

上面的4個數據分別對應:SEMMSL、SEMMNS、SEMOPM、SEMMNI這四個核心參數,具體含義和配置以下。

SEMMSL :用於控制每一個信號集的最大信號數量。
Oracle 建議將 SEMMSL 設置爲 init.ora 文件(用於 Linux 系統中的全部數據庫)中的最大 PROCESS 實例參數的設置值再加上 10 。此外, Oracle 建議將 SEMMSL 的值設置爲很多於 100 。
SEMMNS:用於控制整個 Linux 系統中信號(而不是信號集)的最大數。
Oracle 建議將 SEMMNS 設置爲:系統中每一個數據庫的 PROCESSES 實例參數設置值的總和,加上最大 PROCESSES 值的兩倍,最後根據系統中 Oracle 數據庫的數量,每一個加 10 。
使用如下計算式來肯定在 Linux 系統中能夠分配的信號的最大數量。它將是如下二者中較小的一個值:SEMMNS 或  (SEMMSL * SEMMNI)

SEMOPM: 內核參數用於控制每一個 semop 系統調用能夠執行的信號操做的數量。semop 系統調用(函數)提供了利用一個 semop 系統調用完成多項信號操做的功能。一個信號集可以擁有每一個信號集中最大數量的SEMMSL 信號,所以建議設置 SEMOPM 等於SEMMSL 。
Oracle 建議將 SEMOPM 的值設置爲很多於 100 。 

SEMMNI :內核參數用於控制整個 Linux 系統中信號集的最大數量。Oracle 建議將 SEMMNI 的值設置爲很多於 100 。
 

相關文章
相關標籤/搜索