ulimit命令解决Too many open files错误

项目启动报错:Too many open files,通过ulimit命令可以查看与管理用户/程序/进程占用资源情况,其中比较实用的是可以根据资源情况配置linux用户的最大进程数

ulimit命令解决Too many open files错误

所属分类: Linux
专题标签: 配置 错误 资源

Too many open files 产生原因

Too many open files错误在Linux系统中是非常常见的。
从字面意思上看就是说程序打开的文件数过多,不过这里的files不单是文件的意思,实际上包括通讯链接、端口等。
因此称之为做句柄(handle)会更合适,因此这个错误通常叫做句柄数超出系统限制。
产生原因就是进程在某个时刻打开了超过系统限制的文件数量以及通讯链接数。
比如米虫遇到这个错误就是启动某个Web项目时,Tomcat启动报错了。

解决思路

既然错误说明都很清晰了,解决问题方案自然就2个:

  1. 增大系统最大句柄数
  2. 减少实际使用的句柄(比如某个应用移植到别的环境中)

ulimit语句

ulimit是Linux系统的内键功能,它具有一套参数集,用于为由它生成的shell进程及其子进程的资源使用设置限制。
Linux对于每个用户,系统限制其最大进程数。为提高性能,可以根据设备资源情况,设置各linux 用户的最大进程数。

基本语法

ulimit [-参数符] [选填:设置值]

参数说明

  • -H 设置硬资源限制(Hard);
  • -S 设置软资源限制(Soft);
  • -a 显示当前所有的资源限制;
  • -c [设置值]:设置core文件的最大值;单位:blocks
  • -d [设置值]:设置数据段的最大值;单位:kbytes
  • -f [设置值]:设置创建文件的最大值;单位:blocks
  • -l [设置值]:设置在内存中锁定进程的最大值;单位:kbytes
  • -m [设置值]:设置可以使用的常驻内存的最大值;单位:kbytes
  • -n [设置值]:设置内核可以同时打开的文件描述符的最大值;单位:n
  • -p [设置值]:设置管道缓冲区的最大值;单位:kbytes
  • -s [设置值]:设置堆栈的最大值;单位:kbytes
  • -t [设置值]:设置CPU使用时间的最大上限;单位:seconds
  • -v [设置值]:设置虚拟内存的最大值;单位:kbytes
  • -u <程序数目>  用户最多可开启的程序数目

[设置值]可以为数字和unlimited(无限制),但要注意的是并不是所有字段都可以设置为无限制

错误处理实例

针对上面提到的Too many open files错误可以通过如下方式处理。

ulimit命令修改

  1. #同时打开的文件10240
  2. ulimit -n 10240
  3. #仅在本次连接生效,局部环境变量,重启会恢复默认值

配置环境变量文件

  1. vi /etc/profile
  2. #在环境变量配置文件追加配置
  3. ulimit -n 10240
  4. #保存后运行source /etc/profile 或 . /etc/profile使其生效
  5. source /etc/profile
  6. #只对当前修改用户生效,重启不会恢复默认值

limits.conf配置文件

  1. #结尾添加
  2. #soft是警告值,hard是真正意义的阈值,超过就会报错
  3. * soft nofile 10240
  4. * hard nofile 10240
  5. #可以只用一句
  6. * - nofile 8192
  7. #*表示所有用户,可配置用户名,如:www
  8. www soft nofile 10240
  9. www hard nofile 10240
  10. #该方式可以对所有用户生效,重启不会恢复默认值