snmpwalk高延时问题分析
问题出现
有两台物理机,一台是192.168.1.15,另一台是192.168.1.43。二者的netsnmp版本相同。
使用snmpwalk去访问两台机器,获取tcp重传数(tcpRetransSegs)时,192.168.1.43回复时间非常长。多达140s+,但是相同配置的192.168.1.15只需要30ms。
-bash-4.1# time snmpwalk -v 2C -c cluster -t 200 -r 0 192.168.1.15 .1.3.6.1.2.1.6.12
TCP-MIB::tcpRetransSegs.0 = Counter32: 2364728
real 0m0.030s
user 0m0.020s
sys 0m0.003s
-bash-4.1# time snmpwalk -v 2C -c cluster -t 200 -r 0 192.168.1.43 .1.3.6.1.2.1.6.12
TCP-MIB::tcpRetransSegs.0 = Counter32: 3771986491
real 2m27.554s
user 0m0.020s
sys 0m0.003s
这个现象非常奇怪,按理说tcpRetransSegs是从/proc/net/snmp中直接拿数据然后解析,耗时应该非常短。不应该到秒级。
而且在使用time snmpwalk -v 2C -c cluster -t 200 -r 0 192.168.1.43 .1.3.6.1.2.1.6.12进行访问时,是立即返回了TCP-MIB::tcpRetransSegs.0 = Counter32: 3771986491的信息,但是接着卡住长达140s+,然后该命令才结束。
说明返回tcpRetransSegs的数据并没有消耗多少时间,但是之后未知的流程导致了巨大时间的消耗。
问题分析
对比了两台机器,发现二者最大的区别在于192.168.1.15上有较少的连接数,大概10+。而192.168.1.43上有多达4000+的连接数。
尝试只用snmpget来获取192.168.1.43上tcpRetransSegs的值
-bash-4.1# time snmpget -v 2C -c cluster -t 200 -r 0 192.168.1.43 .1.3.6.1.2.1.6.12.0
TCP-MIB::tcpRetransSegs.0 = Counter32: 3850778646
real 0m0.025s
user 0m0.023s
sys 0m0.002s
可以发现立即返回,而使用snmpwalk依然耗时巨大。
snmpwalk
snmpwalk是遍历mib上的某棵子树,包含了至少两个动作,get和getnext。
首先对于oid进行get操作,然后进行getnext,获取返回值和名称(oid)。
然后判断该返回的oid是否还在这个子树上,如果不在了,那么就结束。
如果还在该子树上,则使用返回的oid继续getnext,直到结束。
具体来说,就是time snmpwalk -v 2C -c cluster -t 200 -r 0 192.168.1.43 .1.3.6.1.2.1.6.12命令可以分为以下几部分:
首先对oid.1.3.6.1.2.1.6.12进行get。
-bash-4.1# time snmpget -v 2C -c cluster -t 200 -r 0 192.168.1.43 .1.3.6.1.2.1.6.12
TCP-MIB::tcpRetransSegs = No Such Instance currently exists at this OID
real 0m0.025s
user 0m0.019s
sys 0m0.001s
然后进行getnext
-bash-4.1# time snmpgetnext -v 2C -c cluster -t 200 -r 0 192.168.1.43 .1.3.6.1.2.1.6.12
TCP-MIB::tcpRetransSegs.0 = Counter32: 3815361069
real 0m0.025s
user 0m0.022s
sys 0m0.001s
因为返回的tcpRetransSegs.0在.1.3.6.1.2.1.6.12树上,因此继续getnext
-bash-4.1# time snmpgetnext -v 2C -c cluster -t 200 -r 0 192.168.1.43 .1.3.6.1.2.1.6.12.0
TCP-MIB::tcpConnState.0.0.0.0.22.0.0.0.0.0 = INTEGER: listen(2)
real 2m20.125s
user 0m0.022s
sys 0m0.002s
这次返回的tcpConnState.0.0.0.0.22.0.0.0.0.0已经出了.1.3.6.1.2.1.6.12树,因此snmpwalk结束。
这里也可以看到主要的耗时就是在这一步上了。而这一步耗时的主要原因是获取tcpConnState需要将所有的连接遍历一遍。
这也与观察到的192.168.1.43上连接数高相吻合。
结论
time snmpwalk -v 2C -c cluster -t 200 -r 0 192.168.1.43 .1.3.6.1.2.1.6.12耗时巨大的主要原因是错用了snmpwalk。导致去获取tcpConnState的数据,从而致使snmpd在分析所有的连接时,耗费了巨大的时间和CPU资源。
正确的方法应该是使用snmpget -v 2C -c cluster -t 200 -r 0 192.168.1.43 .1.3.6.1.2.1.6.12.0去获取数据。
这里也有一个教训,就是如果能够准确回去的oid数据,最好使用get,使用getnext会降低其效率。
snmpwalk高延时问题分析的更多相关文章
- 对tableView三种计算动态行高方法的分析
tableView是一个神奇的东西,可以这么说,就算是一个初学者如果能把tableView玩的很6,那编一般的iOS的需求都问题不大了.tableView是日常开发中用烂了的控件,但是关于tableV ...
- kafka系列四、kafka架构原理、高可靠性存储分析及配置优化
一.概述 Kakfa起初是由LinkedIn公司开发的一个分布式的消息系统,后成为Apache的一部分,它使用Scala编写,以可水平扩展和高吞吐率而被广泛使用.目前越来越多的开源分布式处理系统如Cl ...
- MySQL CPU %sys 高的案例分析(三)
[现象] 最近有台服务器晚上CPU告警,系统抓取的故障期间的snapshot显示CPU %sys较高,同时context switch在300K以上. 是否过高的context switch引起的%s ...
- MySQL SYS CPU高的案例分析(二)
原文:MySQL SYS CPU高的案例分析(二) 后面又做了补充测试,增加了每秒context switch的监控,以及SQL执行时各步骤消耗时间的监控. [测试现象一] 启用1000个并发线程的压 ...
- MySQL SYS CPU高的案例分析(一)
原文:MySQL SYS CPU高的案例分析(一) [现象] 最近关注MySQL CPU告警的问题时,发现有一种场景,有一些服务器最近都较频繁的出现CPU告警,其中的现象是 SYS CPU占比较高. ...
- Linux内核分析:页回收导致的cpu load瞬间飙高的问题分析与思考--------------蘑菇街技术博客
http://mogu.io/156-156 摘要 本文一是为了讨论在Linux系统出现问题时我们能够借助哪些工具去协助分析,二是讨论出现问题时大致的可能点以及思路,三是希望能给应用层开发团队介绍一些 ...
- 服务器CPU使用率高的原因分析与解决办法
我们的服务器在使用操作系统的时候,用着用着系统就变慢了,打开“ 任务管理器 ”一看,才发现CPU使用率达到80%以上.这是怎么回事情呢?遇到病毒了吗?硬件有问题?还是系统设置有问题呢?在本文中将从硬件 ...
- cpu使用率低负载高,原因分析
原因总结 产生的原因一句话总结就是:等待磁盘I/O完成的进程过多,导致进程队列长度过大,但是cpu运行的进程却很少,这样就体现到负载过大了,cpu使用率低. 下面内容是具体的原理分析:在分析负载为什么 ...
- 【原创】MySQL CPU %sys高的案例分析(一)
[现象] 最近关注MySQL CPU告警的问题时,发现有一种场景,有一些服务器最近都较频繁的出现CPU告警,其中的现象是 SYS CPU占比较高. 下面的截图来源于“MySQL CPU报警”采集的文件 ...
随机推荐
- php rsa 加密、解密、签名、验签
由于对接第三方机构使用的是Java版本的rsa加解密方法,所有刚开始在网上搜到很多PHP版本的rsa加解密,但是对接java大多都不适用. 以下php版本是适用于对接java接口,java适用密钥再p ...
- DOM2级事件对象、添加事件、阻止默认事件、阻止冒泡事件、获取事件对象目标的兼容处理
事件对象——兼容处理 /* * 功能: 事件对象兼容 * 参数: 表示常规浏览器的事件对象e */ function getEvent(e) { // 如果存在e存在,直接返回,否则返回window. ...
- ural1519插头DP
1519. Formula 1 Time limit: 1.0 second Memory limit: 64 MB Background Regardless of the fact, that V ...
- 在windows server里,对于同一个账号,禁止或允许多个用户使用该账户,同时登录
开始 -> 运行 -> gpedit.msc -> 本地计算机 策略 -> 计算机配置 -> 管理模板 -> Windows 组件 -> 远程桌面服务 -&g ...
- 在标记的HREF属性中javascript:alert(this.innerHTML)会怎么样?
原文:在标记的HREF属性中javascript:alert(this.innerHTML)会怎么样? <a href="javascript:alert(this.innerHTML ...
- 系统预定义委托与Lambda表达式
NET中那些所谓的新语法之三:系统预定义委托与Lambda表达式 开篇:在上一篇中,我们了解了匿名类.匿名方法与扩展方法等所谓的新语法,这一篇我们继续征程,看看系统预定义委托(Action/Fun ...
- 一步一步实现基于Task的Promise库(三)waitFor方法的设计
在上一篇中我们已经完成了Task.js里面的all和any方法,已经可以完美的解决大部分需求,我们再来看一个需求: 我们要先读取aa.txt的内容,然后去后台解析,同时由用户指定一个文件,也要读取解析 ...
- 给Angularjs配上Requirejs
给Angularjs配上Requirejs 需要考虑的事情: 1.js.css.template都按需加载,js主要就controller: * js和css都可以用requirejs和它的插件解决, ...
- Entity Framework,TransactionScope 混合使用的问题讨论
using (var ts = new TransactionScope()) { string connStr = "Data Source=.;Initial Catalog=Test; ...
- ASP.NET虚拟路径小结
一.虚拟路径的概念 “虚拟路径”是指请求 URL 中跟在服务器标识符后面的部分举例. 如绝对路径:http://www.mysite.com/MyApp/Default.aspx,其对应的虚拟路径为: ...