Java项目线上打开文件数过多问题排查

起因

最近线上告警提示某台服务器打开文件数过多, 为防止进一步引起用户故障, 排查下问题

原因初步猜测应该是IO流资源未关闭, 如打开文件或者发送http请求

排查

服务器上使用启动应用服务的用户查看系统打开文件数配置

#切换到admin用户
su admin
#查看打开文件数配置大小,其中open files栏为系统打开文件数
ulimit -a

查看应用服务打开的文件数

查出服务进程号,再使用lsof命令查看应用打开的文件数

# 使用ps -ef|grep java 或者jps -l查询进程号
jps -l


# 使用lsof命令查看进程打开文件数
lsof -p 进程号 |wc -l

执行结果如下,可以看到应用打开的文件数

定位

使用lsof命令导出应用打开的文件 (操作中用到lsof命令,可能需要在服务器上安装lsof)

#lsof -p 进程号 > 导出文件名
lsof -p 11058 > openfiles.txt

其他

lsof命令简介:

lsof(list open files)是一个列出当前系统打开文件的工具,lsof 意义LiSt Open Files用于找出哪些文件被哪个进程打开。众所周知Linux/Unix将所有内容都视为文件(pipes,sockets,directories,devices等等)。使用的原因之一lsof命令是当磁盘无法卸载时,因为它表示正在使用文件。借助此命令,我们可以轻松识别正在使用的文件

取前五行: lsof | head -5

[root@web2 ~]# lsof | head -5
COMMAND      PID  TID    USER   FD      TYPE             DEVICE  SIZE/OFF       NODE NAME
systemd        1         root  cwd       DIR              253,0       247         64 /
systemd        1         root  rtd       DIR              253,0       247         64 /
systemd        1         root  txt       REG              253,0   1632776     353452 /usr/lib/systemd/systemd
systemd        1         root  mem       REG              253,0     20064     116104 /usr/lib64/libuuid.so.1.3.0
  1. COMMAND: 进程的名称
  2. PID: 进程标识符
  3. USER: 进程所有者
  4. FD: 文件描述符,应用程序通过文件描述符识别该文件,如cwd、txt等
  5. TYPE: 文件类型,如DIR、REG等
  6. DEVICE: 指定磁盘的名称
  7. SIZE: 文件的大小
  8. NODE: 索引节点(文件在磁盘上的标识)
  9. NAME: 打开文件的确切名称
大文件占用

如果有大文件占用问题, 在Linux系统中,通过rm或者文件管理器删除文件,只是将它会从文件系统的目录结构上解除链接(unlink),如果文件在删除时是被打开的(有进程正在使用或者有进程一直在向这个文件写数据, 例如服务器写log日志)状态,那么进程将仍然可以读取该文件,磁盘空间也就会一直被占用。 这个时候可以用以下命令清空该文件

echo " " > /app.log

这个命令会将一个空行写入到/app.log文件中。如果这个文件不存在,它会被创建;如果这个文件已经存在,它的内容会被这个空行替换

你可能感兴趣的:(运维,java,开发语言,打开文件过多,linux)