如何在 Linux 伺服器上設定 ulimit 和檔案描述符數限制

2019-07-09 12:14:00

?簡介:在生產環境中遇到開啟檔案數這類的挑戰如今已是司空見慣的事情了。因為許多應用程式是基於 Java 和 Apache 的,安裝和設定它們可能會導致開啟過多的檔案(檔案描述符)。如果開啟的檔案描述符超過了預設設定的限制,就可能會面臨存取控制問題,受阻於開啟檔案的挑戰。許多生產環境因此而陷入停滯狀態。

幸運的是,在基於 Linux 的伺服器上,都有 ulimit 命令,通過它可以檢視、設定、獲取檔案開啟的狀態和設定詳情。此命令配備了許多選項,通過這些組合可以設定開啟檔案的數量。下面逐個命令用範例做了詳細說明。

檢視任何 Linux 系統中當前開啟檔案數的限制

要在 Linux 伺服器上得到開啟檔案數的限制,請執行以下命令,

[root@ubuntu ~]# cat /proc/sys/fs/file-max146013

上面的數位表明使用者可以在每個使用者登入對談中開啟 ‘146013’ 個檔案。

[root@centos ~]# cat /proc/sys/fs/file-max149219[root@debian ~]# cat /proc/sys/fs/file-max73906

這清楚地表明,各個 Linux 作業系統具有不同的開啟檔案數限制。這基於各自系統中執行的依賴關係和應用程式。

ulimit 命令

顧名思義,ulimit(使用者限制)用於顯示和設定登入使用者的資源限制。當我們使用 -a 選項執行 ulimit 命令時,它將列印登入使用者的所有資源限制。現在讓我們在 Ubuntu/Debian 和 CentOS 系統上執行 ulimit -a

Ubuntu / Debian 系統

shashi@Ubuntu ~}$ ulimit -acore file size          (blocks, -c) 0data seg size           (kbytes, -d) unlimitedscheduling priority             (-e) 0file size               (blocks, -f) unlimitedpending signals                 (-i) 5731max locked memory       (kbytes, -l) 64max memory size         (kbytes, -m) unlimitedopen files                      (-n) 1024      pipe size            (512 bytes, -p) 8POSIX message queues     (bytes, -q) 819200real-time priority              (-r) 0stack size              (kbytes, -s) 8192cpu time               (seconds, -t) unlimitedmax user processes              (-u) 5731virtual memory          (kbytes, -v) unlimitedfile locks                      (-x) unlimited

CentOS 系統

shashi@centos ~}$ ulimit -acore file size          (blocks, -c) 0data seg size           (kbytes, -d) unlimitedscheduling priority             (-e) 0file size               (blocks, -f) unlimitedpending signals                 (-i) 5901max locked memory       (kbytes, -l) 64max memory size         (kbytes, -m) unlimitedopen files                      (-n) 1024pipe size            (512 bytes, -p) 8POSIX message queues     (bytes, -q) 819200real-time priority              (-r) 0stack size              (kbytes, -s) 8192cpu time               (seconds, -t) unlimitedmax user processes              (-u) 5901virtual memory          (kbytes, -v) unlimitedfile locks                      (-x) unlimited

正如我們可以在這裡看到的,不同的作業系統具有不同的限制設定。所有這些限制都可以使用 ulimit 命令進行設定/更改。

要顯示單個資源限制,可以在 ulimit 命令中傳遞特定的引數,下面列出了一些引數:

  • ulimit -n –> 顯示開啟檔案數限制
  • ulimit -c –> 顯示核心轉儲檔案大小
  • umilit -u –> 顯示登入使用者的最大使用者進程數限制
  • ulimit -f –> 顯示使用者可以擁有的最大檔案大小
  • umilit -m –> 顯示登入使用者的最大記憶體大小
  • ulimit -v –> 顯示最大記憶體大小限制

使用以下命令檢查登入使用者開啟檔案數量的硬限制和軟限制:

shashi@Ubuntu ~}$ ulimit -Hn1048576shashi@Ubuntu ~}$ ulimit -Sn1024

如何修復達到最大檔案數限制的問題?

讓我們假設我們的 Linux 伺服器已經達到了開啟檔案的最大數量限制,並希望在系統範圍擴充套件該限制,例如,我們希望將 100000 設定為開啟檔案數量的限制。

root@ubuntu~]# sysctl -w fs.file-max=100000fs.file-max = 100000

上述更改將在下次重新啟動之前有效,因此要使這些更改在重新啟動後仍存在,請編輯檔案 /etc/sysctl.conf 並新增相同的引數,

root@ubuntu~]# vi /etc/sysctl.conffs.file-max = 100000

儲存檔案並退出。

執行下面命令,使上述更改立即生效,而無需登出和重新啟動。

root@ubuntu~]# sysctl -p

現在驗證新的更改是否生效。

root@ubuntu~]# cat /proc/sys/fs/file-max100000

使用以下命令找出當前正在使用的檔案描述符數量:

[root@ansible ~]# more /proc/sys/fs/file-nr1216    0       100000

注意:命令 sysctl -p 用於在不重新啟動和登出的情況下提交更改。

通過 limit.conf 檔案設定使用者級資源限制

/etc/sysctl.conf 檔案用於設定系統範圍的資源限制,但如果要為 Oracle、MariaDB 和 Apache 等特定使用者設定資源限制,則可以通過 /etc/security/limits.conf 檔案去實現。

範例 limits.conf 如下所示,

root@ubuntu~]# cat /etc/security/limits.conf

Limits-conf-linux-part1

Limits-conf-linux-part2

假設我們要為 linuxtechi 使用者設定開啟檔案數量的硬限制和軟限制,而對於 oracle 使用者設定開啟進程數量的硬限制和軟限制,編輯檔案 /etc/security/limits.conf 並新增以下行:

# hard limit for max opened files for linuxtechi userlinuxtechi       hard    nofile          4096# soft limit for max opened files for linuxtechi userlinuxtechi       soft    nofile          1024# hard limit for max number of process for oracle useroracle           hard    nproc          8096# soft limit for max number of process for oracle useroracle           soft    nproc          4096

儲存檔案並退出。

注意: 如果你想對一個組而不是使用者進行資源限制,那麼也可以通過 limits.conf 檔案,輸入 @<組名> 代替使用者名稱,其餘項都是相同的,範例如下,

# hard limit for max opened files for sysadmin group@sysadmin        hard         nofile            4096 # soft limit for max opened files for sysadmin group@sysadmin        soft         nofile            1024

驗證新的更改是否生效:

~]# su - linuxtechi~]$ ulimit -n -H4096~]$ ulimit -n -S1024~]# su - oracle~]$ ulimit -H -u8096~]$ ulimit -S -u4096

註:其他主要使用的命令是 lsof,可用於找出“當前開啟了多少個檔案”,這命令對管理員非常有幫助。

結尾

正如在介紹部分提到的,ulimit 命令非常強大,可以幫助使用者設定並確保應用程式安裝更加流暢而沒有任何瓶頸。此命令有助於修復基於 Linux 的伺服器中的(開啟)大量檔案的限制。