修復 Linux 中的“開啟檔案過多”錯誤


摘要

在負載較重的 Linux 伺服器上,經常會遇到“開啟檔案過多”的問題。這表示某個程序無法開啟新的檔案(檔案描述符),因為它已經打開了過多的檔案。“最大開啟檔案限制”是 Linux 上每個程序或使用者預設預先設定的,並且設定值較低。

併發檔案描述符使用者和程序的數量是有限制的。當用戶或程序嘗試開啟更多檔案描述符時,達到此限制就會出現“開啟檔案過多”錯誤。

因此,解決此問題的辦法是增加使用者或程序可以開啟的檔案描述符的最大數量。

注意 − Linux 命令區分大小寫。

檔案描述符

程序用來標識已開啟檔案的無符號整數稱為檔案描述符。

sys/limits.h 檔案中包含的 /OPEN MAX 控制元件設定了程序可以使用檔案描述符數量的限制。ulimit -n 引數也控制檔案描述符的數量。子程式 open、pipe、creat 和 fcntl 都會生成檔案描述符。大多數情況下,檔案描述符是特定於每個程序的。但是,它們有時可以由 fork 子程式建立的子程序共享,或者由 fcntl、dup 和 dup2 子程式複製。

檔案描述符是核心為每個程序在其 u 塊區域中維護的檔案描述符資料庫的索引。開啟和建立操作以及從父程序繼承是最常見的程序獲取檔案描述符的方法。當發生 fork 操作時,子程序的描述符表會被複制,使其能夠平等地訪問父程序使用的檔案。

檔案描述符限制

程序一次可以開啟的檔案描述符數量有限制。一個是軟限制,它永遠不能超過硬限制,並且可以由任何非特權使用者調整。非特權使用者可以降低硬限制,但不能再次提高它,而特權使用者(如 root)可以根據需要提高和降低它。

示例

執行以下命令以驗證當前會話的檔案描述符限制。

$ ulimit -n 

輸出

1024 

如上所示,上限是 1024。

示例

現在讓我們執行以下命令來檢查使用者限制:

$ ulimit -u 

輸出

31211

示例

使用以下命令找出當前開啟的檔案數量:

$ lsof  |  wc  -l

輸出

363869

示例

要分別檢查當前會話的軟限制和硬限制,我們使用帶 -Sn 和 -Hn 標誌的 ulimit 命令:

$ ulimit -Sn

輸出

1024
$ ulimit -Hn

輸出

4096

增加檔案描述符限制

讓我們嘗試使用 ulimit -n 命令來設定當前會話的限制:

示例

$ ulimit -n 4096
$ ulimit -n 

輸出

4096

透過對 /etc/security/limits.conf 檔案進行一些更改並重新登入,我們可以全域性地修改所有程序的軟限制和硬限制:

*         hard    nofile       500000
*         soft    nofile       500000
root      hard    nofile       500000
root      soft    nofile       500000

結論

在本教程中,我們學習了一些修復 Linux 中“開啟檔案過多”錯誤的示例。任何 Linux 使用者都可以快速修復此問題。隨意嘗試 Linux 提供的任何方法來解決此問題,以消除此錯誤。上述步驟適用於各種 Linux 發行版。所有作業系統都必須將檔案描述符作為基本元素。

我希望您發現這些命令示例有用,並有助於探索 Linux

更新於:2023年3月23日

27K+ 瀏覽量

啟動您的 職業生涯

完成課程獲得認證

開始
廣告