1)前言
????????最近在啟動數(shù)據(jù)庫的時候遇到了一個報錯,大概就是信號量不足的報錯,入職這么久還是這一次遇到這個問題,所以查了一些資料,記錄一下。
2)什么是信號量
? ??????信號量類似于一個計數(shù)器,主要用于控制多個進程對共享資源的訪問,以防止進程訪問特定的資源。網(wǎng)上看到一個比較容易理解的例子:停車場。如果停車場只能停三輛車,那么信號量就相當于3,進去一輛信號量就減1,出去一輛就加1,當為0時,就等待。每輛車就好比一個線程,停車場就是公共資源,信號量就是一個非負整數(shù)。在信號量上有兩種操作,wait和release,當wait時,要么通過并將信號量減1,要么等待知道信號量值為大于1或者超時。當為release時,對應(yīng)的就是車離開停車場,釋放了公共資源,信號量加1。
3)如何查看kernel.sem大小
? ? ? ? 第一種方法:執(zhí)行 cat /proc/sys/kernel/sem
? ? ? ? 執(zhí)行結(jié)果:250? ? ? ? 32000 ? ? ? ? 100?????????? 128
? ? ? ? 注:kernel.sem = SEMMSL SEMMNS SEMOPM SEMMNI,其參數(shù)含義:
? ??????SEMMSL :用于控制每個信號集的最大信號數(shù)量。
? ??????SEMMNS:用于控制整個 Linux 系統(tǒng)中信號(而不是信號集)的最大數(shù)。
? ??????SEMOPM: 內(nèi)核參數(shù)用于控制每個 semop 系統(tǒng)調(diào)用可以執(zhí)行的信號操作的數(shù)量。semop 系統(tǒng)調(diào)用(函? ? ? ? ? ? 數(shù))提供了利用一個 semop 系統(tǒng)調(diào)用完成多項信號操作的功能。一個信號集能夠擁有每個信號集中最大數(shù)? ? ? ? ? 量的SEMMSL 信號,因此建議設(shè)置 SEMOPM 等于SEMMSL 。
? ? ? ? SEMMNI:內(nèi)核參數(shù)用于控制整個 Linux 系統(tǒng)中信號集的最大數(shù)量。
? ? ? ? 第二種方法:執(zhí)行ipcs -ls
? ? ? ? ?執(zhí)行結(jié)果:
????????------ 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
? ? ? ? 第三種方法:執(zhí)行sys_ctl -a | grep kernel.sem
? ??????kernel.sem = 250 32000 32 128
4)如何修改kernel.sem
? ? ? ? 第一種方法:動態(tài)設(shè)置內(nèi)核參數(shù)
? ??????sysctl -w kernel.sem="250 32000 32 256"
? ? ? ? 第二種方法:永久生效,修改sysctl.conf文件
? ? ? ? echo "kernel.sem = 250 32000 32 256" >> /etc/sysctl.conf
? ? ? ? 執(zhí)行sysctl -p生效
? ??????