報錯信息
standard_init_linux.go:190: open exec fifo caused "too many open files in system"
-bash: start pipeline: pgrp pipe: Too many open files in system
-bash: /usr/bin/df: Too many open files inn system
-bash: cannot make pipe for command substitution: Too many open files in system
排查指令
查看系統(tǒng)參數(shù)
# 查看ulimt參數(shù)值
ulimit -a
# 查看fs.file-max參數(shù)值
sudo sysctl fs.file-max
cat /proc/sys/fs/file-nr
統(tǒng)計文件句柄
方法一 - /proc/PID/fd
# 查看所有進(jìn)程數(shù)量
find /proc -maxdepth 1 -type d -name '[0-9]*' | wc -l
# 降序顯示進(jìn)程打開文件句柄數(shù)量
for pid in $(find /proc -maxdepth 1 -type d -name '[0-9]*'); do fn=$(sudo ls -al ${pid}/fd | wc -l); echo "$pid $fn";done | sort -k2nr | head -n 20
# 查看PID持有的文件句柄數(shù)
sudo ls /proc/${PID}/fd | wc -l
方法二 - lsof
# 查看打開文件句柄總數(shù)
sudo lsof 2>/dev/null | awk '{print $2}'|wc -l
# 根據(jù)打開文件句柄數(shù)量降序顯示進(jìn)程ID
sudo lsof 2>/dev/null | awk '{print $2}'|sort|uniq -c|sort -nr|head
# 使用 lsof 命令查看特定進(jìn)程號(PID)打開的文件
sudo lsof -p <PID>
參考資料
https://docs.kernel.org/filesystems/proc.html
/proc/PID/fd: Directory, which contains all file descriptors
https://linux.die.net/man/8/lsof
limits.conf超過限制導(dǎo)致ssh失敗_docker里limits.conf設(shè)置太大宿主機(jī)ssh連不上-CSDN博客
- nofile的上限是由/proc/sys/fs/nr_open限制底挫,默認(rèn)是1048576,超過這個值會導(dǎo)致連接ssh失敗,報錯為:pam_limits(login:session): Could not set limit for ‘nofile’: Operation not permitted
- limits.conf 文件實際是 Linux PAM(插入式認(rèn)證模塊,Pluggable Authentication Modules)中 pam_limits.so的配置文件薄霜,只針對單個會話。在登錄shell時,根據(jù)配置文件設(shè)置limits的值艾帐,由于設(shè)定的值過大導(dǎo)致設(shè)置失敗,無法登錄shell盆偿,ssh自然無法連接柒爸。
Linux 下 Too many open files 問題排查與解決 - Grey Zeng - 博客園
too many open files問題排查與解決 - 掘金
How to Fix the ‘Too Many Open Files’ Error in Linux? | Windows OS Hub
Linux系統(tǒng)報錯排查:Too many open files in system
補(bǔ)充信息
/proc/sys/fs/file-nr
/proc/sys/fs/file-nr
文件是 Linux 系統(tǒng)中的一個虛擬文件,提供了有關(guān)系統(tǒng)打開文件句柄(file handles)的一些統(tǒng)計信息事扭。它的內(nèi)容通常由三個數(shù)字組成捎稚,分別表示以下信息:
- 已分配的文件句柄數(shù)量:這是系統(tǒng)當(dāng)前已分配的文件句柄的數(shù)量,包括所有打開的文件、套接字等今野。
- 已使用的文件句柄數(shù)量:這是當(dāng)前正在使用的文件句柄數(shù)量晰奖。這表示當(dāng)前有多少個文件或套接字處于打開狀態(tài)。
- 最大文件句柄數(shù)量:這是系統(tǒng)允許的最大文件句柄數(shù)量腥泥,通常由內(nèi)核參數(shù)
fs.file-max
決定匾南。這個值可以通過修改/etc/sysctl.conf
文件或使用sysctl
命令來調(diào)整。
示例內(nèi)容
假設(shè) /proc/sys/fs/file-nr
的內(nèi)容如下:
1234 567 8192
這表示:
- 1234:當(dāng)前已分配的文件句柄數(shù)量蛔外。
- 567:當(dāng)前正在使用的文件句柄數(shù)量蛆楞。
- 8192:系統(tǒng)允許的最大文件句柄數(shù)量。
使用場景
- 性能監(jiān)控:通過監(jiān)控這些值夹厌,可以了解系統(tǒng)的文件句柄使用情況豹爹,從而判斷是否需要調(diào)整最大文件句柄數(shù)量。
- 故障排除:如果應(yīng)用程序遇到“文件描述符不足”錯誤矛纹,可以檢查這些值來確定是否達(dá)到了系統(tǒng)限制臂聋。
訪問方式
你可以通過以下命令查看 /proc/sys/fs/file-nr
的內(nèi)容:
cat /proc/sys/fs/file-nr
ulimit
ulimit
是一個用于控制 shell 中用戶進(jìn)程的資源限制的命令。它可以設(shè)置或顯示用戶可以使用的系統(tǒng)資源的限制或南,包括文件大小孩等、進(jìn)程數(shù)量、內(nèi)存使用等采够。以下是一些常用的 ulimit
命令和選項:
常用選項
- 查看當(dāng)前限制:
ulimit -a
這會顯示所有的資源限制肄方,包括文件大小、進(jìn)程數(shù)量等蹬癌。 - 設(shè)置文件大小限制:
ulimit -f [size]
這會設(shè)置用戶可以創(chuàng)建的最大文件大小权她,單位為塊(通常是 512 字節(jié))。 - 設(shè)置最大進(jìn)程數(shù):
ulimit -u [number]
這會設(shè)置用戶可以創(chuàng)建的最大進(jìn)程數(shù)量逝薪。 - 設(shè)置最大打開文件數(shù):
ulimit -n [number]
這會設(shè)置用戶可以打開的最大文件數(shù)量隅要。 - 設(shè)置最大虛擬內(nèi)存:
ulimit -v [size]
這會設(shè)置用戶進(jìn)程可以使用的最大虛擬內(nèi)存,單位為 KB董济。 - 設(shè)置最大堆棧大胁角濉:
ulimit -s [size]
這會設(shè)置用戶進(jìn)程的最大堆棧大小,單位為 KB感局。
示例
- 查看所有限制:
ulimit -a
- 設(shè)置最大打開文件數(shù)為 2048:
ulimit -n 2048
注意事項
-
ulimit
的設(shè)置通常只對當(dāng)前 shell 會話有效尼啡,關(guān)閉 shell 后設(shè)置將失效。如果需要永久更改询微,可以將相應(yīng)的 ulimit 命令添加到用戶的 shell 啟動文件(如~/.bashrc
或/etc/security/limits.conf
)崖瞭。
nofile 和 fs.file-max
nofile
和fs.file-max
都與文件描述符的管理有關(guān),但它們的作用和定義有所不同撑毛。以下是它們的區(qū)別和聯(lián)系:
1. nofile 參數(shù)
- 定義:nofile 是一個用戶級的資源限制书聚,表示每個用戶進(jìn)程可以打開的最大文件描述符的數(shù)量唧领。
- 設(shè)置方式:可以通過 ulimit -n [number] 命令設(shè)置,或者在用戶的 shell 啟動文件(如 ~/.bashrc)中配置雌续。
- 作用范圍:適用于每個用戶和每個進(jìn)程斩个。每個用戶都可以有自己的限制,限制的值可以根據(jù)需要進(jìn)行調(diào)整驯杜。
2. fs.file-max 參數(shù)
- 定義:fs.file-max 是一個系統(tǒng)級的參數(shù)受啥,表示系統(tǒng)可以同時打開的最大文件描述符的總數(shù)量。
- 設(shè)置方式:可以通過 /etc/sysctl.conf 文件進(jìn)行配置鸽心,或使用 sysctl -w fs.file-max=[number] 命令動態(tài)設(shè)置滚局。
- 作用范圍:適用于整個系統(tǒng),影響所有用戶和進(jìn)程顽频。
區(qū)別
- 作用層級:nofile 是針對單個用戶或進(jìn)程的限制藤肢,而 fs.file-max 是針對整個系統(tǒng)的限制。
- 設(shè)置方式:nofile 是通過 ulimit 設(shè)置的糯景,而 fs.file-max 是通過 sysctl 設(shè)置的嘁圈。
聯(lián)系
- 相互關(guān)系:nofile 的值不能超過 fs.file-max 的值。如果 nofile 設(shè)置得過高蟀淮,可能會導(dǎo)致系統(tǒng)無法處理更多的文件描述符最住,從而觸發(fā)錯誤。
- 性能監(jiān)控:監(jiān)控這兩個參數(shù)可以幫助系統(tǒng)管理員了解系統(tǒng)的文件描述符使用情況灭贷,并根據(jù)需要進(jìn)行調(diào)整温学。
示例
- 查看當(dāng)前用戶的最大打開文件數(shù):
ulimit -n
- 查看系統(tǒng)的最大文件描述符數(shù):
cat /proc/sys/fs/file-max