简介:在生产环境中遇到打开文件数这类的挑战现在已经是司空见惯的事情了。由于许多应用程序是基于 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