netstat显示程序名的bug问题_netstat -antup pid/program name显示不全-程序员宅基地

技术标签: 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

智能推荐

HALCON 21.11:深度学习笔记---语义分割/边缘提取(12)_halcon12深度学习案例实现思路-程序员宅基地

文章浏览阅读7.7k次。HALCON 21.11:深度学习笔记---语义分割/边缘提取(12)HALCON 21.11.0.0中,实现了深度学习方法。本章介绍了如何使用基于深度学习的语义分割,包括训练和推理阶段。通过语义分割,我们使用深度学习(DL)网络将输入图像的每个像素分配到一个类。语义分割的例子:输入图像的每个像素都被分配给一个类,但是类“apple”的三个不同实例和类“orange”的两个不同实例都不是可区分的对象语义分割的结果是一个输出图像,其中的像素值表示输入图像中对应像素的指定类别。因此,在._halcon12深度学习案例实现思路

题目名称:组个最小数时间限制:1000ms内存限制:256MB提交通过率:43%_数组程序练习7-1时间限制: 1000毫秒 内存限制: 128mb提交: 4318 解决: 2268-程序员宅基地

文章浏览阅读831次。例如:给定三个 1,三个 0,三个 5,一个 8,我们得到的最小的数就是 1000115558。给定数字 0...9 各若干个,总共十个数字。你可以以任意顺序排列这些数字,但必须全部使用。在一行中给出 10 个 0...9 之间的整数,每个数字间用空格隔开。经过测试,两个方法的时间和空间基本相同,根据情况自行选择吧,886~目标是使得最后得到的数尽可能小(注意 0 不能做首位)。现给定数字,请编写程序输出能够组成的最小的数。给定数字中至少有 1 个非 0 的数字。在一行中输出能够组成的最小的数。_数组程序练习7-1时间限制: 1000毫秒 内存限制: 128mb提交: 4318 解决: 2268[

分布式Session解决方案_前端8080应用如何获取8081应用的session-程序员宅基地

文章浏览阅读79次。分布式Session一致性?说白了就是服务器集群Session共享的问题Session的作用?Session 是客户端与服务器通讯会话跟踪技术,服务器与客户端保持整个通讯的会话基本信息。客户端在第一次访问服务端的时候,服务端会响应一个sessionId并且将它存入到本地cookie中,在之后的访问会将cookie中的sessionId放入到请求头中去访问服务器,如果通过这个sessionid没有找到对应的数据那么服务器会创建一个新的sessionid并且响应给客户端。假设第一次访问服务A生成一个sessio_前端8080应用如何获取8081应用的session

Java基础>03 - 关键字、标识符、常量、变量、运算符_标识符,关键字,常量的区别-程序员宅基地

文章浏览阅读407次。一、关键字:对java的编译器有特殊的意义,用来表示一种数据类型、程序的结构等,关键字不能用作变量名、方法名、类名、包名。二、标识符:自定义的名字,类名、方法名、变量、包名。1、标识符定义原则:标识符由26个英文字符大小写(a-z、A-Z)、数字(0~9)、下划线(_)和美元符号($)组成。不能以数字开头,不能是关键字严格区分大小写标识符的可以为任意长度2、示例:合法:..._标识符,关键字,常量的区别

(转)Tomcat配置单点登录(Single Sign-On)-程序员宅基地

文章浏览阅读117次。一旦你设置了realm和验证的方法,你就需要进行实际的用户登录处理。一般说来,对用户而言登录系统是一件很麻烦的事情,你必须尽量减少用户登录验证的次数。作为缺省的情况,当用户第一次请求受保护的资源时,每一个web应用都会要求用户登录。如果你运行了多个web应用,并且每个应用都需要进行单独的用户验证,那这看起来就有点像你在与你的用户搏斗。用户们不知道怎样才能把多个分离的应用整合成一个单独的系统,所..._singlesignonservlet.class.getname()

flv 开源 修复_如何找到要修复的第一个开源错误-程序员宅基地

文章浏览阅读253次。flv 开源 修复by Shubheksha 通过Shubheksha 如何找到要修复的第一个开源错误 (How to find your first open source bug to fix)When you’re new to open source, you’ll find yourself asking: 当您不熟悉开源时,会发现自己在问: I know some [progr...

随便推点

常见IE浏览器的bug_执行下拉列表的数据过滤方法出错-程序员宅基地

文章浏览阅读2.3k次。常见IE浏览器的bug (1) 子窗口不能直接修改父窗口的select 的options,而是必须通过一个父窗口的函数来间接实现,但Firefox能直接修改。(2) IE 不能在TD or TR 元素上动态加事件,但firefox能,为了实现这个,我不得不加了一个div在里面,填充整个单元格,很麻烦。(3) 当你在页面中使用了实现了IHTMLWindow接口中on_执行下拉列表的数据过滤方法出错

docker及服务器遇到的坑-程序员宅基地

文章浏览阅读1.1k次。目录 DNS不可用 修改docker查找源 容器保持固定ip 查看docker连接 容器间通信 容器拷贝数据 php连接docker mysql 8.0出错authentication method unknown DN..._docker 报错server requested authentication method unknown to the client

如何使用ajax获取后台数据和进行页面渲染_ajax获取数据-程序员宅基地

文章浏览阅读2.3k次。注意:直接通过响应拿到的是string格式的数据 需要通过json数据字符串转对象的方法。3.转化成对象类型后就可以根据需求拿对应数据了。act: login/登录 reg/注册。1.eval('('+数据+')')2.使用get请求获取json数据。2.JSON.parse(数据)1.创建一个json文件。_ajax获取数据

tinyxml使用_tinyxml2 firstattribute-程序员宅基地

文章浏览阅读345次。tinyxml使用http://www.grinninglizard.com/tinyxml/https://sourceforge.net/projects/tinyxml/GitHub:leethomason/tinyxml2在线文档:TinyXml Documentationtinyxml 下载tinyxml_2_6_2.zip文档:tinyxml_2_6_2.zip/tinyxml/docs/index.html_tinyxml2 firstattribute

QPaint绘制仪表盘_qt设计dial刻度盘-程序员宅基地

文章浏览阅读581次,点赞2次,收藏9次。这篇文章设计了一个自己绘制的仪表盘,有背景表盘,刻度线、刻度值,指针,以及动态运行效果。_qt设计dial刻度盘

django的新冠疫苗预约系统的设计与实现(程序+开题报告)-程序员宅基地

文章浏览阅读793次,点赞21次,收藏24次。然而,由于疫苗供应有限,如何公平、高效地分配疫苗资源,确保人们能够及时接种疫苗,成为了一个亟待解决的问题。通过该系统,用户可以方便地进行疫苗接种预约,医院可以实时更新疫苗库存信息,政府可以掌握疫苗接种情况,从而共同推动疫苗接种工作的顺利进行。同时,用户可以查看疫苗相关信息,如疫苗种类、适用人群、副作用等,以便做出明智的选择。[7] 张华, 翟新军, 胥勇, 李伟强, 杨健, 赵嘉伟, 张涛. Python在集控大数据应用的研究[J]. 价值工程, 2023, 42 (21): 84-86.

推荐文章

热门文章

相关标签