如何在 Linux 服务器上设置 ulimit 和文件描述符限制
生产环境中面临打开文件数量等挑战现在已是司空见惯。
-- Shashidhar Soppin (作者)
介绍:现在生产环境中经常会遇到打开文件数量等挑战。由于许多应用程序基于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 命令时,它将打印登录用户的所有资源限制。现在让我们在 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) unlimitedCentOS 系统
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 假设我们要设置为用户 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 的服务器上(打开)大量文件的限制。
版权声明
本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。
code前端网