“-bash: fork: 無法分配內存”,發現連了好多終端,然后斷開了一個終端,然后這邊終端可以敲命令了
查看最大進程數 sysctl kernel.pid_max
查看進程數 ps -eLf | wc -l
確認是進程數滿了
修改最大進程數后系統恢復
echo 1000000 > /proc/sys/kernel/pid_max
永久生效
echo "kernel.pid_max=1000000 " >> /etc/sysctl.confsysctl -p
老版本系統的內核pid參數比較小(默認設置的是32768),驗證了一下,然后我又斷開一個終端,這邊ps了一下
[root@172.16.31.105 ~]# ps
PID TTY TIME CMD
32775 pts/1 00:00:00 bash
32765 pts/1 00:00:00 ps
很明顯ps的pid號明顯接近於內核默認pid了,立即修改內核pid,並讓其生效命令如下:
echo "kernel.pid_max=64000" >>/etc/sysctl.confsysctl -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 - 最大實時優先級
注:可能導致這種錯誤的有很多很多,后面如有發現繼續更新