热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

netstat-st输出解析(二)

转自:http:perthcharles.github.io20151110wiki-netstat-procnetstat-st输出的两个重要信息来源分别是procne

转自:http://perthcharles.github.io/2015/11/10/wiki-netstat-proc/

 

netstat -st输出的两个重要信息来源分别是/proc/net/snmp和/proc/net/netstat
本文将分类整理这些counterd的含义以及一些注意事项。


在整理的过程中,发现Rover Yu前辈已经
对这些counter做过详细的整理。关于Rover Yu前辈的整理请查看参考资料中的前三篇。
本着不重复造轮子的原则。本文将尽量遵循以下原则,以期从不同的角度呈现对这些counter的理解。

a. 分类整理:根据涉及的不同TCP细节,对counter做更细致的分类 b. 结合sysctl配置:强调sysctl配置与counter之间的关联 c. 强调异常:哪些counter出现非零值,往往就意味着出现了值得关注的问题 d. 信息抽取: 如何从counter中获取有价值的信息 e. 仅关注TCP相关计数器 

计数器分类

类别 涉及counters
常量 RtoAlgorithm、RtoMin、RtoMax、MaxConn
建连统计 ActiveOpens、PassiveOpens、AttemptFails、CurrEstab、EstabResets
数据包统计 InSegs、OutSegs、RetransSegs、InErrs、OutRsts、InCsumErrors、EmbryonicRsts
synCOOKIEs功能 SynCOOKIEsSent、SynCOOKIEsRecv、SynCOOKIEsFailed
TIME_WAIT回收 TW、TWRecycled、TWKilled、TCPTimeWaitOverflow
RTO次数 TCPTimeouts、TCPSpuriousRTOs、TCPLossProbes、TCPLossProbeRecovery、
TCPRenoRecoveryFail、TCPSackRecoveryFail、
TCPRenoFailures、TCPSackFailures、
TCPLossFailures
Retrans数量 TCPFastRetrans、TCPForwardRetrans、
TCPSlowStartRetrans、TCPLostRetransmit、
TCPRetransFail
FastOpen TCPFastOpenActive、TCPFastOpenPassive、
TCPFastOpenPassiveFail、TCPFastOpenListenOverflow、
TCPFastOpenCOOKIEReqd
MD5 TCPMD5NotFound、TCPMD5Unexpected
DelayedACK DelayedACKs、DelayedACKLocked、DelayedACKLost、
TCPSchedulerFailed
DSACK TCPDSACKOldSent、TCPDSACKOfoSent、
TCPDSACKRecv、TCPDSACKOfoRecv、
TCPDSACKIgnoredOld、TCPDSACKIgnoredNoUndo
Reorder TCPFACKReorder、TCPSACKReorder、
TCPRenoReorder、TCPTSReorder
Recovery TCPRenoRecovery、TCPSackRecovery、
TCPRenoRecoveryFail、TCPSackRecoveryFail
Abort TCPAbortOnData、TCPAbortOnClose、
TCPAbortOnMemory、TCPAbortOnTimeout、
TCPAbortOnLingerTCPAbortFailed

|reset相关 | |
|内存prune | PruneCalled、RcvPruned、OfoPruned、
TCPMemoryPressures |
|PAWS相关 | PAWSPassive、PAWSActive、PAWSEstab |
|Listen相关 | ListenOverflows、ListenDrops |
|undo相关 | TCPFullUndo、TCPPartialUndo、
TCPDSACKUndo、TCPLossUndo |
|快速路径与慢速路径 | TCPHPHits、TCPHPHitsToUser、
TCPPureAcks、TCPHPAcks |



常量

这些常量是Linux3.10中的默认值,仅在升级了内核版本时才需要关心一下这些值的变化。

RtoAlgorithm: 默认为1,RTO算法与RFC2698一致 RtoMin: 默认值为HZ/5,即200ms RtoMax: 默认值为120HZ,即120s MaxConn: 协议栈本身并不会限制TCP连接总数,默认值为-1. 

建连统计

这些统计值中,只有CurrEstab反应的是系统当前状态,而其他值则是反应的历史状态
同时需要注意的是,这些计数器将ESTABLISHED和CLOSE-WAIT状态都作为当前连接数。
可以这么理解:这两个状态都以为这local=>peer方向的连接未被关闭

ActiveOpens: 主动建连次数,CLOSE => SYN-SENT次数 PassiveOpens: 被动建连次数,RFC原意是LISTEN => SYN-RECV次数,但Linux选择在三次握手成功后才加1 AttemptFails: 建连失败次数 EstabResets: 连接被reset次数,ESTABLISHED => CLOSE次数 + CLOSE-WAIT => CLOSE次数 CurrEstab: 当前TCP连接数,ESTABLISHED个数 + CLOSE-WAIT个数 

数据包统计

这些统计值也是历史值,独立的来看意义并不大。一般可统计一段时间内的变化,关注以下几个指标
a. TCP层的重传率: ΔRetransSegs / ΔOutSegs — 越小越好,如果超过20%(这个值根据实际情况而定)则应该引起注意
b. Reset发送频率: ΔOutRsts / ΔOutSegs — 越小越好,一般应该在1%以内
c. 错误包占比: ΔInErrs / ΔInSegs — 越小越好,一般应该在1%以内,同时由checksum导致的问题包应该更低

InSegs: 收到的数据包个数,包括有错误的包个数 OutSegs: 发送的数据包个数 RetransSegs: 重传的包个数 InErrs: 收到的有问题的包个数 OutRsts: 发送的带reset标记的包个数 InCsumErrors: 收到的checksum有问题的包个数,InErrs中应该只有*小部分*属于该类型 EmbryonicRsts: 在SYN-RECV状态收到带RST/SYN标记的包个数 

synCOOKIEs功能

synCOOKIEs一般不会被触发,只有在tcp_max_syn_backlog队列被占满时才会被触发
因此SynCOOKIEsSent和SynCOOKIEsRecv一般应该是0。
但是SynCOOKIEsFailed值即使synCOOKIEs机制没有被触发,也很可能不为0。
这是因为一个处于LISTEN状态的socket收到一个不带SYN标记的数据包时,就会调
用COOKIE_v4_check()尝试验证COOKIE信息。而如果验证失败,Failed次数就加1。

SynCOOKIEsSent: 使用synCOOKIE技术发送的syn/ack包个数 SynCOOKIEsRecv 收到携带有效synCOOKIE信息包个数 SynCOOKIEsFailed 收到携带无效synCOOKIE信息包个数 

注: synCOOKIEs机制是为应对synflood攻击而被提出来的。


TIME-WAIT回收

TIME-WAIT状态是TCP协议状态机中的重要一环,服务器设备一般都有非常多处于TIME-WAIT状态的socket
如果是在主要提供HTTP服务的设备上,TW值应该接近TcpPassiveOpens值。
一般情况下,sysctl_tcp_tw_reuse和sysctl_tcp_tw_recycle都是不推荐开启的。这里解释了为什么。
所以TWKilled和TWRecycled都应该是0。
同时TCPTimeWaitOverflow也应该是0,否则就意味着内存使用方面出了大问题。

TW:
    经过正常的TCP_TIMEWAIT_LEN(60s)结束TW状态的socket数量
TWKilled:
    经过更短的时间结束TW状态的socket数量。
    只有在net.ipv4.tcp_tw_recycle开启时,调度TW timer时才可能用更短的timeout值。
TWRecycled:
    Port从TIMEWAIT socket中复用的次数。
    只有在sysctl_tcp_tw_reuse开启时,才可能加1 郁闷的是上面两个counter的命名与sysctl的命名真是超级不一致啊。囧... TCPTimeWaitOverflow: 如果没有内存分配TIME-WAIT结构体,则加1 

RTO次数

RTO超时对TCP性能的影响是巨大的,因此关心RTO超时的次数也非常必要。
当然3.10中的TLP机制能够减少一定量的TCPTimeouts数,将其转换为快速重传。
关于TLP的原理部分,可参考我的这篇wiki。

TCPTimeouts: RTO timer第一次超时的次数,仅包含直接超时的情况 TCPSpuriousRTOs: 通过F-RTO机制发现的虚假超时个数 TCPLossProbes: Probe Timeout(PTO)导致发送Tail Loss Probe (TLP)包的次数 TCPLossProbeRecovery: 丢失包刚好被TLP探测包修复的次数 /* 由以下计数器可以看出,进入RTO被触发时,TCP是可能处于多种不同状态的 */ TCPRenoRecoveryFail: (也放到了Recovery类别) 先进入Recovery阶段,然后又RTO的次数,对端不支持SACK选项 TCPSackRecoveryFail:(也放到了Recovery类别) 先进入Recovery阶段,然后又RTO的次数,对端支持SACK选项 TCPRenoFailures: 先进TCP_CA_Disorder阶段,然后又RTO超时的次数,对端不支持SACK选项 TCPSackFailures: 先进TCP_CA_Disorder阶段,然后又RTO超时的次数,对端支持SACK选项 TCPLossFailures: 先进TCP_CA_Loss阶段,然后又RTO超时的次数 

Retrans数量

这些计数器统计的重传包,都不是由于RTO超时导致进行的重传
如果结合RetransSegs统计来看,如果这些非RTO导致的重传占比较大的话,也算是不幸中的万幸。
另外LostRetransmit的数量应该偏低比较好,重传包如果都大量被丢弃,则真的要注意了。

TCPLostRetransmit: 丢失的重传SBK数量,没有TSO时,等于丢失的重传包数量 TCPFastRetrans: 成功快速重传的SKB数量 TCPForwardRetrans: 成功ForwardRetrans的SKB数量,Forward Retrans重传的序号高于retransmit_high的数据 TODO: retransmit_high目前的理解是被标记为lost的SKB中,最大的end_seq值 TCPSlowStartRetrans: 成功在Loss状态发送的重传SKB数量,而且这里仅记录非RTO超时进入Loss状态下的重传数量 目前找到的一种非RTO进入Loss状态的情况就是:tcp_check_sack_reneging()函数发现 接收端违反(renege)了之前的SACK信息时,会进入Loss状态 TCPRetransFail: 尝试FastRetrans、ForwardRetrans、SlowStartRetrans重传失败的次数 

FastOpen

TCP FastOpen(TFO)技术是Google提出来减少三次握手开销的技术,
核心原理就是在第一次建连时server计算一个COOKIEs发给client,之后client向
server再次发起建连请求时就可以携带COOKIEs信息验明正身。如果COOKIEs验证通过,
server可以不等三次握手的最后一个ACK包就将client放在SYN包里面的数据传递给application layer。

在3.10内核中,TFO由sysctl_tcp_fastopen开关控制,默认值为0(关闭)。
而且sysctl_tcp_fastopen目前也是推荐关闭的,因为网络中有些middlebox会丢弃那些带有不认识的option的SYN包.
所以正常情况下这些值也应该都是0,当然如果收到过某些不怀好意带TFO COOKIEs信息的SYN包,
TCPFastOpenPassive计数器就可能不为0。

TCPFastOpenActive: 发送的带TFO COOKIE的SYN包个数 TCPFastOpenPassive: 收到的带TFO COOKIE的SYN包个数 TCPFastOpenPassiveFail: 使用TFO技术建连失败的次数 TCPFastOpenListenOverflow: TFO请求数超过listener queue设置的上限则加1 TCPFastOpenCOOKIEReqd: 收到一个请求TFO COOKIEs的SYN包时加1 

MD5

TCP MD5 Signature选项是为提高BGP Session的安全性而提出的,详见RFC 2385。
因此内核中是以编译选项,而不是sysctl接口来配置是否使用该功能的。
如果内核编译是的CONFIG_TCP_MD5SIG选项未配置,则不会支持TCPMD5Sig,下面两个计数器也就只能是0

TCPMD5NotFound: 希望收到带MD5选项的包,但是包里面没有MD5选项 TCPMD5Unexpected: 不希望收到带MD5选项的包,但是包里面有MD5选项 

DelayedACK

DelayedACK是内核中默认支持的,但即使使用DelayedACKs,每收到两个数据包也
必须发送一个ACK。所以DelayedACKs可以估算为发送出去的ACK数量的一半。
同时DelayedACKLocked反应的是应用与内核争抢socket的次数,
如果占DelayedACKs比例过大可能就需要看看应用程序是否有问题了。

DelayedACKs: 尝试发送delayed ack的次数,包括未成功发送的次数 DelayedACKLocked: 由于usr锁住了sock,而无法发送delayed ack的次数 DelayedACKLost: TODO 暂时不理解准确含义 TCPSchedulerFailed: 如果在delay ack处理函数中发现prequeue还有数据,就加1。 数据放到prequeue,就是想user能尽快处理。如果任由数据, 则可能user行为调度效果不好 这个值应该非常接近于零才正常 

DSACK

该类型计数器统计的是收/发DSACK信息次数。
DSACKOldSent + DSACKOfoSent可以当做是发送出的DSACK信息的次数,而且概率上来讲
OldSent应该占比更大。
同理DSACKRecv的数量也应该远多于DSACKOfoRecv的数量。
另外DSACK信息的发送是需要sysctl_tcp_dsack开启的,如果发现sent两个计数器为零,则要检查一下了。
一般还是建议开启dsack选项

TCPDSACKOldSent: 如果收到的重复数据包序号比rcv_nxt(接收端想收到的下一个序号)小,则增加oldsent TCPDSACKOfoSent: 如果收到的重复数据包序号比rcv_nxt大,则是一个乱序的重复数据包,增加ofosent TCPDSACKRecv: 收到的old dsack信息次数,判断old的方法:dsack序号小于ACK号 TCPDSACKOfoRecv: 收到的Ofo dsack信息次数 TCPDSACKIgnoredOld: 当一个dsack block被判定为无效,且设置过undo_marker,则加1 TCPDSACKIgnoredNoUndo: 当一个dsack block被判定为无效,且未设置undo_marker,则加1 

Reorder

当发现了需要更新某条TCP流的reordering值(乱序值)时,以下计数器可能被使用到。
不过下面四个计数器为互斥关系,最少见的应该是TCPRenoReorder,毕竟sack已经被
广泛部署使用了。
TODO: 什么情况下能准确的判断出要更新reorder值呢?

TCPTSReorder: 如果是被一个partial ack确认后需要更新reorder值,则加1 这个地方取个TS的名字,还真是费解。不知道是什么的缩写表示了partial ack的含义。 TCPRenoReorder: 如果被不支持SACK的dupack确认后,需要更新reorder值,则加1 TCPFACKReorder: 如果在需要更新时判断支持FACK,则加1 TCPSACKReorder: 如果仅支持SACK,则该计数器加1 

关于partial ack的完整内容可参考RFC6582,这里摘要定义部分

In the case of multiple packets dropped from a single window of data, the first new information available to the sender comes when the sender receives an acknowledgment for the retransmitted packet (that is, the packet retransmitted when fast retransmit was first entered). If there is a single packet drop and no reordering, then the acknowledgment for this packet will acknowledge all of the packets transmitted before fast retransmit was entered. However, if there are multiple packet drops, then the acknowledgment for the retransmitted packet will acknowledge some but not all of the packets transmitted before the fast retransmit. We call this acknowledgment a partial acknowledgment. 

Recovery

该类型计数器统计的进入快速重传阶段的总次数及失败次数,失败次数是指先进入了
recovery阶段,然后有RTO超时了。Fast Recovery没有成功。
首先由于SACK选项已经大面积使用,RenoRecovery的次数应该远小于SackRecovery的次数
另外fail的次数应该比例较小才比较理想

TCPRenoRecovery: 进入Recovery阶段的次数,对端不支持SACK选项 TCPSackRecovery: 进入Recovery阶段的次数,对端支持SACK选项 TCPRenoRecoveryFail: (也放到了RTO次数类别) 先进入Recovery阶段,然后又RTO的次数,对端不支持SACK选项 TCPSackRecoveryFail:(也放到了RTO次数类别) 先进入Recovery阶段,然后又RTO的次数,对端支持SACK选项 

Abort

abort本身是一种很严重的问题,因此是否有必要关心这些计数器
后三个计数器如果不为0,则往往意味着系统发生了较为严重的问题,需要格外注意

TCPAbortOnClose: 如果调用tcp_close()关闭socket时,recv buffer中还有数据,则加1 此时会主动发送一个reset包给对端 TCPAbortOnData: 如果在FIN_WAIT_1和FIN_WAIT_2状态下收到后续数据,或TCP_LINGER2设置小于0,则计数器加1 TCPAbortOnTimeout: 因各种计时器(RTO/PTO/keepalive)的重传次数超过上限,而关闭连接时,计数器加1 TCPAbortOnMemory: 如果orphan socket数量或者tcp_memory_allocated超过上限,则加1 一般值为0 TCPAbortOnLinger: tcp_close()中,因tp->linger2被设置小于0,导致FIN_WAIT_2立即切换到CLOSE状态的次数 一般值为0 TCPAbortFailed: 如果在准备发送reset时,分配SKB或者发送SKB失败,则加1 一般值为0 

c. 当rcv_buf不足时可能需要prune ofo queue, 这种情况就会导致PruneCalled计数器增加; 当一般都应该通过collapse节省内存就可以了,并不需要真正的prune掉被SACK的数据。 所以OfoPruned和更严重的RcvPruned都应该计数为0。 

参考资料

TCP SNMP counters一
TCP SNMP counters二
TCP SNMP counters三
RFC 2012: SNMPv2 Management Information Base for the Transmission Control Protocol using SMIv2
TCP Fast Open: expediting web services


推荐阅读
  • 【爬虫】关于企业信用信息公示系统加速乐最新反爬虫机制
    ( ̄▽ ̄)~又得半夜修仙了,作为一个爬虫小白,花了3天时间写好的程序,才跑了一个月目标网站就更新了,是有点悲催,还是要只有一天的时间重构。升级后网站的层次结构并没有太多变化,表面上 ... [详细]
  • 学习SLAM的女生,很酷
    本文介绍了学习SLAM的女生的故事,她们选择SLAM作为研究方向,面临各种学习挑战,但坚持不懈,最终获得成功。文章鼓励未来想走科研道路的女生勇敢追求自己的梦想,同时提到了一位正在英国攻读硕士学位的女生与SLAM结缘的经历。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 深入解析Linux下的I/O多路转接epoll技术
    本文深入解析了Linux下的I/O多路转接epoll技术,介绍了select和poll函数的问题,以及epoll函数的设计和优点。同时讲解了epoll函数的使用方法,包括epoll_create和epoll_ctl两个系统调用。 ... [详细]
  • ShiftLeft:将静态防护与运行时防护结合的持续性安全防护解决方案
    ShiftLeft公司是一家致力于将应用的静态防护和运行时防护与应用开发自动化工作流相结合以提升软件开发生命周期中的安全性的公司。传统的安全防护方式存在误报率高、人工成本高、耗时长等问题,而ShiftLeft提供的持续性安全防护解决方案能够解决这些问题。通过将下一代静态代码分析与应用开发自动化工作流中涉及的安全工具相结合,ShiftLeft帮助企业实现DevSecOps的安全部分,提供高效、准确的安全能力。 ... [详细]
  • Apache Shiro 身份验证绕过漏洞 (CVE202011989) 详细解析及防范措施
    本文详细解析了Apache Shiro 身份验证绕过漏洞 (CVE202011989) 的原理和影响,并提供了相应的防范措施。Apache Shiro 是一个强大且易用的Java安全框架,常用于执行身份验证、授权、密码和会话管理。在Apache Shiro 1.5.3之前的版本中,与Spring控制器一起使用时,存在特制请求可能导致身份验证绕过的漏洞。本文还介绍了该漏洞的具体细节,并给出了防范该漏洞的建议措施。 ... [详细]
  • 本文整理了Java中java.lang.NoSuchMethodError.getMessage()方法的一些代码示例,展示了NoSuchMethodErr ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • 本文介绍了Perl的测试框架Test::Base,它是一个数据驱动的测试框架,可以自动进行单元测试,省去手工编写测试程序的麻烦。与Test::More完全兼容,使用方法简单。以plural函数为例,展示了Test::Base的使用方法。 ... [详细]
  • 推荐系统遇上深度学习(十七)详解推荐系统中的常用评测指标
    原创:石晓文小小挖掘机2018-06-18笔者是一个痴迷于挖掘数据中的价值的学习人,希望在平日的工作学习中,挖掘数据的价值, ... [详细]
  • 使用圣杯布局模式实现网站首页的内容布局
    本文介绍了使用圣杯布局模式实现网站首页的内容布局的方法,包括HTML部分代码和实例。同时还提供了公司新闻、最新产品、关于我们、联系我们等页面的布局示例。商品展示区包括了车里子和农家生态土鸡蛋等产品的价格信息。 ... [详细]
  • 单页面应用 VS 多页面应用的区别和适用场景
    本文主要介绍了单页面应用(SPA)和多页面应用(MPA)的区别和适用场景。单页面应用只有一个主页面,所有内容都包含在主页面中,页面切换快但需要做相关的调优;多页面应用有多个独立的页面,每个页面都要加载相关资源,页面切换慢但适用于对SEO要求较高的应用。文章还提到了两者在资源加载、过渡动画、路由模式和数据传递方面的差异。 ... [详细]
  • 本文整理了Java中org.gwtbootstrap3.client.ui.Icon.addDomHandler()方法的一些代码示例,展示了Icon.ad ... [详细]
author-avatar
处女同乡会同乡情
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有