
現在,我知道如何:
- 尋找每個進程的開啟檔案限制:
ulimit -n
- 統計所有行程開啟的檔案數:
lsof | wc -l
- 取得允許的最大開啟檔案數:
cat /proc/sys/fs/file-max
我的問題是:為什麼Linux中有開啟檔案的限制?
答案1
原因是作業系統需要記憶體來管理每個開啟的文件,而記憶體是有限的資源——尤其是在嵌入式系統上。
ulimit -n
作為 root 用戶,您可以更改每個進程(通過)和每個系統(例如)的最大開啟檔案數echo 800000 > /proc/sys/fs/file-max
。
答案2
請注意,lsof | wc -l
總結了許多重複的條目(分叉進程可以共享檔案句柄等)。該數字可能遠高於 中設定的限制/proc/sys/fs/file-max
。
若要從 Linux 核心的角度取得目前開啟的檔案數,請執行下列操作:
cat /proc/sys/fs/file-nr
範例:該伺服器最多有 65536 個開啟文件,其中有 40096 個,儘管 lsof 報告的數字要大得多:
# cat /proc/sys/fs/file-max
65536
# cat /proc/sys/fs/file-nr
40096 0 65536
# lsof | wc -l
521504
答案3
我認為這主要是出於歷史原因。
Unix 檔案描述子是一個小值,由和int
等函數傳回,並傳遞給、、等。open
creat
read
write
close
至少在 Unix 的早期版本中,檔案描述符只是固定大小的每個進程結構數組的索引,其中每個結構都包含有關開啟檔案的資訊。如果我沒記錯的話,一些早期的系統將該表的大小限制為 20 左右。
更現代的系統有更高的限制,但保留了相同的總體方案,很大程度上是出於慣性。