如何在Linux中修改打开文件描述符的数量

  • 原创
  • Madman
  • /
  • 2018-05-08 09:37
  • /
  • 0
  • 404 次阅读

如何在Linux中增加打开文件数限制-min.png

Synopsis: 在Linux中,如果您拥有对系统的root访问权限,那么可以更改可以打开文件描述符的最大数量。Linux系统资源限制又分为整个系统层面的总限制,此时要修改内核参数,比如/proc/sys/fs/file-max。还可以对进程和用户分别做资源限制,将ulimit命令写入应用程序的启动脚本中,此时要注意子进程允许打开的最大文件数不能超过父进程的阈值限制。还可以在当前shell会话中直接执行ulimit命令,此时限制的是当前 shell 进程以及其派生的子进程

1. 全局级的文件描述符限制

查看当前的Linux系统上可打开的文件描述符的最大数量:

# cat /proc/sys/fs/file-max
184256

此数值表示每个登录会话中用户可以打开的文件数量,结果可能会因各系统而异。

如果Linux系统用作Apache/MySQL之类的服务器,可能需要打开更多的文件描述符,可以使用sysctl命令增大内核参数fs.file-max的数值:

1. 增加到500000
# sysctl -w fs.file-max=500000

2. 查看效果
# cat /proc/sys/fs/file-max

上述设置只在当前会话有效,如果需要新建会话或重启系统也生效,那么要修改/etc/sysctl.conf配置文件,在末尾添加fs.file-max=500000,然后你想立即看到效果的话,请运行sysctl -p命令

2. 用户级的文件描述符限制

除了可以通过修改内核参数,来设置Linux系统全局的文件描述符限制外,还可以精细化到每个用户或用户组。

2.1 内置命令ulimit

使用ulimit内置命令可以设置shell的资源限制,包括最大可打开的文件数:

1. 查看当前用户所有的资源限制信息
# 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) 31204
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) 31204
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

2. 查看某进程的资源限制信息,首先用ps -ef|grep 进程名,查询到进程的PID
# cat /proc/进程PID/limits

3. 查看某进程打开了哪些文件描述符
# ls -al /proc/进程PID/fd/

ulimit的命令格式为ulimit [选项] [限制值],常用的选项如下:

选项 说明 示例
-H 设置硬资源限制,一旦设置不能增加 ulimit –Hs 64表示限制硬资源,线程栈大小为 64K
-S 设置软资源限制,设置后可以增加,但是不能超过硬资源设置 ulimit –Sn 32表示限制软资源,32 个文件描述符
-a 显示当前所有的 limit 信息 ulimit –a显示当前所有的 limit 信息
-c 最大的 core 文件的大小, 以 blocks 为单位 ulimit -c unlimited表示对生成的 core 文件的大小不进行限制
-d 进程最大的数据段的大小,以 Kbytes 为单位 ulimit -d unlimited表示对进程的数据段大小不进行限制
-f 进程可以创建文件的最大值,以 blocks 为单位 ulimit -f 2048表示限制进程可以创建的最大文件大小为 2048 blocks
-l 最大可加锁内存大小,以 Kbytes 为单位 ulimit -l 32表示限制最大可加锁内存大小为 32 Kbytes
-m 最大内存大小,以 Kbytes 为单位 ulimit –m unlimited表示对最大内存不进行限制
-n 可以打开最大文件描述符的数量 ulimit –n 128表示限制最大可以使用 128 个文件描述符
-p 管道缓冲区的大小,以 Kbytes 为单位 ulimit –p 512表示限制管道缓冲区的大小为 512 Kbytes
-s 线程栈大小,以 Kbytes 为单位 ulimit –s 512表示限制线程栈的大小为 512 Kbytes
-t 最大的 CPU 占用时间,以秒为单位 ulimit –t unlimited表示对最大的 CPU 占用时间不进行限制
-u 用户最大可用的进程数 ulimit –u 64表示限制用户最多可以使用 64 个进程
-v 进程最大可用的虚拟内存,以 Kbytes 为单位 ulimit –v 200000表示限制最大可用的虚拟内存为 200000 Kbytes

(1) 当前会话有效

比如,Linux系统默认可以打开最大文件描述符的数量一般是1024,使用下面的命令可以在当前会话中将此限制调整为32768:

1. 查看当前可以打开最大文件描述符的数量
# ulimit -n
1024

2. 在当前会话中修改可以打开最大文件描述符的数值为32768
# ulimit -n 32768

3. 在当前会话中再次查看
# ulimit -n
32768

4. 新建一个会话,查看
# ulimit -n
1024

(2) 当前用户有效

将ulimit的设置命令添加到~/.bashrc中,不能添加到~/.bash_profile中,因为非登录的交互式shell不会访问~/.bash_profile

# sed -i.bak '$ a ulimit -n 32768' ~/.bashrc

新建会话或重新登录,就可以看到新设置值生效了

(3) 所有用户有效

将ulimit的设置命令添加到/etc/bashrc中,不能添加到/etc/profile中,因为非登录的交互式shell不会访问/etc/profile

(4) 写入应用程序的启动脚本中

可以将ulimit的设置命令添加到应用程序的启动脚本中,注意: 子进程允许打开的最大文件数不能超过父进程的阈值限制,比如用Supervisor来监控Gunicorn,虽然你设置了Gunicorn的最大可打开文件数为65536,但Supervisor默认minfds=1024,用Supervisor进程来管理ElasticSearch进程,父进程的最大可打开文件数只有1024,子进程最大也只能是1024:

2.2 配置文件/etc/security/limits.conf

如果要为指定的用户或用户组限制Linux系统资源,建议使用/etc/security/limits.conf配置文件,详细说明请执行man limits.conf

# vi /etc/security/limits.conf

在末尾添加:

# Set soft limit for max opened files
*               soft    nofile             65536
# Set hard limit for max opened files
*               hard    nofile             65536

上述表示设置所有用户的最大可打开文件数,注意: soft nofile要和hard nofile一起使用才生效,数值不是越大越好(最大支持2的20次方),可打开的文件数越多,等待的时间就会越长,系统可能会越慢

要设置root用户的最大可打开文件数:

root               soft    nofile             65536
root               hard    nofile             65536
未经允许不得转载: LIFE & SHARE - 王颜公子 » 如何在Linux中修改打开文件描述符的数量

分享

作者

作者头像

Madman

如果博文内容有误或其它任何问题,欢迎留言评论,我会尽快回复; 或者通过QQ、微信等联系我

0 条评论

暂时还没有评论.

发表评论前请先登录