簡介:在生產環境中遇到打開文件數這類的挑戰現在已經是司空見慣的事情了。由於許多應用程序是基於 Java 和 Apache 的,安裝和配置它們可能會致使打開過多的文件(文件描述符)。若是打開的文件描述符超過了默認設置的限制,就可能會面臨訪問控制問題,受阻於打開文件的挑戰。許多生產環境所以而陷入停滯狀態。linux
幸運的是,在基於 Linux 的服務器上,都有 ulimit
命令,經過它能夠查看、設置、獲取文件打開的狀態和配置詳情。此命令配備了許多選項,經過這些組合能夠設置打開文件的數量。下面逐個命令用示例作了詳細說明。git
要在 Linux 服務器上獲得打開文件數的限制,請執行如下命令,github
[root@ubuntu ~]# cat /proc/sys/fs/file-max
146013
複製代碼
上面的數字代表用戶能夠在每一個用戶登陸會話中打開 ‘146013’ 個文件。ubuntu
[root@centos ~]# cat /proc/sys/fs/file-max
149219
[root@debian ~]# cat /proc/sys/fs/file-max
73906
複製代碼
這清楚地代表,各個 Linux 操做系統具備不一樣的打開文件數限制。這基於各自系統中運行的依賴關係和應用程序。centos
顧名思義,ulimit
(用戶限制)用於顯示和設置登陸用戶的資源限制。當咱們使用 -a
選項運行 ulimit
命令時,它將打印登陸用戶的全部資源限制。如今讓咱們在 Ubuntu/Debian 和 CentOS 系統上運行 ulimit -a
,bash
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
複製代碼
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
命令中傳遞特定的參數,下面列出了一些參數:oracle
ulimit -n
–> 顯示打開文件數限制ulimit -c
–> 顯示核心轉儲文件大小umilit -u
–> 顯示登陸用戶的最大用戶進程數限制ulimit -f
–> 顯示用戶能夠擁有的最大文件大小umilit -m
–> 顯示登陸用戶的最大內存大小ulimit -v
–> 顯示最大內存大小限制使用如下命令檢查登陸用戶打開文件數量的硬限制和軟限制:ui
shashi@Ubuntu ~}$ ulimit -Hn
1048576
shashi@Ubuntu ~}$ ulimit -Sn
1024
複製代碼
讓咱們假設咱們的 Linux 服務器已經達到了打開文件的最大數量限制,並但願在系統範圍擴展該限制,例如,咱們但願將 100000 設置爲打開文件數量的限制。spa
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
用於在不從新啓動和註銷的狀況下提交更改。
/etc/sysctl.conf
文件用於設置系統範圍的資源限制,但若是要爲 Oracle、MariaDB 和 Apache 等特定用戶設置資源限制,則能夠經過 /etc/security/limits.conf
文件去實現。
示例 limits.conf
以下所示,
root@ubuntu~]# cat /etc/security/limits.conf
複製代碼
假設咱們要爲 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 的服務器中的(打開)大量文件的限制。
via: www.linuxtechi.com/set-ulimit-…
做者:Shashidhar Soppin 選題:lujun9972 譯者:zgj1024 校對:wxy