netstat显示程序名的bug问题_rheostat的博客-程序员宅基地

技术标签: Socket  

netstat显示程序名的bug问题

之前发现netstat显示程序名存在bug,一直没有深入查看原因。(无权限查看导致不显示和这个无关,-__-b)
有同学深入查看了下,如下:

http://www.makeinstall.cn/index.php/archives/156
netstat和web主机socket文件分析(二)

转载请注明出处,from www.makeinstall.cn
在上一篇,我们发现了netstat的一个bug,即作者未充分考虑到scoket的inode可能很大,以至超过int的最大值。但是,更让人感兴趣的问题出现了:web前段机器上的socket inode号为什么会大到十位数,而其它机器上的几乎都只是八位数。

3. VFS和socket inode分析

      首先,我们需要了解socket的inode是什么。

      socket文件的inode存在于Linux的VFS虚拟文件系统中。VFS是一个异构文件系统之上的软件粘合层,可以让open()、read()、write()等系统调用不用关心底层的存储介质和文件系统类型就可以工作。通过VFS,一个抽象的通用访问接口屏蔽了底层文件系统和物理介质的差异性,每一种类型的文件系统代码都隐藏了实现的细节。对于VFS层和内核的其它部分而言,每一种类型的文件系统看起来都是一样的。

      VFS inode和磁盘文件系统中的inode不同。比如ext2文件系统,它的inode位于磁盘上划分的块组中,每个inode 128字节。在分割扇区时,系统会先做出一堆inode供以后使用,inode 的数量关系着系统中可以建立的文件及目录总数。磁盘上的每个文件都有且仅有一个inode,即使文件中没有数据,inode也是存在的。

      VFS inode只存在于内存中,可以通过inode缓存访问。每个文件在VFS中都有相应的inode结点,包括普通文件、目录以及特殊文件,如socket、pipe等。在需要某个文件的时候系统会在内存中为其建立相应的inode数据结构,建立的inode结构将形成一个链表,可以通过遍历这个链表去得到我们需要的文件结点。但是,VFS对于不同文件的inode号分配方式是不同的。具体如下:

  • 对于ext2等磁盘文件系统中的普通文件,每个文件在磁盘上都有对应的inode,该inode号也是已知的。在访问这些文件时,VFS会在内存中为这个文件分配VFS inode,将在磁盘文件系统中确定的inode号赋给inode结构。可见,一般普通文件的inode号都不会太大。
  • 对于socket等特殊文件来说,并没有像磁盘文件一样的inode号的来源,内核在实现中维护了一个unsigned long型的静态变量来保存目前分配的inode号的最大值,新分配的inode号在此基础上加1来实现。这个静态变量的值会一直增大而不会减小,直至机器重启。

      知道了socket文件inode的分配方式,我们可以假设,在某台机器上,socket文件被频繁的创建(并关闭),则新产生的socket文件对应的inode号会以较快的速度增大,在经过足够长的时间后,inode号的大小会超过INT_MAX的值,这是如果运行netstat -nlp则无法得到其程序名。

      这样的假设确实出现在了web前端机器上。Web全段机器每天负责响应大量用户的连接请求,每个连接都需要通过建立socket来进行通信,这导致socket的inode号会一直快速增长下去。统计了一台的socket inode的情况,记录了在5天内每天同一时间的socket inode最大值,分析得到每天大约会增大70,000,000左右。

      很显然,socket inode的增长情况和前端机器流量在各时段的分布是一致的。这也证明前端机器极大的流量使得socket文件极频繁的创建,导致了在前端机器上出现了超大的inode。

      socket过大除了对netstat的显示结果造成影响外,会不会大到超过unsigned long的最大值而产生问题呢?答案是不会,在线上64位的机器上,unsigned long的最大值是20位数,以每天70,000,000的增量,要达到ULONG_MAX是不可能的。

4. 解决方案

      对于因socket过大导致netstat –nlp不能显示PID/Program name的问题,有没有什么解决方法或者替代方案呢?

  • 修改netstat源码,去除对socket inode最大值判断的限制;
  • 使用lsof命令来查看监听在某个端口的进程,如: $ /usr/sbin/lsof -i :端口号
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/rheostat/article/details/9817291

智能推荐

Aspose Word模板使用总结-程序员宅基地

原文:Aspose Word模板使用总结1.创建word模版,使用MergeFeild绑定数据 新建一个Word文档,命名为Template.doc 注意:这里并不是输入"《”和“》”就可以了,而是必须在菜单的"插入→文档部件→域”找到MergeField并输入相应的域名2.使用数组提供数据源 string tempPath = Server.MapPath...

NGUI 渲染顺序概述_ngui panel depth相同-程序员宅基地

NGUI渲染顺序概述渲染结构NGUI用Panel来管理渲染.一个UIPanel实例表示一个Panel.UIPanel.widgets 表示 Panel 中需要渲染的物体UIPanel.drawCalls 表示 Panel 中的渲染指令.static UIPanel.list 存放所有的 Panel在渲染时,Panel遍历它管理的所有Widgets. 生成DrawCall命令l..._ngui panel depth相同

windows下qt(msvc)查找crash 的方式 生成dump_qt 使用msvc release setunhandledexceptionfilter生成dum-程序员宅基地

上一遍我们研究了 mingw编译的程序生成dump和查找,这遍我们再研究一下msvc编译器下的qt程序其中用到的类,以及整个工程,我放到了github可以供下载参考:源码1. 生成dump文件long ApplicationCrashHandler(EXCEPTION_POINTERS *pException){{ // 在程序exe的上级目录中创建dmp文件夹 ..._qt 使用msvc release setunhandledexceptionfilter生成dump

HM代码阅读1: 帧间预测函数Void TEncSearch::predInterSearch()_cmvtemp[2][max_ref_pics]-程序员宅基地

AMVP理论知识简单回顾(含GPB)MVP主要是为了给当前PU提供一个运动矢量的预测,可加快ME的计算速度以及提升准确性。并且在后续编码中也只用编码MVD,减少了传输bit数。HM中获取每个参考图像列表最佳MVP的流程:遍历refPicList0中的每一帧,为每一帧创建AMVP候选。RDO选出最优MVP。根据最优MVP进行运动估计,得到当前最优的MV。根据MV再次比较AMVP候选中哪一个MVP最优,获取最优MVP存入cMVPred中,还需存储最优MVP在当前候选列表中的索引,将计算得到的bit数_cmvtemp[2][max_ref_pics]

期望最大化(EM)算法(讲的很好)_最大期望值算法例题-程序员宅基地

EM是我一直想深入学习的算法之一,第一次听说是在NLP课中的HMM那一节,为了解决HMM的参数估计问题,使用了EM算法。在之后的MT中的词对齐中也用到了。在Mitchell的书中也提到EM可以用于贝叶斯网络中。下面主要介绍EM的整个推导过程。1. Jensen不等式 回顾优化理论中的一些概念。设f是定义域为实数的函数,如果对于所有的实数x,,那么f是凸函数。当x是向量时,如果_最大期望值算法例题

随便推点

C++之父Bjarne Stroustrup印象_c 之父stroustrup-程序员宅基地

C ++ 的 背 影                   ——C++之父Bjarne Stroustrup印象 左轻侯 2002.11.4  热爱C++的朋友请不要误会,我并不是在暗示“C++已经日薄西山”,或者任何类似的意思。从语义上来说,C++作为一门编程语言,当然不会有什么背影。事实上,我想说的是一个人_c 之父stroustrup

利用openfaas faasd在你的云主机上部署function serverless面板-程序员宅基地

本文关键字:自建云函数后端。self build serverless function as service,single node serverless在前面《云主机上手动安装PAI面板》中我们讲到了在云主机上安装某种“类似baota xx语言项目管理器”的虚拟主机管理面板,也提到它并不是cloudbase版的云函数面板,这种方案要重得多:function serverless最初也是由一个专家一篇文章给的思路,然后业界觉得好用就流行起来了。vs 传统虚拟主机管理面板和language backen_faasd

YTU OJ 2635 P4 游戏中的Human角色-程序员宅基地

题目描述在一个平面打斗游戏中,任何的角色(Role)都有血量(blood)和位置loc(此处loc是Location类的实例)属性。有了Role类,可以派生出不同的角色,如人、神仙、怪兽等。如下程序中,定义了Location类和Role类,人类(Human)中新增了姓名和攻击力数据成员,请为Human类设计成员函数,并实现Role类中的moveTo和addBlood两个成员函数。请在begin和e...

JAVA毕业设计高校多媒体设备运维管理系统服务端计算机源码+lw文档+系统+调试部署+数据库-程序员宅基地

JAVA毕业设计高校多媒体设备运维管理系统服务端计算机源码+lw文档+系统+调试部署+数据库。springboot基于SpringBoot的桦木加工厂管理系统。springcloud基于微服务架构的设备管理系统的设计与实现。ssm临港新片区招商引资项目管理系统的设计与实现。ssm基于javaweb的大学生宿舍管理系统。ssm基于SSM的英语学习网站的设计与实现。springboot中小企业设备管理系统。springboot疫情返乡人员管理系统。springboot阿博图书馆管理系统。...

traefik yml配置-程序员宅基地

静态配置traefik.yml# 流量入口entryPoints: # 定义入口,任意起名 web: # 监听端口 address: :80 forwardedHeaders: insecure: true # http: # redirections: # #转发到另一个入口 # entryPoint: # to: websecure # sche..

BUUCTFweb做题记录_ctf ?num=-程序员宅基地

[HCTF 2018]WarmUp打开网址是一张滑稽,没什么用,看一下源码,发现有注释。访问source.php,直接给了源码,进行代码审计。分两块,第一块是emmm::checkFile,里面做了一些判断。第二块是一个include,文件包含,我们要绕过验证,也就是上面的checkFile方法。测试hint.phpinclude触发的三个判断条件全为真时,include才执行。checkFile为真第一个if,page需要设置并且为字符串第二个if,page需要在白名单中_page_ctf ?num=

推荐文章

热门文章

相关标签