1. 问题描述:

Flink上报metrics到pushGateway,pushGwateway因打开在多文件而拒绝Flink TaskManager上报数据的连接。查看pushGateway的日志如下:

2022/09/27 03:09:33 http: Accept error: accept tcp 0.0.0.0:9091: accept4: too many open files; retrying in 160ms
2022/09/27 03:09:33 http: Accept error: accept tcp 0.0.0.0:9091: accept4: too many open files; retrying in 320ms
2022/09/27 03:09:33 http: Accept error: accept tcp 0.0.0.0:9091: accept4: too many open files; retrying in 640ms

2. 问题定位过程

2.1首先查看系统的设置的最大文件句柄数:

ulimit -a

或者 cat /etc/security/limits.conf

接着查看应用可打开的最大文件数:

可见,应用可以打开的文件句柄已经相当大了。问题应该不在于此。

2.2 lsof查看应用打开的文件句柄:

lsof -p pid |wc -l

看到应用打开的文件数在持续增加,没有减少。

2.3 查看对应的进程的fd/目录下的文件情况 ,

ls /proc/pid/fd/ |wc -l

ll|head -20

找一个 inode, 在linux的TCP连接信息文件中查看有没有对应记录,socket:[xxxxxx]表示文件inode号, 100011, 100010等表示文件句柄。

cat /proc/net/tcp |grep 94859722

发现是空的。可以猜测是否pushGateway对应的TCP连接已经释放,但对应的文件句柄未清理。

只能做这种推测,

验证:可以 ss 查看具体的连接,在/proc/net/tcp中查看对应的inode, 等连接释放后,再去/proc/pid/fd/下面看对应的文件句柄是否被回收。

例如: ss - plta |grep pid

ll /proc/pid/fd/ |grep fd

以fd为141154为例:

过段时间再用ss -plta 查看,以及查看对应的tcp连接和fd下面的文件句柄

tcp信息已经不存在了,但文件句柄还残存着。

/proc/pid/fd文件下存放的是什么:

Linux内核提供了一种通过proc文件系统,在运行时访问内核内部数据结构、改变内核设置的机制。proc文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间。它以文件系统的方式为访问系统内核数据的操作提供接口。

attr
autogroup
auxv :包含传递给进程的ELF解释器信息,格式是每一项都是一个unsigned long长度的ID加上一个unsigned long长度的值。
cgroup:文件,进程所属的控制组,格式为冒号分隔的三个字段,分别是结构ID、子系统、控制组、需要配置CONFIG_CGROUPS。
clear_refs:只写,只用于进程的拥有者,清除用于估算内存使用量的PG_Reference和ACCESSED/YOUNG,有1、2、3、4四种策略,1表示清除相关的所有页,2表示清除相关的匿名页,3表示清除相关的映射文件的页,4表示清除相关的soft-dirty的页,需配置CONFIG_PROC_PAGE_MONITOR.
cmdline:是一个只读文件,包含进程的完整命令行信息。如果该进程已经被交换出内存或者这个进程是zombie进程,则这个文件没有任何内容。该文件以空字符null而不是换行符作为结束标志。
comm:包含进程的命令名。
coredump_filter:coredump过滤器,不同的二进制位表示过滤不同的信息。
cpuset:控制CPU和内存的节点。
cwd:是进程当前工作目录的符号链接。
environ:显示进程的环境变量。
exe:为实际运行程序的符号链接。
fd:是一个目录,包含进程打开文件的情况。
fdinfo:包含当前的fd的信息,不同类型的fd信息不同。
gid_map:从用户命名空间映射的组ID的信息。
io:IO信息。
limits:资源软、硬限制。
loginuid
map_files:包括一些内存映射文件,文件格式为BeginAddress-EndAddress,符号链接到映射的文件,需要配置CONFIG_CHECKPOINT_RESTORE。
maps:显示进程的内存区域映射信息。其中[stack:]是线程的堆栈信息,对应于/proc/[pid]/task/[tid]/路径 
mem:包含了进程在内存中的内容
mountinfo:挂载信息。格式为36 35 98:0 /mnt1 /mnt2 rw,noatime master:1 - ext3 /dev/root rw,errors=continue,以空格作为分隔符,从左到右各字段的意思分别是唯一挂载ID、父挂载ID、文件系统的设备主从号码、文件系统中挂载的根节点、相对于进程根节点的挂载点、挂载权限等挂载配置、可选配置、短横线表示前面可选配置的结束、文件系统类型、文件系统特有的挂载源或者为none、额外配置。
mounts:挂载在当前进程的文件系统列表。
mountstats:挂载信息。

net:从进程角度统计的数据。
/proc/net:有关网络和套接字的状态信息

/proc/sys/net:网络和套接字的设置
ns:保存了每个名字空间的入口。
numa_maps:numa即Non Uniform Memory Access
oom_adj:调整OOM分数,OOM即Out Of Memory,发生OOM时OOM Killer根据OOM分数杀掉分数高的进程,默认值为0,会继承自父进程的设置。
oom_score:OOM分数。
oom_score_adj:,OOM分值介于-1000到1000之间。
pagemap:当前进程的虚拟内存页映射信息,需要配置CONFIG_PROC_PAGE_MONITOR
patch_state
personality
projid_map
root:是进程根目录的符号链接。
sched
schedstat
sessionid
setgroups
smaps:内存映射信息,类似于pmap命令,需要配置CONFIG_PROC_PAGE_MONITOR,下面“proc-pid-smaps”详细介绍
stack:当前进程的内核调用栈信息,只有内核编译时打开了CONFIG_STACKTRACE编译选项,才会生成这个文件。
stat:进程状态。
statm:显示进程所占用内存大小的统计信息。
status:包含进程的状态信息。其很多内容与stat,statm相同,但是却是以一种更清晰地方式展现出来。
syscall:显示当前进程正在执行的系统调用。
task:针对进程指令的每个线程,内核提供了以/proc/PID/task/TID命名的子目录,其中TID是该线程的线程ID。每个/proc/PID/task/TID子目录中都有一套类似于/proc/PID目录内容的文件和目录。因为线程共享了多个属性,所以这些文件中的许多信息对进程中各个线程而言都是相同的。
timers:POSIT定时器列表,包括定时器ID,信号等信息。
uid_map:用户ID映射信息。
wchan:显示当进程sleep时,kernel当前运行的函数

lantency :显示哪些代码造成的延时比较大。如果要使用这个特性需要执行 echo 1> /proc/sys/kernel/lantencytop

记一次pushgateway因文件句柄数太多未回收的问题的更多相关文章

  1. 修改linux的最大文件句柄数限制

                   在当前session有效,用户退出或者系统重新后恢复默认值       2)修改profile文件:在profile文件中添加:ulimit -n 65535      ...

  2. 修改linux最大文件句柄数

    大家知道在linux服务器大并发调优时,往往需要预先调优linux参数,其中修改linux最大文件句柄数是最常修改的参数之一. 在linux中执行ulimit -a 即可查询linux相关的参数,如下 ...

  3. Linux下查看进程打开的文件句柄数和如何修改

    修改文件句柄数在Linux下,我们使用ulimit -n 命令可以看到单个进程能够打开的最大文件句柄数量(socket连接也算在里面).系统默认值1024. 对于一般的应用来说(象Apache.系统进 ...

  4. Linux下查看进程打开的文件句柄数

    ---查看系统默认的最大文件句柄数,系统默认是1024 # ulimit -n ----查看当前进程打开了多少句柄数 # lsof -n|awk '{print $2}'|sort|uniq -c|s ...

  5. linux设置打开文件句柄数

    介绍 在Linux下有时会遇到Socket/File : Can't open so many files的问题.其实Linux是有文件句柄限制的,而且Linux默认一般都是1024(阿里云主机默认是 ...

  6. centos之Too many open files问题-修改linux最大文件句柄数

    linux服务器大并发调优时,往往需要预先调优linux参数,其中修改linux最大文件句柄数是最常修改的参数之一. 在linux中执行ulimit -a 即可查询linux相关的参数,如下所示: [ ...

  7. nginx 中 ulimit 使用修改文件句柄数

    使用ulimit -a 可以查看当前系统的所有限制值, 使用ulimit -n<可以同时打开的文件数>设置用户可以同时打开的 最大文件数 linux系统默认的只要1024 当做负载较大的服 ...

  8. linux文件句柄数

    1.问题阐述: too many open files:顾名思义即打开过多文件数. 不过这里的files不单是文件的意思,也包括打开的通讯链接(比如socket),正在监听的端口等等,所以有时候也可以 ...

  9. Linux文件句柄数调整

    首先介绍下Linux系统中"一切都是文件". 1. Linux系统文件句柄数概念 文件句柄(Windows) 文件描述符(Unix/Linux):file discriptor,f ...

  10. 【转】Linux下查看进程打开的文件句柄数

    ---查看系统默认的最大文件句柄数,系统默认是1024 # ulimit -n 1024 ----查看当前进程打开了多少句柄数 # lsof -n|awk '{print $2}'|sort|uniq ...

随机推荐

  1. echarts 之 source and clone函数问题hasOwnProperty is not defined

    图表渲染时报错如下: echarts 实例的 setOption 方法用来加载/更新图表数据,setOption 方法内部首先使用了 zrender 的 clone 函数对 options 进行了拷贝 ...

  2. xfce-debian10 英文环境安装配置记录

    Centos还没有用利索(因为我听说debian是更纯正的社区开源项目???可是这对于我这样毫无技术菜鸟来说有什么关系呢???可是耐不住心中的悸动???悸动又从哪里了呢???哎,不管了),突然心血来潮 ...

  3. 如何完整卸载sketchup草图大师?

    如何完整卸载sketchup草图大师?完全彻底卸载删除干净sketchup各种残留注册表和文件的方法和步骤.如何卸载sketchup呢?有很多同学想把sketchup卸载后重新安装,但是发现sketc ...

  4. centos7上安装使用docker环境

    系统环境准备: docker 运行在centos7上,要去系统为64位.系统内核版本为3.10以上 1.查看系统版本:cat/etc/redhat-release 2.查看系统内核版本:uname - ...

  5. pytorch的cuda版本安装

    机器上加了RTX3060的卡,cuda装的11.1的版本,cudnn还不是特别清楚装的哪个版本?vs是2017这个版本的.下面来装pytorch.主要参考这个网站的内容"https://bl ...

  6. Linux工作中最常用命令整理

    ls 命令:显示指定工作目录下之内容 ls -a # 显示所有文件夹,包含隐藏的. 和.. ls -l # 显示文件的详细信息,包含文件形态,权限,所属,大小,其实就是平常用的 ll ll -h # ...

  7. 当前工程中typescritpt依赖包与依赖包中依赖包类型不一致如何解决

    在开发中,遇到文件中引入webpack,但是webpack.ICompiler不一致的情况 //import webpack from 'webpack'; import webpackHot fro ...

  8. 关闭Windows form窗体

    原文https://www.cnblogs.com/HappyEDay/p/5713707.html  在c#中退出WinForm程序包括有很多方法 this.Close(); Application ...

  9. CSS之小知识

    1.居中 a.文字水平居中 text-align:center; b.文字垂直居中 /* 如果有n行文字,那么将行高设为容器高度的n分之一 */ height: 35px; line-height: ...

  10. C# 实现窗体底部滚动字幕

    使用的控件 panel和label及其定时器. 实现原理 通过定时器定时将label的位置在panel上进行移动,实现滚动的视觉效果,此处将label放在panel上的好处是可以单独设置滚动字母的背景 ...