linux探秘:netstat中Recv-Q深究

同学们都知道netstat是查看网络连接状况的有力工具,倒是不知道大家有没有仔细注意其中一些细节的东西,比如我在运维时就遇到:

Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State 
udp 1894912 0 127.0.0.1:53 0.0.0.0:*

这个问题,维护过服务器的同学一看都知道,哦这个是接收的队列满了,服务器出问题了,重启吧。

但是我有个习惯,喜欢打破砂锅问到底。就在想这个怎么会这样呢,这个具体是什么问题,Revc-Q的数字的单位是什么,这个数字是从何处来的,于是有了下面的探索。

1. 这是Recv-Q 是什么意思?

首先找到了man,man netstat,官方是这样说的:

Recv-Q

The count of bytes not copied by the user program connected to this socket.

单位是字节,是表示程序总共还有多少字节的数据没有从内核空间的套接字缓存拷贝到用户空间。

2 netstat是怎样得到Recv-Q这个值的呢?

我们使用strace -e open netstat,来看看netstat都打开了什么文件

open("/proc/30419/attr/current", O_RDONLY|O_LARGEFILE) = 5

open("/proc/30419/attr/current", O_RDONLY|O_LARGEFILE) = 5

...

open("/proc/net/tcp", O_RDONLY) = 3

open("/proc/net/tcp6", O_RDONLY) = -1 ENOENT (No such file or directory)

open("/proc/net/udp", O_RDONLY) = 3

open("/proc/net/udp6", O_RDONLY) = -1 ENOENT (No such file or directory)

有没有很眼熟呢,这个/proc/..我们在调优系统的时候通常会用到,里面都写了些什么

既然我们是udp,就看看udp的吧:cat /proc/net/udp

sl local_address rem_address st tx_queue rx_queue tr tm->when retrnsmt uid timeout inode

46: 0100001B:0035 00000000:0000 07 00000000:001CEA00 00:00000000 00000000 70 0 7349

好了,我们注意到红色部分,接收队列rx_queue,对应大小:001CEA00。原来netstat是从这里将数据读出来的,这个001CEA00是十六进制的,换算成十进制就是1894912

3 rx_queue的值是从哪来的?

这里涉及到内核的一些东西,我在搜索rx_queue找到了一些线索

https://github.com/hiboma/hiboma/blob/master/kernel/net/netstat%E3%81%AERecv-Q.md

注意到这里

linux探秘:netstat中Recv-Q深究

rx_queue是sk_rmem_alloc_get函数得到的,继续看

linux探秘:netstat中Recv-Q深究

程序通过返回sk结构体中的sk_rmem_alloc(sk即socket的简写,记录此sock使用了多少内存)来得到这个值.

4 既然是函数,要触发执行才能显示,这个函数是怎么调用的?

我们注意到每次cat /proc/net/udp,得到的值都可能不一样,也就是说在操作这个“文件”时,后面一定做了什么,于是我们继续挖

参考网站http://lxr.free-electrons.com/source/net/ipv4/udp.c#L2414

linux探秘:netstat中Recv-Q深究

/proc这个伪文件系统就是内核和用户对话的平台,当我们cat(open)/proc/net/udp这个文件时,系统帮我们做了open这个对应函数的调用udp_seq_open,

接下来由它调用了udplite4_seq_afinfo结构体的seq_ops.show对应的函数,而udp4_seq_show就正式调用了udp4_format_sock这个函数。

linux探秘:netstat中Recv-Q深究

PS:以上是本人的看法,不免有遗漏和错误,如有问题,还望读者指正.

另外,对于问题一,是一般做运维的都要了解的;

对于问题二,是对做运维自动化的一点想法,不必要使用工具,有时在了解原理后也可以自己重写或者加深理解,提取自己需要的那一块来做监控;

对于问题三,是因为公司有一个服务偶尔出现问题,每次都要重启,随着业务的增大,这个问题希望能解决;

对于问题四,则是本人对这个问题的一点其他想法,可以偷窥系统内部的一点实现,纯属个人爱好

更多相关文章
  • Linux与Windows中的UTC时间 先介绍几个术语 UTC 协调世界时,又称世界标准时间或世界协调时间,简称UTC(从英文“Coordinated Universal Time”/法文“Temps Universel Cordonné”而来),是最主要的世界时间标准,其以原子时秒长为基础,在时 ...
  • Linux的脚本中自动登陆远程主机方法汇总为了方面,我写了个脚本自动ssh登录远端机器,如下,这个脚本需要安装expect包--------------------------------------------------------------------------------======== ...
  • 这几天一直在练习驱动,搭建一个简单的交叉编译环境,交叉编译工具链和开发板的源码都导进去linux的目录中,并且解压,但是执行一个简单的交叉编译命令总会出现一个奇怪的错误提示:as:unrecongnized option 'mcpu=XXX';百思不得其解,后来经过一个实验室的师兄的提示,终于明白了 ...
  • http://linux.chinaunix.net/bbs/viewthread.php?tid=1143601如何调整Linux内核启动中的驱动初始化顺序[问题]此处我要实现的是将芯片的ID用于网卡MAC地址,网卡驱动是enc28j60_init.但是,读取芯片ID的函数,在as352x_afe ...
  • Linux的shell中echo改变输出显示样式echo -e "\033[32;49;1m [DONE] \033[39;49;0m"或echo -e "\e[32;49;1m [DONE] \033[39;49;0m"输出结果 :[DONE]文本终端的颜色 ...
  • Linux基础--系统启动中grub功能
    本文主要讲解grub原理和系统启动过程中grub的作用过程.grub是多数Linux发行版中使用的boot loader系统引导程序, 其主要作用是计算机从boot sequence中选取指定设备之后, 由grub找到系统内核kernel文件并加载内核文件的作用. grub执行过程grub作用过程中 ...
  • curl 用于Linux命令行中去访问网页[root@daixuan ~]# curl www.aminglinux.com                              curl+网址查看网站源代码[root@daixuan ~]# curl -I www.lishiming.net  ...
  • 探秘Java中的String、StringBuilder以及StringBuffer
    探秘Java中String.StringBuilder以及StringBuffer 相信String这个类是Java中使用得最频繁的类之一,并且又是各大公司面试喜欢问到的地方,今天就来和大家一起学习一下String.StringBuilder和StringBuffer这几个类,分析它们的异同点以及了 ...
一周排行
  • iBatis2学习笔记:总结与思考 iBatis2是Hibarnate和其他持久化框架的一个补充,iBatis提供非常灵活的映射策略,在执行效率上接近JDBC.在配置上也非常的灵活,可以实现Hibernate类似的关 ...
  • 零基础学JAVAJavaSE应用部分-35.JAVA类集之三
    JAVA按以下重要顺序· 面向对象 · 类集框架 · JDBC · 文件编程本季目标主要讲 ...
  • zabbix自定义监控网卡流量脚本
    之前写了一篇文章主要介绍zabbix的搭建使用http://msiyuetian.blog ...
  • 文 /玄魂目前言1.服务器层组件2.客户层组件安装过程Initial setup初始管理员密码从浏览器访问后台更新数据管理用户扫描器配置信息查看修复安装错误创建证书更新 NVT客户端证书错误前言OpenVAS是一款开 ...
  • drs_data表空间不足的问题:描述 OCI Error ORA-01691: unable toextend lob segment GIONEE_DRS.SYS_LOB00000855无法通过8192(在表空间 ...
  •     栈是一种常见的数据结构,它虽然有栈顶和栈底之分,但它只能从一端操作(插入或删除),从而是一种"先进后出"的操作模式.向栈内进数据称为压栈(Push),从栈里取出数据叫出栈(POp).例如压 ...
  • 1.首先安装awstats cd /data0/software wget http://sourceforge.net/projects/awstats/files/AWStats/6.9/awstats-6.9. ...
  • LinuxCentOS6.5Sphinx安装和使用二
    1.为了方便测试sphinx,我们设置apache和mysql,每次服务器开机时启动.命令 ...
  •                  文件管理链接:两种:     硬链接:软链接:符号链接(类似windows里的快捷方式)硬链接:[root@server254 ~]# mkdir hlink[root@server ...
  • 要用到tab组件,布局layout中必须有TabHost文件,它有一个id,比如 android:id="@+id/tabhost" 或者android:id="@android:id/ ...