「-bash: fork: 沒法分配內存」,發現連了好多終端,而後斷開了一個終端,而後這邊終端能夠敲命令了shell
[root@172.16.31.105 /home/www/test]# free -m
total used free shared buffers cached
Mem: 15979 8025 7954 0 218 1109
-/+ buffers/cache: 6697 9282
Swap: 0 0 0vim
臥槽,還有那麼多內存。。。很無語,而後又開始敲命令,結果又報剛纔那個問題「-bash: fork: 沒法分配內存」,另一個終端鏈接也出問題了bash
[root@172.16.31.102 ~]# ssh 172.16.31.105
shell request failed on channel 0 服務器
網上說老版本系統的內核pid參數比較小(默認設置的是32768),驗證了一下,而後我又斷開一個終端,這邊ps了一下ssh
[root@172.16.31.105 ~]# ps
PID TTY TIME CMD
32775 pts/1 00:00:00 bash
32765 pts/1 00:00:00 ps ide
很明顯ps的pid號明顯接近於內核默認pid了,當即修改內核pid,並讓其生效命令以下:post
echo "kernel.pid_max=64000" >>/etc/sysctl.conf大數據
sysctl -p 隊列
生效後,終端馬上就能夠直連這臺機器了。進程
再次驗證
找了另一臺機器,先多連幾個終端,以後將內核pid改小最好近似於當前pid最大值,改完生效後立刻問題就出來了 報 「-bash: fork: 沒法分配內存」 接着內核參數
注意:有的機器pid用的比較嚴重,敲好屢次命令都會報「-bash: fork: 沒法分配內存」 所以只能重啓服務器,運氣好的話多敲幾回命令就能夠看到。
(二)
還有種狀況是系統當前的的進程數 太多太多,報-bash: fork: 沒法分配內存
後來發現是由於非root用戶打開的進程數太多 解決方法
普通用戶的nproc必須配置這個文件才能生效
vi /etc/security/limits.d/90-nproc.conf
vim /etc/security/limits.conf
添加:
* soft nproc 32000
* hard nproc 32000
有關limits.conf參數的註釋
- core - 限制核心文件大小(KB)
- data - 最大數據大小(KB)
- fsize - maximum filesize(KB)
- memlock - 最大鎖定內存地址空間(KB)
- nofile - 最多打開的文件
- rss - max resident set size(KB)
- stack - 最大堆棧大小(KB)
- cpu - 最大CPU時間(MIN)
- nproc - 最大進程數
- as - 地址空間限制(KB)
- maxlogins - 此用戶的最大登陸號
- maxsyslogins - 系統上登陸的最大數量
- priority - 運行用戶進程的優先級
- locks - 用戶能夠容納的文件鎖的最大數量
- sigpending - 待處理信號的最大數量
- msgqueue - POSIX消息隊列使用的最大內存(字節)
- nice - 最大優先級容許提升到值:[-20,19]
- rtprio - 最大實時優先級
注:可能致使這種錯誤的有不少不少,後面若有發現繼續更新