如何在 Linux 服務器上設置 ulimit 和文件描述符數限制
在生產環境中遇到打開文件數這類的挑戰如今已是司空見慣的事情了。因為許多應用程序是基于 Java 和 Apache 的,安裝和配置它們可能會導致打開過多的文件(文件描述符)。如果打開的文件描述符超過了默認設置的限制,就可能會面臨訪問控制問題,受阻于打開文件的挑戰。許多生產環境因此而陷入停滯狀態。
幸運的是,在基于 Linux 的服務器上,都有 ulimit 命令,通過它可以查看、設置、獲取文件打開的狀態和配置詳情。此命令配備了許多選項,通過這些組合可以設置打開文件的數量。下面逐個命令用示例做了詳細說明。
查看任何 Linux 系統中當前打開文件數的限制
要在 Linux 服務器上得到打開文件數的限制,請執行以下命令,
- [root@ubuntu ~]# cat /proc/sys/fs/file-max
- 146013
上面的數字表明用戶可以在每個用戶登錄會話中打開 ‘146013’ 個文件。
- [root@centos ~]# cat /proc/sys/fs/file-max
- 149219
- [root@debian ~]# cat /proc/sys/fs/file-max
- 73906
這清楚地表明,各個 Linux 操作系統具有不同的打開文件數限制。這基于各自系統中運行的依賴關系和應用程序。
ulimit 命令
顧名思義,ulimit(用戶限制)用于顯示和設置登錄用戶的資源限制。當我們使用 -a 選項運行 ulimit 命令時,它將打印登錄用戶的所有資源限制?,F在讓我們在 Ubuntu/Debian 和 CentOS 系統上運行 ulimit -a,
Ubuntu / Debian 系統
- shashi@Ubuntu ~}$ ulimit -a
- core file size (blocks, -c) 0
- data seg size (kbytes, -d) unlimited
- scheduling priority (-e) 0
- file size (blocks, -f) unlimited
- pending signals (-i) 5731
- max locked memory (kbytes, -l) 64
- max memory size (kbytes, -m) unlimited
- open files (-n) 1024
- pipe size (512 bytes, -p) 8
- POSIX message queues (bytes, -q) 819200
- real-time priority (-r) 0
- stack size (kbytes, -s) 8192
- cpu time (seconds, -t) unlimited
- max user processes (-u) 5731
- virtual memory (kbytes, -v) unlimited
- file locks (-x) unlimited
CentOS 系統
- shashi@centos ~}$ ulimit -a
- core file size (blocks, -c) 0
- data seg size (kbytes, -d) unlimited
- scheduling priority (-e) 0
- file size (blocks, -f) unlimited
- pending signals (-i) 5901
- max locked memory (kbytes, -l) 64
- max memory size (kbytes, -m) unlimited
- open files (-n) 1024
- pipe size (512 bytes, -p) 8
- POSIX message queues (bytes, -q) 819200
- real-time priority (-r) 0
- stack size (kbytes, -s) 8192
- cpu time (seconds, -t) unlimited
- max user processes (-u) 5901
- virtual memory (kbytes, -v) unlimited
- file locks (-x) unlimited
正如我們可以在這里看到的,不同的操作系統具有不同的限制設置。所有這些限制都可以使用 ulimit 命令進行配置/更改。
要顯示單個資源限制,可以在 ulimit 命令中傳遞特定的參數,下面列出了一些參數:
- ulimit -n –> 顯示打開文件數限制
- ulimit -c –> 顯示核心轉儲文件大小
- umilit -u –> 顯示登錄用戶的最大用戶進程數限制
- ulimit -f –> 顯示用戶可以擁有的最大文件大小
- umilit -m –> 顯示登錄用戶的最大內存大小
- ulimit -v –> 顯示最大內存大小限制
使用以下命令檢查登錄用戶打開文件數量的硬限制和軟限制:
- shashi@Ubuntu ~}$ ulimit -Hn
- 1048576
- shashi@Ubuntu ~}$ ulimit -Sn
- 1024
如何修復達到最大文件數限制的問題?
讓我們假設我們的 Linux 服務器已經達到了打開文件的最大數量限制,并希望在系統范圍擴展該限制,例如,我們希望將 100000 設置為打開文件數量的限制。
- root@ubuntu~]# sysctl -w fs.file-max=100000
- fs.file-max = 100000
上述更改將在下次重啟之前有效,因此要使這些更改在重啟后仍存在,請編輯文件 /etc/sysctl.conf 并添加相同的參數,
- root@ubuntu~]# vi /etc/sysctl.conf
- fs.file-max = 100000
保存文件并退出。
運行下面命令,使上述更改立即生效,而無需注銷和重新啟動。
- root@ubuntu~]# sysctl -p
現在驗證新的更改是否生效。
- root@ubuntu~]# cat /proc/sys/fs/file-max
- 100000
使用以下命令找出當前正在使用的文件描述符數量:
- [root@ansible ~]# more /proc/sys/fs/file-nr
- 1216 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 user
- linuxtechi hard nofile 4096
- # soft limit for max opened files for linuxtechi user
- linuxtechi soft nofile 1024
- # hard limit for max number of process for oracle user
- oracle hard nproc 8096
- # soft limit for max number of process for oracle user
- oracle 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 -H
- 4096
- ~]$ ulimit -n -S
- 1024
- ~]# su - oracle
- ~]$ ulimit -H -u
- 8096
- ~]$ ulimit -S -u
- 4096
注:其他主要使用的命令是 lsof,可用于找出“當前打開了多少個文件”,這命令對管理員非常有幫助。
結尾
正如在介紹部分提到的,ulimit 命令非常強大,可以幫助用戶配置并確保應用程序安裝更加流暢而沒有任何瓶頸。此命令有助于修復基于 Linux 的服務器中的(打開)大量文件的限制。