當linux報 “-bash: fork: 無法分配內存”


“-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 

# Default limit for number of user's processes to prevent
# accidental fork bombs.
# See rhbz #432903 for reasoning.
*          soft    nproc     111111
root       soft    nproc     unlimited
 
[root@db-172-16-3-150 ~]# ulimit -u
131073
[root@db-172-16-3-150 ~]# su - postgres
postgres@db-172-16-3-150-> ulimit -u
111111
 
        
普通用戶用了/etc/security/limits.d/90-nproc.conf 軟限制的配置, 而root用戶用了/etc/security/limits.conf硬限制的配置.
如果是root打開進程數太多修改

   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 - 最大實時優先級

 注:可能導致這種錯誤的有很多很多,后面如有發現繼續更新


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM