背景

在我们内部产品中,一直有关于网络性能数据监控需求,我们之前是直接使用 ping 命令收集结果,每台服务器去 ping (N-1) 台,也就是 N^2 的复杂度,稳定性和性能都存在一些问题,最近打算对这部分进行重写,在重新调研期间看到了 Pingmesh 这篇论文,Pingmesh 是微软用来监控数据中心网络情况而开发的软件,通过阅读这篇论文来学习下他们是怎么做的。

数据中心自身是极为复杂的,其中网络涉及到的设备很多就显得更为复杂,一个大型数据中心都有成百上千的节点、网卡、交换机、路由器以及无数的网线、光纤。在这些硬件设备基础上构建了很多软件,比如搜索引擎、分布式文件系统、分布式存储等等。在这些系统运行过程中,面临一些问题:如何判断一个故障是网络故障?如何定义和追踪网络的 SLA?出了故障如何去排查?

基于这几点问题,微软设计开发了 Pingmesh,用来记录和分析数据中心的网络情况。在微软内部 Pingmesh 每天会记录 24TB 数据,进行 2k 亿次 ping 探测,通过这些数据,微软可以很好的进行网络故障判定和及时的修复。

数据中心网络

常见的数据中心网络拓扑:

网络延时计算方式:server A 发送消息到 server B 接受消息的时间。最终使用 RTT 时间,RTT 一个好处是绝对时间,与时钟不相关。

在大多数情况下,大家不会去关心延时具体是什么导致的,都是直接归结于网络原因,让网络团队去排查,实际上是浪费了很多人力成本。延时变高有很多原因:CPU 繁忙、服务自身 Bug、网络原因等等。往往丢包会伴随着延时升高,因为丢包意味着会发生重传,所以丢包也是需要观察的重点。

因为 Pingmesh 运行在微软内部,所以依托于微软自己的基础架构,有自动化管理系统 Autopilot,有大数据系统 Cosmos,也有类似于 SQL 的脚本语言 SCOPE。

设计

根据上面的需求,Pingmesh 先评估了现有的开源工具,不符合的原因有很多,大多数工具都是以命令行形式呈现,一般是出现故障了去使用工具排查,而且工具提供的数据也不全面,有可能正在运行工具问题已经解决了。当然这并不是说已有的工具没有用,只能说不适合 Pingmesh。

Pingmesh 是松耦合设计,每个组件都是可以独立运行的,分为 3 个组件。在设计的时候需要考虑几点:

  • 因为要运行在所有的 server 上,所以不能占用太多的计算资源或网络资源
  • 需要是灵活配置的且高可用的的
  • 记录的数据需要进行合理的汇总分析

Pingmesh 架构设计:

Controller

Controller 主要负责生成 pinglist 文件,这个文件是 XML 格式的,pinglist 的生成是很重要的,需要根据实际的数据中心网络拓扑进行及时更新。

在生成 pinglist 时, Controller 为了避免开销,分为3 个级别:

  1. 在机架内部,让所有的 server 互相 ping,每个 server ping (N-1) 个 server
  2. 在机架之间,则每个机架选几个 server ping 其他机架的 server,保证 server 所属的 ToR 不同
  3. 在数据中心之间,则选择不同的数据中心的几个不同机架的 server 来ping

Controller 在生成 pinglist 文件后,通过 HTTP 提供出去,Agent 会定期获取 pinglist 来更新 agent 自己的配置,也就是我们说的“拉”模式。Controller 需要保证高可用,因此需要在 VIP 后面配置多个实例,每个实例的算法一致,pinglist 文件内容也一致,保证可用性。

Agent

微软数据中心的每个 server 都会运行 Agent,用来真正做 ping 动作的服务。为了保证获取结果与真实的服务一致,Pingmesh 没有采用 ICMP ping,而是采用的 TCP/HTTP ping。所以每个 Agent 即是 Server 也是 Client。每个 ping 动作都开启一个新的连接,主要为了减少 Pingmesh 造成的 TCP 并发。

Agent 要保证自己是可靠的,不会造成一些严重的后果,其次要保证自己使用的资源要足够的少,毕竟要运行在每个 server 上。两个server ping 的周期最小是 10s,Packet 大小最大 64kb。针对灵活配置的需求,Agent 会定期去 Controller 上拉取 pinglist,如果 3 次拉取不到,那么就会删除本地已有 pinglist,停止 ping 动作。

在进行 ping 动作后,会将结果保存在内存中,当保存结果超过一定阈值或者到达了超时时间,就将结果上传到 Cosmos 中用于分析,如果上传失败,会有重试,超过重试次数则将数据丢弃,保证 Agent 的内存使用。

Analysis

拿到了数据就要进行分析,Pingmesh 会以 10min,1hour,1天的粒度进行统计汇总,数据的实时性最快也就是 10min ,Pingmesh 还借助内部的基础设施能够拿到 5min 级别的数据结果,算是一种“实时”监控吧。

网络状况

根据论文中提到的,不同负载的数据中心的数据是有很大差异的,在 P99.9 时延时大概在 10-20ms,在 P99.99 延时大概在100+ms 。关于丢包率的计算,因为没有用 ICMP ping 的方式,所以这里是一种新的计算方式,(一次失败 + 二次失败)次数/(成功次数)= 丢包率。这里是每次 ping 的 timeout 是 3s,windows 重传机制等待时间是 3s,下一次 ping 的 timeout 时间是 3s,加一起也就是 9s。所以这里跟 Agent 最小探测周期 10s 是有关联的。二次失败的时间就是 (2 * RTT)+ RTO 时间。

Pingmesh 的判断依据有两个,如果超过就报警:

  • 延时超过 5ms
  • 丢包率超过 10^(-3)

在论文中还提到了其他的网络故障场景,交换机的静默丢包。有可能是 A 可以连通 B,但是不能连通 C。还有可能是 A 的 i 端口可以连通 B 的 j 端口,但是 A 的 m 端口不能连通 B 的 j 端口,这些都属于交换机的静默丢包的范畴。Pingmesh 通过统计这种数据,然后给交换机进行打分,当超过一定阈值时就会通过 Autopilot 来自动重启交换机,恢复交换机的能力。

经验学习

  1. 找到可信数据,只有数据来源可信,那么分析才是有效的
  2. 让服务作为 daemon 运行,保证持续的收集数据
  3. 松耦合设计,每个组件都可以独立工作

总结

其实我们自己的系统是有 Prometheus 这样的监控系统的,但是当遇到交换机级别的间歇性故障时,Prometheus 也是故障的状态,所以也就不会收集 exporter 汇报的数据,也就更没办法产生告警了。所以如果遇到那种长时间持续的故障反而是好事,至少我们有一个足够的状态去排查哪里出了问题,否则真的是间歇性故障仅仅依靠 ping, traceroute, iperf, netstat 之类的工具去排查是没什么效果的,只有我们知道过去一段时间的网络情况,才能去排查。

参考链接

本文转载自:论文阅读 《Pingmesh: A Large-Scale System for Data Center Network Latency Measurement and Analysis》

如果您需要 Pingmesh 的产品,可以 联系我们

论文阅读 《Pingmesh: A Large-Scale System for Data Center Network Latency Measurement and Analysis》的更多相关文章

  1. 《Deep Learning of Graph Matching》论文阅读

    1. 论文概述 论文首次将深度学习同图匹配(Graph matching)结合,设计了end-to-end网络去学习图匹配过程. 1.1 网络学习的目标(输出) 是两个图(Graph)之间的相似度矩阵 ...

  2. Deep Learning of Graph Matching 阅读笔记

    Deep Learning of Graph Matching 阅读笔记 CVPR2018的一篇文章,主要提出了一种利用深度神经网络实现端到端图匹配(Graph Matching)的方法. 该篇文章理 ...

  3. Deep Reinforcement Learning for Dialogue Generation 论文阅读

    本文来自李纪为博士的论文 Deep Reinforcement Learning for Dialogue Generation. 1,概述 当前在闲聊机器人中的主要技术框架都是seq2seq模型.但 ...

  4. Deep Learning 33:读论文“Densely Connected Convolutional Networks”-------DenseNet 简单理解

    一.读前说明 1.论文"Densely Connected Convolutional Networks"是现在为止效果最好的CNN架构,比Resnet还好,有必要学习一下它为什么 ...

  5. Deep Learning 26:读论文“Maxout Networks”——ICML 2013

    论文Maxout Networks实际上非常简单,只是发现一种新的激活函数(叫maxout)而已,跟relu有点类似,relu使用的max(x,0)是对每个通道的特征图的每一个单元执行的与0比较最大化 ...

  6. Discriminative Learning of Deep Convolutional Feature Point Descriptors 论文阅读笔记

    介绍 该文提出一种基于深度学习的特征描述方法,并且对尺度变化.图像旋转.透射变换.非刚性变形.光照变化等具有很好的鲁棒性.该算法的整体思想并不复杂,使用孪生网络从图块中提取特征信息(得到一个128维的 ...

  7. Sequence to Sequence Learning with Neural Networks论文阅读

    论文下载 作者(三位Google大佬)一开始提出DNN的缺点,DNN不能用于将序列映射到序列.此论文以机器翻译为例,核心模型是长短期记忆神经网络(LSTM),首先通过一个多层的LSTM将输入的语言序列 ...

  8. Deep Learning 24:读论文“Batch-normalized Maxout Network in Network”——mnist错误率为0.24%

    读本篇论文“Batch-normalized Maxout Network in Network”的原因在它的mnist错误率为0.24%,世界排名第4.并且代码是用matlab写的,本人还没装caf ...

  9. Deep Learning 25:读论文“Network in Network”——ICLR 2014

    论文Network in network (ICLR 2014)是对传统CNN的改进,传统的CNN就交替的卷积层和池化层的叠加,其中卷积层就是把上一层的输出与卷积核(即滤波器)卷积,是线性变换,然后再 ...

  10. Deep Learning 28:读论文“Multi Column Deep Neural Network for Traffic Sign Classification”-------MCDNN 简单理解

    读这篇论文“ Multi Column Deep Neural Network for Traffic Sign Classification”是为了更加理解,论文“Multi-column Deep ...

随机推荐

  1. 史上最强《Java 开发手册》泰山版王者归来!

    阿里妹导读:潜力修炼一年之久的<Java 开发手册(泰山版)>今天发布!此次共计新增 34 条规约,修改描述 90 处,其中错误码规则更是第一次提出完整的解决方案,大家参考错误码示例表,欢 ...

  2. [FE] Quasar BEX 热加载区别: Chrome vs Firefox

    Chrome 浏览器加载扩展程序时指定的是 src-bex 目录.Firefox 指定的是 manifest.json. Quasar 提供的热加载特性是 修改 src/ 目录里的文件,src-bex ...

  3. [FAQ] Error occured while trying to proxy to: xx.xx.x.xx:xx/xx

    遇到这种情况,要知道证明访问并未到达指定的服务地址. 可能原因有未启动.端口占用 等等,请逐一排查. Tool:ChatAI Refer:Proxy_Error Link:https://www.cn ...

  4. dotnet 6 修复找不到 EnumeratorToEnumVariantMarshaler 问题

    我将在一个 .NET Framework 项目升级到 dotnet 6 时发现构建不通过,因为原先的代码使用到了 EnumeratorToEnumVariantMarshaler 类型,在 dotne ...

  5. 移动端、微信小程序兼容性问题汇总(持续更新……

    1. safari浏览器字体不能自动随网页缩放调整大小 -webkit-text-size-adjust:100% 2. 点击<button><input>有灰色透明背景 -w ...

  6. SpringBoot的@Resource和@Autowired+@Qualifier使用

    1.区别 参考: https://blog.csdn.net/xhbzl/article/details/126765893 https://blog.csdn.net/qq_40263124/art ...

  7. Codeforces Round 917 (Div. 2)

    A. Least Product 存在 \(a[i] = 0\),\(min = 0\),不需要任何操作. 负数个数为偶数(包括0),\(min = 0\),把任意一个改为 \(0\). 负数个数为奇 ...

  8. Docker部署Scrapy-redis分布式爬虫框架(整合Selenium+Headless Chrome网页渲染)

    前言 我的京东价格监控网站需要不间断爬取京东商品页面,爬虫模块我采用了Scrapy+selenium+Headless Chrome的方式进行商品信息的采集. 由于最近爬虫用的服务器到期,需要换到新服 ...

  9. M3U8下载器加嗅探浏览器

    M3U8下载器太多了,随便一抓一大把,没什么新奇的. 下载地址: https://www.zhaimaojun.cn/P/%e8%a7%86%e9%a2%91%e7%bd%91%e7%ab%99%e5 ...

  10. 基于三菱Q系列cc-Link的立体仓库控制系统

    系统说明: 方案选择: 工艺流程: 触摸屏设计: 程序设计:采用SFC进行编程,结构清晰,逻辑明了 本文章为学习记录,水平有限,望各路大佬们轻喷!!!    转载请注明出处!!!