為什麼 Linux 中開啟檔案的數量受到限制?

為什麼 Linux 中開啟檔案的數量受到限制?

現在,我知道如何:

  • 尋找每個進程的開啟檔案限制: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等函數傳回,並傳遞給、、等。opencreatreadwriteclose

至少在 Unix 的早期版本中,檔案描述符只是固定大小的每個進程結構數組的索引,其中每個結構都包含有關開啟檔案的資訊。如果我沒記錯的話,一些早期的系統將該表的大小限制為 20 左右。

更現代的系統有更高的限制,但保留了相同的總體方案,很大程度上是出於慣性。

相關內容