當文件被打開以供訪問時,操作系統會臨時為其分配一個稱為文件句柄的編號。 主內存的一個特殊區域是為文件句柄保留的,這個區域的大小決定了一次可以打開多少個文件。 Linux 上的進程受到許多約束的限制,這些約束也阻止它們正確執行,並且每個進程都有幾個與之相關的限制。 shell 限制了程序可以同時打開的文件句柄數。 在本文中,我將向您展示可用於更改 Linux 中打開文件限制數量的不同方法。
為什麼要限制打開文件的數量
由於操作系統需要內存來管理每個文件,因此您可能會面臨可以打開的文件數量的限制。 作為程序也可以 close 文件處理程序,它可以創建任意大的文件,直到所有可用磁盤空間已滿。 在這種情況下,安全的一方面是通過施加限制來防止資源耗盡。
在 Linux 下,有兩種限制:
- 柔軟的 限制 是進程可以隨時更改的值。
- 難的 限制 標記不能通過設置軟限制超過的最大值
您可以在 Linux 系統上看到最大打開的文件描述符數,如下所示:
# cat /proc/sys/fs/file-max
100576
該值顯示用戶每個登錄會話可以打開的文件數,但您應該注意到結果可能因您的系統而異。 由於某些原因,您可能需要增加限制集的值。 這就是為什麼您的 Linux 系統提供了通過更改每個進程和每個系統的最大打開文件數來修改這些限制的可能性(增加或減少)。
1) ulimit 命令
ulimit 命令可用於增加可在 shell 中打開的文件數。 這個命令是一個 bash 內置命令,所以它只影響 bash 和從它啟動的程序。 ulimit 語法如下:
ulimit [options [limit]]
選項定義了被限制的內容。 您可以看到一些選項,如下所示
-a
(當前設置通過):使 ulimit 報告其當前設置。-f
(File Limits) 限制了 shell 可能創建的文件的大小-n
限制打開的文件描述符的數量。-H
和-S
(Hard and Soft Limits) 選項修改其他選項,使它們分別設置為硬限製或軟限制。 硬限制可能不會隨後增加,但軟限制可能會增加。 如果這兩個選項均未提供,則 ulimit 將為指定的功能設置硬限制和軟限制。
因此,要查看當前限制,您可以執行以下操作:
$ ulimit -a | grep open
open files (-n) 1024
您可以檢查硬限制如下:
$ ulimit -Hn
4096
和軟限制如下:
$ ulimit -Sn
1024
您可以編輯限制如下
$ ulimit -n 3000
你可以在下面檢查:
$ ulimit -n
3000
現在的問題是,如果您註銷並登錄或重新啟動計算機,該值將被重置。 請記住,使這些限制更持久需要編輯用戶的配置文件之一(.bashrc
或者 .profile
) 或系統範圍的配置文件 (/etc/bashrc
或者 /etc/profile
) 通過將 ulimit 命令行添加到文件末尾,如下所示
# vim .bash_profile
ulimit -n 3000
現在即使重新啟動,用戶設置的限制也將是永久的。 您可以選擇僅增加硬限制 (-Hn
) 或軟限制 (-Sn
) 但您應該注意到,任何用戶都可以設置軟限制,而硬限制一旦設置就只能由 root 更改。
2) 可插拔認證模塊 (PAM) 模塊
施加此類限制最好通過名為的可插拔身份驗證模塊 (PAM) 模塊來完成 pam_limits. 大多數主要的 Linux 發行版都將此模塊用作其標準 PAM 配置的一部分,因此它已存在於某些 Linux 系統中,但您需要通過編輯 /etc/security/limits.conf
文件。 該文件包含四個基本字段:
- 領域: 它描述了限制適用的實體。 它可以是用戶名、組名(格式為@groupname)或匹配所有人的星號
- 通配符。 但是,您應該注意到通配符不適用於 root 用戶 類型: 這
- 字段將限制指定為硬或軟。 硬限制是由系統管理員強加的,在任何情況下都不能超過,而用戶可以暫時超過軟限制。 您還可以使用破折號 ( – ) 表示限制既是硬限制又是軟限制。 請注意,軟限制可能會增加到硬限制的值 物品:
- 它指定了被限制的項目類型。 這可能是 nofile(打開的數據文件的數量)、fsize(用戶創建的文件的大小)、core(核心文件的大小)等 價值:
它指定要應用於限制的值 example 你可以看到
# tail -f -n 12 /etc/security/limits.conf
#<domain> <type> <item> <value>
#
#* soft core 0
#* hard rss 10000
#@student hard nproc 20
#@faculty soft nproc 20
#@faculty hard nproc 50
#ftp hard nproc 0
#@student - maxlogins 4
# End of file
該文件的內容如下: example要編輯所有用戶的最大打開文件數,您可以添加,對於
# vim /etc/security/limits.conf
* hard nofile 20000
* soft nofile 15000
, 在文件末尾添加以下幾行: /etc/pam.d/login
# vim /etc/pam.d/login
session required pam_limits.so
在此之後,您需要編輯文件
$ ulimit -Hn
20000
然後保存文件。 您可以檢查結果如下:
3) 系統範圍限制 在 Linux 系統上,我們有 文件最大 /etc/sysctl.conf
這是最大文件描述符 (FD) 和 ulimit 和 file-max 的默認設置假設多個用戶將共享系統。 這就是這些設置限制每個用戶使用的資源數量的原因。 您可以通過編輯在 Linux 中打開文件的限制 fs.file-max
或通過編輯指令
# cat /proc/sys/fs/file-max
100576
您可以使用以下命令查看打開文件的當前值
# sysctl -w fs.file-max=250000
fs.file-max = 250000
您可以編輯默認值,如下所示:
# cat /proc/sys/fs/file-max
250000
您可以檢查結果如下 /etc/sysctl.conf
通過使用 sysctl 命令,修改將應用到下一次重新啟動。 要使配置持久化,您可以直接編輯
# vim /etc/sysctl.conf
fs.file-max=250000
文件如下: /proc/sys/fs/file-max
如果你列出的內容
# sysctl -p
fs.file-max = 250000
,您將看到更改並未直接生效。 現在您需要使用 sysctl 命令的 -p 選項直接應用更改,如下所示: