原文链接:https://blog.csdn.net/sunny05296/article/details/54952009

max-file 表示系统级别的能够打开的文件句柄的数量(可以理解为全局打开文件表的大小)。是对整个系统的限制,并不是针对用户的。
ulimit -n 控制进程级别能够打开的文件句柄的数量。提供对shell及其启动的进程的可用文件句柄的控制。这是进程级别的。

对于服务器来说,file-max和ulimit都需要设置,否则会出现文件描述符耗尽的问题。

一般如果遇到文件句柄达到上限时,会碰到”Too many open files”或者Socket/File: Can’t open so many files等错误。
为了让服务器重启之后,配置仍然有效,需要用永久生效的配置方法进行修改。

修改max-file

  1. # 查看系统级别的能够打开的文件句柄的数量
  2. $ cat /proc/sys/fs/file-max
  3. 1048576

系统级打开最大文件句柄的数量永久生效的修改方法,修改配置文件,文件末尾加入配置内容:

  1. # 打开配置文件
  2. vim /etc/sysctl.conf
  3. # 添加配置项
  4. fs.file-max = 2000000
  5. # 然后执行命令,使修改配置立即生效
  6. sysctl -p

修改进程最大打开文件数(永久生效)

查看用户进程级的能够打开文件句柄的数量,一般默认都是1024

  1. ulimit -n
  2. 1024

这里设置的是当前shell的当前用户的打开的最大限制,如果当前用户打开多个shell,则每个shell都能打开该最大值

进程级打开文件句柄数量永久生效的修改方法,修改文件,文件末尾加入配置内容:

  1. # 打开配置文件
  2. vim /etc/security/limits.conf
  3. # 在配置文件中添加下面两行
  4. * soft nofile 65535
  5. * hard nofile 20000
  6. # soft是进程默认能打开的文件数
  7. # hard是使用命令ulimit -n num来修改进程最大打开文件数为num时,num的上界,这里就是num不能大于20000

修改以后,需要重新登录才能生效。

如果需要设置当前用户session立即生效,还需要执行ulimit -n 65535,像下面这样:

  1. galaxy@DESKTOP-65O8NBN:/mnt/c/Users/Mechrevo$ ulimit -n
  2. 1024
  3. # 使用ulimit -n num设置立即生效
  4. galaxy@DESKTOP-65O8NBN:/mnt/c/Users/Mechrevo$ ulimit -n 65535
  5. galaxy@DESKTOP-65O8NBN:/mnt/c/Users/Mechrevo$ ulimit -n
  6. 65535
  7. # 将默认打开文件变小
  8. galaxy@DESKTOP-65O8NBN:/mnt/c/Users/Mechrevo$ ulimit -n 2000
  9. galaxy@DESKTOP-65O8NBN:/mnt/c/Users/Mechrevo$ ulimit -n
  10. 2000
  11. # 变小之后再变大就不行了,需要注销用户再重新设置
  12. galaxy@DESKTOP-65O8NBN:/mnt/c/Users/Mechrevo$ ulimit -n 3000
  13. -bash: ulimit: open files: cannot modify limit: Invalid argument

对于服务器,一般修改进程级的最大打开文件句柄数即可(系统默认1024,有点小)。一般不需要调整系统级的最大数。

如果出现了达到系统级别最大限制时,也需要同步调整系统级的最大数的。