Linux中國

如何在 Linux 伺服器上設置 ulimit 和文件描述符數限制

幸運的是,在基於 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 命令時,它將列印登錄用戶的所有資源限制。現在讓我們在 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 的伺服器中的(打開)大量文件的限制。

via: https://www.linuxtechi.com/set-ulimit-file-descriptors-limit-linux-servers/

作者:Shashidhar Soppin 選題:lujun9972 譯者:zgj1024 校對:wxy

本文由 LCTT 原創編譯,Linux中國 榮譽推出


本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive

對這篇文章感覺如何?

太棒了
0
不錯
0
愛死了
0
不太好
0
感覺很糟
0
雨落清風。心向陽

    You may also like

    Leave a reply

    您的電子郵箱地址不會被公開。 必填項已用 * 標註

    此站點使用Akismet來減少垃圾評論。了解我們如何處理您的評論數據

    More in:Linux中國