• Pingmesh: A Large-Scale System for Data Center Network Latency Measurement and Analysis


    简要

    在今天的数据中心的网络中,涉及到的网络设备是极其复杂多样的。一个大型的数据中心都有成百上千的节点,网卡,交换机,路由器以及无数的网线,光纤。在这些硬件设备基础上构建了很多软件,比如搜索引擎、分布式文件系统、分布式存储等等。在这些系统运行的过程中,面临一些问题:如何去测离网络时延,如何去判断一个故障时网络故障?如何去定位一个网络故障?如何定义和追踪网络的SLA?
    基于这几点问题,微软设计开发了Pingmesh,展示了建立大规模网络延迟的测量和分析系统的可行性。

    背景介绍

    数据中心网络

    常见的数据中心网络拓扑

    在这篇论文中,作者把网络分为两部分。
    第一部分是intra data center (Intra-DC)network。
    第二部分为 inter data center (Inter-DC)network
    Intra—DC包含三层:

    • Access Layer(接入层):有时也称为Edge Layer。接入交换机通常位于机架顶部,所以它们也被称为ToR(Top of Rack)交换机,它们物理连接服务器
    • Aggregation Layer(汇聚层):有时候也称为Distribution Layer。汇聚交换机连接Access交换机,同时提供其他的服务,例如防火墙,SSL offload,入侵检测,网络分析等。
    • Core Layer(核心层):核心交换机为进出数据中心的包提供高速的转发,为多个汇聚层提供连接性,核心交换机为通常为整个网络提供一个弹性的L3路由网络。
      通常情况下,每组汇聚交换机管理一个POD(Point Of Delivery),每个POD内都是独立的VLAN网络。服务器在POD内迁移不必修改IP地址和默认网关,因为一个POD对应一个L2广播域。
      汇聚交换机和接入交换机之间通常使用STP(Spanning Tree Protocol)。STP使得对于一个VLAN网络只有一个汇聚层交换机可用,其他的汇聚层交换机在出现故障时才被使用(上图中的虚线)。

    网络延迟和数据包丢失

    这里的网络延迟测离的是RTT。因为RTT测量不需要同步服务器时钟。

    设计与实施

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

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

    Pingmesh 构架设计


    Pingmesh有三个部分组成,分别是Pingmesh Controller,Pingmesh Agent,Data Storage and Analysis.

    Pingmesh Controller

    它是整个系统的大脑,因为它决定了服务器应该如何相互探测。 在Pingmesh Controller中,Pingmesh Generator为每个服务器生成一个pinglist文件。 pinglist文件包含对等服务器列表和相关参数。 pinglist文件基于网络拓扑生成。 服务器通过RESTful Web界面获取相应的pinglist。

    Pingmesh 生成原则

    由于Pingmesh Agent 运行在所有的server上,Controller为了避免开销,抽象了三层完全有向图。

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

    Pingmesh Agent

    Pingmesh Agent的任务很简单:从Pingmesh Controller下载pinglist; ping pinglist中的服务器; 由于Pingmesh运行在所有服务器上,为了保证获取结果的真实的服务一致,Pingmesh 没有采用ICMP ping,而是采用的TCP/HTTP ping ,所有每个Agent即使Server也是Client。每个Ping动作都要开启一个新的连接,主要是为了减少Pingmesh造成的TCP并发。
    Agent要保证自己是可靠的,不会造成一些严重的后果,其次要保证自己使用的资源足够少,毕竟运行在每个Server上。两个Server ping的周期最小是10s,packet大小最大64kb。针对灵活的配置需求,Agent会定期去Controller上拉去pinglist,如果三次拉取不到,哪么就会删除本地已有的pinglist,停止ping动作。
    在进行ping动作后,会将结果保存在内存中,当保存结果超过一定的阈值或者达到了超时时间,就将结果上传到Cosmos(后面会介绍)中用于分析,如果上传失败,会有重试次数则数据丢弃,保证Agent的内存使用。

    Data Storage and Analysis

    对于数据的存储和分析,这篇论文使用现有的系统(Cosmos/SCOPE)和Autopilot Perfcounter(PA)。
    Pingmesh代理会定期将时延记录上传到Cosmos。 与Pingmesh控制器类似,Cosmos的前端使用负载均衡和VIP(虚拟地址IP)进行扩展。 同时,Pingmesh 代理对延迟数据执行本地计算,并生成一组性能计数器,包括50%至90%的丢包率和网络延迟等。所有这些性能计数器都被收集,汇总和存储在Autopilot的PA服务。当收集到数据,Pingmesh有三种粒度对数据进行分析,分别以10min,1hour,1day的粒度进行统计汇总,数据的实时性最快也就是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 来自动重启交换机,恢复交换机的能力。

    总结

    这篇论文的不足之处:

    • 尽管Pingmesh能够检测到故障网络设备所在的层,但它无法确定准确的位置。
    • 网络测量RTT只能测单次的。无法测出多次往返的情况。
  • 相关阅读:
    Android修改app的图标
    关于Python3中的WARNING: Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connection broken by 'ReadTimeoutError("HTTPSConnectionPool(host='pypi.org', port=443):
    Android 7.1 虚拟按键(NavigationBar)源码分析 控件加载、属性控制隐藏
    Android5.1 Browser 闪退分析 /data/tombstones
    RootCommand
    RK3288 Linux4.4.143 适配EETI
    Android 7.1 Camera2 拍照镜像分析
    Docker pull slow resolution
    Dockerfile使用OracleJDK创建自定义tomcat8镜像
    centos使用docker安装ActiveMQ
  • 原文地址:https://www.cnblogs.com/fcw245838813/p/13879119.html
Copyright © 2020-2023  润新知