too many open files 问题定位

March 17, 2021

这篇文章主要解决了"too many open files"问题的定位。首先,它列出了可能的问题原因,包括系统资源限制小,数据库打开文件限制小,以及程序代码问题。然后,文章详细介绍了如何使用ulimit命令查看和调整资源限制,特别是打开文件数的限制。最后,文章介绍了如何使用lsof命令查看打开文件数,包括查看某个进程打开文件数和查看当前系统打开文件数。

错误

socket:too many open files

问题原因

  • 系统资源限制小(ulimit -a 查看open files限制)
  • 数据库打开文件限制小(登录数据库 show variables like '%open%';命令查看 open_files_limit 限制)
  • 程序代码问题,进程打开文件句柄不释放。

ulimit命令查看资源限制

显示目前资源限制的设定

示例

[root@ ~]# ulimit -a
core file size     (blocks, -c) 0
data seg size      (kbytes, -d) unlimited
file size        (blocks, -f) unlimited
pending signals         (-i) 1024
max locked memory    (kbytes, -l) 32
max memory size     (kbytes, -m) unlimited
open files           (-n) 1024  # 打开文件数限制
pipe size      (512 bytes, -p) 8
POSIX message queues   (bytes, -q) 819200
stack size       (kbytes, -s) 10240
cpu time        (seconds, -t) unlimited
max user processes       (-u) 4096
virtual memory     (kbytes, -v) unlimited
file locks           (-x) unlimited

参数

-a 显示目前资源限制的设定。
-c <core文件上限>  设定core文件的最大值,单位为区块。
-d <数据节区大小>  程序数据节区的最大值,单位为KB。
-f <文件大小>  shell所能建立的最大文件,单位为区块。
-H 设定资源的硬性限制,也就是管理员所设下的限制。
-m <内存大小>  指定可使用内存的上限,单位为KB。
-n <文件数目>  指定同一时间最多可开启的文件数。
-p <缓冲区大小>  指定管道缓冲区的大小,单位512字节。
-s <堆叠大小>  指定堆叠的上限,单位为KB。
-S 设定资源的弹性限制。
-t <CPU时间>  指定CPU使用时间的上限,单位为秒。
-u <程序数目>  用户最多可开启的程序数目。
-v <虚拟内存大小>  指定可使用的虚拟内存上限,单位为KB。

调整当前用户打开文件数

[root@ ~]# ulimit -n 1234

注:此命令是设置当前用户的限制并且是临时性的。 打开数由大到小设置,否则设置不成功。

lsof 查看打开文件数

查看某个进程打开文件数

[root@ ~]# lsof -p 进程ID |wc -l
[root@ ~]# 123

查看当前系统打开文件数

[root@ ~]# lsof |wc -l
[root@ ~]# 1234

参数

-a 列出打开文件存在的进程

-c<进程名> 列出指定进程所打开的文件

-g 列出GID号进程详情

-d<文件号> 列出占用该文件号的进程

+d<目录> 列出目录下被打开的文件

+D<目录> 递归列出目录下被打开的文件

-n<目录> 列出使用NFS的文件

-i<条件> 列出符合条件的进程。(4、6、协议、:端口、 @ip )

-p<进程号> 列出指定进程号所打开的文件

-u 列出UID号进程详情

-h 显示帮助信息

-v 显示版本信息
其他linux

IARNO

服务端开发

openresty 跑定时任务配置、ngx.timer.every接口使用

Gin pprof性能分析