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 file

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

修改/etc/sysctl.conf

添加如下行:

kernel.sem = 500        64000   64      256

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

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

啓動就成功了,其他機器沒有出現這種情況,可能是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 。
 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章