1. 程式人生 > >linux查看與修改交換內存配置(解決zabbix-agent啟動報錯)

linux查看與修改交換內存配置(解決zabbix-agent啟動報錯)

修改 上啟 報錯 mem 原因 mit sys space har

問題

zabbix-agent在一臺centos6.5上啟動報錯:

cannot allocate shared memory of size 949056: [28] No space left on device
cannot allocate shared memory for collector

檢查

# sysctl -a | grep shm
    kernel.shmmax = 33554432
    kernel.shmall = 2097152
    kernel.shmmni = 4096

kernel.shmmax 單個共享內存段的最大尺寸,單位byte
kernel.shmall 系統可分配共享內存段的最大值,單位是頁
kernel.shmmni 共享內存段的最大數量

還可以通過另一個命令查看:

# ipcs -l
    ------ Shared Memory Limits --------
    max number of segments = 4096
    max seg size (kbytes) = 32768
    max total shared memory (kbytes) = 8388608

max number of segments 對應 kernel.shmmni
max seg size (kbytes) 對應 kernel.shmmax (33554432 / 1024 = 32768)
max total shared memory (kbytes) 對應 kernel.shmall (可以計算出頁的大小了:8388608 * 1024 / 2097152 = 4096)

解決

下面開始分析問題,通過日誌可以看到zabbix-agent需要的交換內存大小是949056,遠小於kernel.shmmax(33554432),所以該參數沒問題;

用下面的命令可以查看交換內存的分配情況(為方便展示這裏是一臺正常運行了zabbix-agent的主機):

# ipcs -m
    ------ Shared Memory Segments --------
    key        shmid      owner      perms      bytes      nattch     status      
    0x6c0105b0 0          zabbix     600
365056 6

在此基礎上,統計下交換內存已經被用了多少(回到問題主機):

# ipcs -m | grep ‘^0x‘ | awk ‘{print $5} | awk ‘{sum+=$1}END{print sum}
    1805120

1805120,遠小於kernel.shmall(2097152 * 4096) ,所以該參數也沒問題;

到這裏已經只剩下一個原因,數量被占滿了:

# ipcs -m | grep ‘^0x‘ | wc -l                                           
    4096

這時候可以通過 ipcs -m 看看是哪些程序把數量占滿了,若有異常可以選擇用 ipcrm 釋放,都是正常占用的話就選擇提高最大數量(這裏提高到兩倍):

# sysctl -w kernel.shmmni=8192

若希望重啟系統後依舊有效,把該參數寫入配置文件:

# /etc/sysctl.conf
    kernel.shmmni=8192

(另兩個參數的修改方式是一樣的)

over

linux查看與修改交換內存配置(解決zabbix-agent啟動報錯)