Java项目线上打开文件数过多问题排查
2023-12-18 19:06:29
起因
最近线上告警提示某台服务器打开文件数过多, 为防止进一步引起用户故障, 排查下问题
原因初步猜测应该是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
- COMMAND: 进程的名称
- PID: 进程标识符
- USER: 进程所有者
- FD: 文件描述符,应用程序通过文件描述符识别该文件,如cwd、txt等
- TYPE: 文件类型,如DIR、REG等
- DEVICE: 指定磁盘的名称
- SIZE: 文件的大小
- NODE: 索引节点(文件在磁盘上的标识)
- NAME: 打开文件的确切名称
大文件占用
如果有大文件占用问题, 在Linux系统中,通过rm或者文件管理器删除文件,只是将它会从文件系统的目录结构上解除链接(unlink),如果文件在删除时是被打开的(有进程正在使用或者有进程一直在向这个文件写数据, 例如服务器写log日志)状态,那么进程将仍然可以读取该文件,磁盘空间也就会一直被占用。 这个时候可以用以下命令清空该文件
echo " " > /app.log
这个命令会将一个空行写入到/app.log
文件中。如果这个文件不存在,它会被创建;如果这个文件已经存在,它的内容会被这个空行替换
文章来源:https://blog.csdn.net/qq_44695727/article/details/135011694
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!