问题

我们的虚拟环境是Hyper-V ,一次在SCVMM上优化了一个VM的动态内存设置后,把SCVMM的视图调整了一下,加了一些性能参数列。在我按照网络吞吐量进行排序时发现,一个很普通的VM的接收吞吐量在TOP1,当时只是觉得可能是瞬间的流量,没有太在意。后面看了几次都在TOP5 之内,觉得问题可能不正常。
奇怪的VM高网络接收吞吐量问题查找

排错步骤

  • VM不太好登录上去看,但是在Hyper-V环境,我们有更好的方法可以进行抓包。那就是Hyper-v网络的高级功能,PORT Mirroring。(大概步骤就是你把VM的网卡设置为镜像的Source,然后在另外一个专门抓包的VM的网卡上设置镜像的Dest),然后你就可以抓Source 的数据包了。参考这个文章配置Hyper-v Network Port Mirroring.

  • 我们的专门抓取数据包的是个centos 7的VM ,这是一个含有工具箱的机器,可以在多个机器上漂移,用来排错,在设置了Port Mirroring后,我们这个VM的第二个网卡上设置成promisc,然后抓了一小段时间的数据包。

    ifconfig eth1 promisc
    tcpdump -i eth1 -w client4.cap
    

揭开真相

  • 拖下来cap包用wireshark进行分析,先对协议进行统计,有个dcerpc的协议占用了75%左右的流量。

奇怪的VM高网络接收吞吐量问题查找

奇怪的VM高网络接收吞吐量问题查找

高峰大概在4Mb/s 了,平均2.5Mb/s 左右,那么如果仔细计算下,60秒就是1分钟的数据量大概就是150Mb,那么10分钟就是1.5Gb,有点吓人,比备份系统的流量都高。

wireshark 对DCE/RPC的解释在这里,而且DCE/RPC的数据主要是和AD的Domain Controller进行交互,就我们内部的应用来看这个很像是使用DCOM访问的数据。

  • 登录到VM本地看看,发现有个深信服的ADSSO应用在这里运行,应该就是它了。看看深信服ADSSO的介绍。

奇怪的VM高网络接收吞吐量问题查找

  • 然后本地还有ADSSO的日志,我们看到大量的warning,肯定无疑这个应用的问题了。

最后总结

  • 没有头绪时需要一步步缩小范围才能定位到问题实质,这个问题我们只能找到问题点,虽然自己没有办法解决,但已经确定到一个非常小的点了,下一步看厂商怎么解决。曾经想反编译下应用代码,看看到底是什么逻辑,这效率太低了。后面发现代码是VC写的,反编译到代码比较麻烦