SlapOS Home SlapOS

    GrandeNet - The Internet on Steroids

    GrandeNet can be used to optimize connectivity between computers distributed around the world by creating a mesh network which can be even faster them the Internet itself.
    • Last Update:2019-01-08
    • Version:002
    • Language:en

    The Great Slowdown

    As many countries and ICP providers tend to optimize their "internal" data access by applying tools to control or monitor users, the overall network condition deteriorates and performance can be reduced to significant levels. This situation leads to considerable increases in the cost for companies who want to provide applications to end users. Our research has shown that the Internet speed - not only in China - varies more than expected on a global scale and quite often, the Internet does not use optimized routes leading to temporary or permanently slow access to some applications or for a group of users. GrandeNet can optimize up to 80% of the connectivity of certain servers by using Re6st and maintaining optimized and stable routes between all connected servers.

    Can you Re6st?

    Re6st is a multiprotocol random mesh generator that uses the Babel routing protocol to discover optimizal routes between each point in the mesh. It supports IPv6 and IPv4 with RINA support coming soon. It is commercially used by VIFIB our distributed cloud provider helping to solve the current lack of reliability of Internet connectivity for distributed enterprise applications due to bugs in routers, packet inspection breaking TCP protocol, government filters filtering too much, etc. Without re6st, it would have been impossible to deploy critical business applications used by large companies (Mitsubishi, SANEF, Aide et Action, etc.) on a decentralized cloud. It would also be impossible to manage the deployment of distributed cloud in Brazil, China or Ivory Coast where the Internet is even less reliable.

    IPython Notebook

    IPython Notebook is a web-based interactive computational environment for creating Executable Notebooks with Embeeded Python Code. IPython Notebook is largely used by researchers to produce and share their scientific work. We chose to use IPython Notebook for this article to provide a transparent walkthrough of what we are doing.

    This article is fully reproducible by importing this notebook on your IPython Notebook Instance.

    In order to execute the this notebook we need some well-known python libraries, specifically, panda, numpy, scipy and matplotlib. Below are the imports required to initialize the necessary libraries.

    In [1]:
    %pylab inline
    import sys
    from matplotlib import pyplot
    import matplotlib.pyplot as plt
    #from mpl_toolkits.basemap import Basemap
    from IPython.display import display, clear_output
    from IPython.core.display import HTML 
    
    import pandas as pd
    import numpy as np
    
    from pandas import rolling_median
    
    np.set_printoptions(threshold="nan")
    
    pd.set_option('display.max_rows', 2000)
    
    from pandas import Series, DataFrame, Panel
    
     
    Populating the interactive namespace from numpy and matplotlib

    Next, we'll define the core code - written as methods which will perform the Data Collection and the Calculation of the results for this article. If you are not interested in Code, you can move directly to the next section of this article.

    In [2]:
    import urllib2
    
    def load_json(url, average="internet_ipv4", packet_lost="internet_ipv4_packet_lost"):
      """ Download JSON and normalize the data by:
            - Replace failed by a number '0', so the column is a float and not string
            - Replace 'average' and packet_lost by another name 
                for help concat 2 numpy array w/o recreate it.
            - Remove latest empty line.
      """
      req = urllib2.Request(url)
      response = urllib2.urlopen(req)
      content = response.read()
      return '[%s]' % content\
        .replace('"failed"', "0")\
        .replace('"average"', '"%s"' % average)\
        .replace('"packet_lost"', '"%s"' % packet_lost)\
        .replace("\n", ",")[:-1]
    
    def load_test(id, date_id):
      """ Load Test results from Distributed Monitoring Tool
          and transform into DataFrames """
        
      # Load JSON for ICMPv6
      ping6_as_jsonstring = load_json(
        log_dict[id]["grandenet_ipv6"] % date_id, 
        average="grandenet_ipv6",  packet_lost="grandenet_ipv6_packet_lost")
    
      # Load JSON for ICMPv4  
      ping_as_jsonstring = load_json(
        log_dict[id]["internet_ipv4"] % date_id, 
        average="internet_ipv4", packet_lost="internet_ipv4_packet_lost")
    
      return pd.read_json(ping6_as_jsonstring, convert_dates=["time"]), \
        pd.read_json(ping_as_jsonstring, convert_dates=["time"])
    
    def get_computer_list(dframeA, dframeB ):
        """ Extract all computer names at the DataFrames """
        return list(set([ computer_name[0] for computer_name in dframeA[["computer_name"]].as_matrix()] + 
                      [ computer_name[0] for computer_name in dframeB[["computer_name"]].as_matrix()]))
    
    def get_computer_destination_label(dframeA):
        """ Determinate the Label Name for the computer which are receiving the ping"""
        return getComputerLabel([computer_name[0] for computer_name in dframeA[["name_or_ip"]].as_matrix()][0])
    
    def getComputerLabel(computer_name):
        """ Translate hostname, ip addresses into meaningfull names for better understanting"""
        return server_label.get(computer_name, computer_name)
    
    # Initiallization function which are going to be used for 
    # collect the logs and transform them on Data Frames.
    def plot_ping_comparation(df_ping6, df_ping):
      """ Function to load, plot and compare 2 Data Frames 
      """
      computer_list = get_computer_list(df_ping, df_ping6)
    
      computer_destination_label = get_computer_destination_label(df_ping6)
    
      measured_average = []
      packet_lost = []
        
      for computer_name in computer_list:
        
        if getComputerLabel(computer_name) == computer_destination_label:
          continue
    
        df6 = pd.DataFrame(df_ping6[df_ping6["computer_name"] == computer_name][df_ping6["grandenet_ipv6"] > 0][["time", "grandenet_ipv6"]])    
        df4 = pd.DataFrame(df_ping[df_ping["computer_name"] == computer_name][df_ping["internet_ipv4"] > 0][["time", "internet_ipv4"]])
    
        # Use Moving average in order to eliminate noise spikes on the chart and measurement.
        df6['grandenet_ipv6'] = rolling_median(df6['grandenet_ipv6'], window=3, center=True)
        df4['internet_ipv4'] = rolling_median(df4['internet_ipv4'], window=3, center=True)
        
        label = "'%s' to '%s'" % (getComputerLabel(computer_name), computer_destination_label)
    
        if 0 in [len(df6), len(df4)]:
          print "Found one empty array for %s" % label
          continue
        
        df = pd.DataFrame(pd.concat([df6, df4]))
    
        if SHOW_ALL_CHARTS:
          df4.plot(x="time", title=label + " (lower is better)", 
                   sort_columns=["time"], figsize=(20,6))
          df6.plot(x="time", title=label + " (lower is better)", 
                   sort_columns=["time"], color='r', figsize=(20,6))
        
        df.plot(x="time", title=label + " (lower is better)",
                marker='o', color=["b", "r"], figsize=(20,6))
        
        # Ignore 0 entries as it represents a full failure (so no average).
        ipv6_mean = df6["grandenet_ipv6"].mean()
        ipv4_mean = df4["internet_ipv4"].mean()
    
        grandenet_ipv6_packet_lost = df_ping6[df_ping6["computer_name"] == computer_name]["grandenet_ipv6_packet_lost"].mean()
        internet_ipv4_packet_lost = df_ping[df_ping["computer_name"] == computer_name]["internet_ipv4_packet_lost"].mean()
     
        if ipv6_mean < ipv4_mean:
          improvement_ratio = float(ipv4_mean - ipv6_mean)/ipv4_mean
          state = "OPTIMIZED in %sms (%.2f%%)" % ((ipv4_mean - ipv6_mean), improvement_ratio*100)
        elif ipv6_mean < (ipv4_mean + max(20, ipv4_mean*0.15)):
          state = "OK (in acceptable range %s < %s < %s)" % (ipv4_mean, ipv6_mean, (ipv4_mean + max(20, ipv4_mean*0.15)))
        else:
          state = "BAD (%sms slower)" % (ipv6_mean - ipv4_mean)
    
        measured_average.append({"name" : "'%s' to '%s'" % (getComputerLabel(computer_name), computer_destination_label),
                                 "grandenet_ipv6": ipv6_mean,
                                 "internet_ipv4": ipv4_mean,
                                 "state": state})
    
        
        if grandenet_ipv6_packet_lost < internet_ipv4_packet_lost:
          loss_state = "OPTIMIZED (Better Packet Lost rate)"
        elif grandenet_ipv6_packet_lost == internet_ipv4_packet_lost:
          loss_state = "OK (Same Packet Lost rate)"
        elif (grandenet_ipv6_packet_lost - internet_ipv4_packet_lost) < 1:
          loss_state = "OK (less them 1% diference is considered same)"
        else:
          loss_state = "BAD (Worst Packet Lost rate)"
    
        packet_lost.append({"name" : "'%s' to '%s'" % (getComputerLabel(computer_name), computer_destination_label),
                                 "grandenet_ipv6_packet_lost": grandenet_ipv6_packet_lost,
                                 "internet_ipv4_packet_lost": internet_ipv4_packet_lost,
                                 "state": loss_state})
    
      return pd.DataFrame(measured_average), pd.DataFrame(packet_lost)
    

    Measuring Performance with SlapOS Distributed Monitoring

    The core of GrandeNet Infrastructure is based on servers distributed on multiples cloud providers (Amazon, Qincloud, OVH, Rackspace, UCloud...) as well as standalone machines distributed on companies offices and/or people's home. Customers may add their servers located on their premises or even at their homes to be used as their main production servers.

    This hybrid and heterogenious infrastrucuture of GrandeNet uses SlapOS to manage and monitor all distributed servers around the globe.

    In this article we used a small set of servers (12) with public IPv4 running SlapOS Distributed Monitoring. Each server tries to contact (using ICMP Protocol) all other 12 servers using IPv4 and IPv6 addresses. Tests are performed 10 times (10 pings) every 10 minutes and we get the average and packet loss for testing and comparison.

    The image bellow ilustrates the tests with using just 3 servers:

    GrandeNet Connectivity Example

    Below we initialize the location for each servers' logs along with labels to improve the readability of the charts and results.

    In [3]:
    server_label = {
      'i-j0dshts2': "Guanghouz - Qincloud",
      '10-13-16-6': "Guanghouz - UCloud",
      'i-wbs0d67i' : "Hongkong - Qincloud 1",
      'i-vutfghrs': "Hongkong - Qincloud 0",
      'i-hf0f7ocn': "Beijing - Qincloud",
      'vps212661.ovh.net': "Strasbourg - OVH",
      'ip-172-31-30-97': "Singapour - Amazon",
      'ip-172-31-6-206': "Tokyo - Amazon",
      'ip-172-31-8-66' : "Virginia - Amazon",
      'ip-172-31-7-155': "US West - Amazon",
      'cloud-server-grandenet' : "Hongkong - Rackspace",
        
      'COMP-9': 'US West - Amazon',
      'COMP-8': 'Singapour - Amazon',
      'COMP-7': 'Tokyo - Amazon',
      'COMP-6': 'Hongkong - Qincloud 1',
      'COMP-4': 'Hongkong - Qincloud 0',
      'COMP-2': 'Beijing - Qincloud',
      'COMP-3': 'Guanghouz - Qincloud',
      'COMP-10': 'Guanghouz - UCloud',
      'COMP-11': 'Strasbourg - OVH',
      'COMP-12': 'Virginia - Amazon',
      "COMP-13": 'Beauharnois - OVH',
    
      "frontend0.grandenet.cn": "Beijing - Qincloud",
      "2401:5180::1": "Beijing - Qincloud",
      "frontend1.grandenet.cn": "Guanghouz - Qincloud",
      "2401:5180:0:6::1": "Guanghouz - Qincloud",
      "2401:5180:0:9::1" : "Hongkong - Qincloud 0",
      "frontend3.grandenet.cn" : "Hongkong - Qincloud 0",
      "2401:5180:0:8::1" : "Hongkong - Rackspace",
      "frontend4.grandenet.cn" : "Hongkong - Rackspace",
      "2401:5180:0:7::1": "Hongkong - Qincloud 1",
      "frontend5.grandenet.cn": "Hongkong - Qincloud 1",
      "2401:5180:0:c::1": "Tokyo - Amazon", 
      "frontend7.grandenet.cn": "Tokyo - Amazon",
      "2401:5180:0:d::1": "Singapour - Amazon",
      "frontend6.grandenet.cn": "Singapour - Amazon",
      "2401:5180:0:10::1": "US West - Amazon",
      "frontend8.grandenet.cn": "US West - Amazon",
      "2401:5180:0:13::1": "Guanghouz - UCloud",
      "frontend9.grandenet.cn": "Guanghouz - UCloud",
      "2401:5180:0:16::1": "Strasbourg - OVH",
      "frontend10.grandenet.cn": "Strasbourg - OVH",
      "2401:5180:0:15::1": "Virginia - Amazon",
      "frontend11.grandenet.cn": "Virginia - Amazon",
      "2401:5180:0:17::1": "Beauharnois - OVH",
      "frontend12.grandenet.cn": "Beauharnois - OVH",
    
    }
    
    
    log_dict = {
      "Hongkong - Qincloud 0": {
          "grandenet_ipv6": "https://softinst303.node.grandenet.cn/SOFTINST-314/ping6/log.%s.log",
          "internet_ipv4": "https://softinst303.node.grandenet.cn/SOFTINST-314/ping/log.%s.log",
          },
      "Virginia - Amazon": {
          "grandenet_ipv6": "https://softinst303.node.grandenet.cn/SOFTINST-322/ping6/log.%s.log",
          "internet_ipv4": "https://softinst303.node.grandenet.cn/SOFTINST-322/ping/log.%s.log",
          },
      "Strasbourg - OVH": {
          "grandenet_ipv6": "https://softinst303.node.grandenet.cn/SOFTINST-321/ping6/log.%s.log",
          "internet_ipv4": "https://softinst303.node.grandenet.cn/SOFTINST-321/ping/log.%s.log",
          },
      "Guanghouz - UCloud": {
          "grandenet_ipv6": "https://softinst303.node.grandenet.cn/SOFTINST-320/ping6/log.%s.log",
          "internet_ipv4": "https://softinst303.node.grandenet.cn/SOFTINST-320/ping/log.%s.log",
          },
      "Tokyo - Amazon": {
          "grandenet_ipv6": "https://softinst303.node.grandenet.cn/SOFTINST-317/ping6/log.%s.log",
          "internet_ipv4": "https://softinst303.node.grandenet.cn/SOFTINST-317/ping/log.%s.log",
          },
      "US West - Amazon": {
          "grandenet_ipv6": "https://softinst303.node.grandenet.cn/SOFTINST-319/ping6/log.%s.log",
          "internet_ipv4": "https://softinst303.node.grandenet.cn/SOFTINST-319/ping/log.%s.log",
          },
      "Singapour - Amazon": {
          "grandenet_ipv6": "https://softinst303.node.grandenet.cn/SOFTINST-318/ping6/log.%s.log",
          "internet_ipv4": "https://softinst303.node.grandenet.cn/SOFTINST-318/ping/log.%s.log",
          },
      "Hongkong - Qincloud 1": {
          "grandenet_ipv6": "https://softinst303.node.grandenet.cn/SOFTINST-316/ping6/log.%s.log",
          "internet_ipv4": "https://softinst303.node.grandenet.cn/SOFTINST-316/ping/log.%s.log",
          },
      "Guanghouz - Qincloud": {
          "grandenet_ipv6": "https://softinst303.node.grandenet.cn/SOFTINST-313/ping6/log.%s.log",
          "internet_ipv4": "https://softinst303.node.grandenet.cn/SOFTINST-313/ping/log.%s.log",
          },
      "Beijing - Qincloud": {
          "grandenet_ipv6": "https://softinst303.node.grandenet.cn/SOFTINST-312/ping6/log.%s.log",
          "internet_ipv4": "https://softinst303.node.grandenet.cn/SOFTINST-312/ping/log.%s.log",
          },
      "Hongkong - Rackspace": {
          "grandenet_ipv6": "https://softinst303.node.grandenet.cn/SOFTINST-315/ping6/log.%s.log",
          "internet_ipv4": "https://softinst303.node.grandenet.cn/SOFTINST-315/ping/log.%s.log",
          },
      "Beauharnois - OVH": {
          "grandenet_ipv6": "https://softinst303.node.grandenet.cn/SOFTINST-625/ping6/log.%s.log",
          "internet_ipv4": "https://softinst303.node.grandenet.cn/SOFTINST-625/ping/log.%s.log",
          }
    }
    

    We also limit the scope of this article to the tests performed on a certain date range, shown below by the variable "DAY".

    In [4]:
    # Define here if you want more or less charts verbosity. Show all charts can
    # make this report quite big.
    SHOW_ALL_CHARTS = False
    
    # Generate Report for the Jan, 28, 2016
    DAY = "20160128"
    

    Collecting Data from Distributed SlapOS Monitoring

    In order to produce results for this article, we use the methods defined above, crawl the logs and turn them into dataframes. These dataframes contain the test results for the indicated period (DAY above).

    In [5]:
    hq0_df_ping6, hq0_df_ping = load_test(id = "Hongkong - Qincloud 0", date_id=DAY)
    
    In [6]:
    va_df_ping6, va_df_ping = load_test(id = "Virginia - Amazon", date_id=DAY)
    
    In [7]:
    gu_df_ping6, gu_df_ping = load_test(id =  "Guanghouz - UCloud", date_id=DAY)
    
    In [8]:
    sa_df_ping6, sa_df_ping = load_test(id = "Singapour - Amazon", date_id=DAY)
    
    In [9]:
    hq1_df_ping6, hq1_df_ping = load_test(id = "Hongkong - Qincloud 1", date_id=DAY)
    
    In [10]:
    hr_df_ping6, hr_df_ping = load_test(id = "Hongkong - Rackspace", date_id=DAY)
    
    In [11]:
    wa_df_ping6, wa_df_ping = load_test(id = "US West - Amazon", date_id=DAY)
    
    In [12]:
    go_df_ping6, go_df_ping = load_test(id = "Strasbourg - OVH", date_id=DAY)
    
    In [13]:
    ta_df_ping6, ta_df_ping = load_test(id = "Tokyo - Amazon", date_id=DAY)
    
    In [14]:
    gq_df_ping6, gq_df_ping = load_test(id = "Guanghouz - Qincloud", date_id=DAY)
    
    In [15]:
    bq_df_ping6, bq_df_ping = load_test(id = "Beijing - Qincloud", date_id=DAY)
    
    In [16]:
    bho_df_ping6, bho_df_ping = load_test(id = "Beauharnois - OVH", date_id=DAY)
    

    Internet IPv4 vs Grandenet IPv6

    Using the dataframes we can visualize a comparison of the response time (in milliseconds) between using Internet IPv4 (red) vs Grandenet IPv6 (blue). As we are using the ICMP Protocol to measure the response time, the charts below use the name "ping" for IPv4 and ping6 for IPv6 and highlight the differences between the Internet IPv4 and the IPv6. The smaller the response time, the lower the plotted line, the better.

    In [17]:
    hq0_average_dataframe, hq0_packetloss_dataframe = plot_ping_comparation(hq0_df_ping6, hq0_df_ping)
    
     
    /srv/slapgrid/slappart8/srv/runner/software/9a8d67b31671ba36ac107c65a141c073/develop-eggs/pandas-0.16.2-py2.7-linux-x86_64.egg/pandas/core/frame.py:1825: UserWarning: Boolean Series key will be reindexed to match DataFrame index.
      "DataFrame index.", UserWarning)
    
     
     
     
     
     
     
     
     
     
     
     
    In [18]:
    va_average_dataframe, va_packetloss_dataframe = plot_ping_comparation(va_df_ping6, va_df_ping)
    
     
     
     
     
     
     
     
     
     
     
     
    In [19]:
    go_average_dataframe, go_packetloss_dataframe = plot_ping_comparation(go_df_ping6, go_df_ping)
    
     
     
     
     
     
     
     
     
     
     
     
    In [20]:
    gu_average_dataframe, gu_packetloss_dataframe = plot_ping_comparation(gu_df_ping6, gu_df_ping)
    
     
     
     
     
     
     
     
     
     
     
     
    In [21]:
    ta_average_dataframe, ta_packetloss_dataframe = plot_ping_comparation(ta_df_ping6, ta_df_ping)
    
     
     
     
     
     
     
     
     
     
     
     
    In [22]:
    sa_average_dataframe, sa_packetloss_dataframe = plot_ping_comparation(sa_df_ping6, sa_df_ping)
    
     
     
     
     
     
     
     
     
     
     
     
    In [23]:
    hq1_average_dataframe, hq1_packetloss_dataframe = plot_ping_comparation(hq1_df_ping6, hq1_df_ping)
    
     
     
     
     
     
     
     
     
     
     
     
    In [24]:
    gq_average_dataframe, gq_packetloss_dataframe = plot_ping_comparation(gq_df_ping6, gq_df_ping)
    
     
     
     
     
     
     
     
     
     
     
     
    In [25]:
    bq_average_dataframe, bq_packetloss_dataframe = plot_ping_comparation(bq_df_ping6, bq_df_ping)
    
     
     
     
     
     
     
     
     
     
     
     
    In [26]:
    wa_average_dataframe, wa_packetloss_dataframe = plot_ping_comparation(wa_df_ping6, wa_df_ping)
    
     
     
     
     
     
     
     
     
     
     
     
    In [27]:
    hr_average_dataframe, hr_packetloss_dataframe = plot_ping_comparation(hr_df_ping6, hr_df_ping)
    
     
     
     
     
     
     
     
     
     
     
     
    In [28]:
    bho_average_dataframe, bho_packetloss_dataframe = plot_ping_comparation(bho_df_ping6, bho_df_ping)
    
     
     
     
     
     
     
     
     
     
     
     

    Comparison of Average Ping Response for IPv4 and IPv6 Address

    It is well-know that latency has a direct influence on performance of Web Applications. By comparing the averages of ping responses on IPv4 and IPv6, you may notice significant improvements between the servers.

    By using Grandenet, we can consider 3 states for a connection between 2 servers:

    • Connection is OPTIMIZED when IPv6 is faster than IPv4 by more than 15% or 20ms
    • Connection is BAD when IPv4 is faster than IPv6 by more than 15% or 20 ms.
    • Connection is OK when IPv4 is faster than IPv6 by less than 15% or 20 ms

    These states acknowledge the fact that re6st may increase a ping response by 20ms in the worst case, which is 2 servers being really far apart having a direct connection.

    An optimal scenario is to get all servers on OPTIMIZED or OK states while testing each other. The table below contains a list of all connection between servers previously mentioned. You can notice that not only connections involving a Chinese Server got optimized, but connection between Japan to Singapore, Japan to Hongkong, US to Hongkong and others were optimized as well.

    In [29]:
    df_average_statistic = pd.concat([go_average_dataframe, hr_average_dataframe, 
                                      bho_average_dataframe,bq_average_dataframe, 
                                      gq_average_dataframe, va_average_dataframe, 
                                      hq0_average_dataframe, gu_average_dataframe,  
                                      ta_average_dataframe, sa_average_dataframe, 
                                      hq1_average_dataframe, wa_average_dataframe],
                                     ignore_index=True)
    
    df_average_statistic
    
    Out[29]:
      grandenet_ipv6 internet_ipv4 name state
    0 230.769642 227.776942 'Beijing - Qincloud' to 'Strasbourg - OVH' OK (in acceptable range 227.776942149 < 230.76...
    1 207.231196 199.779662 'Singapour - Amazon' to 'Strasbourg - OVH' OK (in acceptable range 199.779661871 < 207.23...
    2 234.477413 343.148734 'Hongkong - Qincloud 1' to 'Strasbourg - OVH' OPTIMIZED in 108.671320769ms (31.67%)
    3 235.069314 344.405986 'Hongkong - Qincloud 0' to 'Strasbourg - OVH' OPTIMIZED in 109.336671743ms (31.75%)
    4 159.144745 160.710180 'US West - Amazon' to 'Strasbourg - OVH' OPTIMIZED in 1.56543533057ms (0.97%)
    5 121.403561 121.298650 'Virginia - Amazon' to 'Strasbourg - OVH' OK (in acceptable range 121.29865 < 121.403561...
    6 246.411341 356.375993 'Guanghouz - Qincloud' to 'Strasbourg - OVH' OPTIMIZED in 109.964652226ms (30.86%)
    7 90.044151 90.002443 'Beauharnois - OVH' to 'Strasbourg - OVH' OK (in acceptable range 90.0024428571 < 90.044...
    8 254.088217 372.031417 'Guanghouz - UCloud' to 'Strasbourg - OVH' OPTIMIZED in 117.943199875ms (31.70%)
    9 247.874190 325.955576 'Hongkong - Rackspace' to 'Strasbourg - OVH' OPTIMIZED in 78.0813857585ms (23.95%)
    10 266.606167 278.157007 'Tokyo - Amazon' to 'Strasbourg - OVH' OPTIMIZED in 11.5508405276ms (4.15%)
    11 243.557295 325.525186 'Strasbourg - OVH' to 'Hongkong - Rackspace' OPTIMIZED in 81.9678907503ms (25.18%)
    12 41.762925 39.811375 'Beijing - Qincloud' to 'Hongkong - Rackspace' OK (in acceptable range 39.811375 < 41.762925 ...
    13 38.099014 34.921950 'Singapour - Amazon' to 'Hongkong - Rackspace' OK (in acceptable range 34.9219496403 < 38.099...
    14 2.153391 1.995842 'Hongkong - Qincloud 1' to 'Hongkong - Rackspace' OK (in acceptable range 1.99584172662 < 2.1533...
    15 2.160094 1.965309 'Hongkong - Qincloud 0' to 'Hongkong - Rackspace' OK (in acceptable range 1.96530935252 < 2.1600...
    16 164.382985 157.351396 'US West - Amazon' to 'Hongkong - Rackspace' OK (in acceptable range 157.351395683 < 164.38...
    17 211.392151 229.954993 'Virginia - Amazon' to 'Hongkong - Rackspace' OPTIMIZED in 18.562841778ms (8.07%)
    18 8.568826 8.248223 'Guanghouz - Qincloud' to 'Hongkong - Rackspace' OK (in acceptable range 8.24822302158 < 8.5688...
    19 229.472014 428.977350 'Beauharnois - OVH' to 'Hongkong - Rackspace' OPTIMIZED in 199.505335612ms (46.51%)
    20 12.660536 7.320137 'Guanghouz - UCloud' to 'Hongkong - Rackspace' OK (in acceptable range 7.32013669065 < 12.660...
    21 56.437174 71.705446 'Tokyo - Amazon' to 'Hongkong - Rackspace' OPTIMIZED in 15.2682721301ms (21.29%)
    22 90.059710 89.985175 'Strasbourg - OVH' to 'Beauharnois - OVH' OK (in acceptable range 89.9851751825 < 90.059...
    23 254.805042 288.993650 'Beijing - Qincloud' to 'Beauharnois - OVH' OPTIMIZED in 34.1886079832ms (11.83%)
    24 247.255138 269.330863 'Singapour - Amazon' to 'Beauharnois - OVH' OPTIMIZED in 22.0757256282ms (8.20%)
    25 224.304181 251.024281 'Hongkong - Qincloud 1' to 'Beauharnois - OVH' OPTIMIZED in 26.7200994161ms (10.64%)
    26 226.983348 284.750353 'Hongkong - Qincloud 0' to 'Beauharnois - OVH' OPTIMIZED in 57.7670046919ms (20.29%)
    27 70.884467 70.894246 'US West - Amazon' to 'Beauharnois - OVH' OPTIMIZED in 0.00977922352695ms (0.01%)
    28 43.673137 42.949250 'Virginia - Amazon' to 'Beauharnois - OVH' OK (in acceptable range 42.94925 < 43.67313669...
    29 232.296942 329.106576 'Guanghouz - Qincloud' to 'Beauharnois - OVH' OPTIMIZED in 96.8096335106ms (29.42%)
    30 237.192766 385.034875 'Guanghouz - UCloud' to 'Beauharnois - OVH' OPTIMIZED in 147.842108577ms (38.40%)
    31 228.411906 423.219410 'Hongkong - Rackspace' to 'Beauharnois - OVH' OPTIMIZED in 194.807504275ms (46.03%)
    32 177.716043 184.348388 'Tokyo - Amazon' to 'Beauharnois - OVH' OPTIMIZED in 6.63234501095ms (3.60%)
    33 240.231168 235.254507 'Strasbourg - OVH' to 'Beijing - Qincloud' OK (in acceptable range 235.254507143 < 240.23...
    34 76.299868 70.598232 'Singapour - Amazon' to 'Beijing - Qincloud' OK (in acceptable range 70.5982318841 < 76.299...
    35 39.032730 41.159784 'Hongkong - Qincloud 1' to 'Beijing - Qincloud' OPTIMIZED in 2.12705424565ms (5.17%)
    36 44.635572 43.729914 'Hongkong - Qincloud 0' to 'Beijing - Qincloud' OK (in acceptable range 43.7299136691 < 44.635...
    37 191.950588 172.012237 'US West - Amazon' to 'Beijing - Qincloud' OK (in acceptable range 172.012237037 < 191.95...
    38 239.912219 236.548706 'Virginia - Amazon' to 'Beijing - Qincloud' OK (in acceptable range 236.548705882 < 239.91...
    39 46.273000 47.747281 'Guanghouz - Qincloud' to 'Beijing - Qincloud' OPTIMIZED in 1.47428057554ms (3.09%)
    40 261.261261 301.428700 'Beauharnois - OVH' to 'Beijing - Qincloud' OPTIMIZED in 40.1674391304ms (13.33%)
    41 43.210993 52.811683 'Guanghouz - UCloud' to 'Beijing - Qincloud' OPTIMIZED in 9.60069069961ms (18.18%)
    42 42.063942 41.977022 'Hongkong - Rackspace' to 'Beijing - Qincloud' OK (in acceptable range 41.9770215827 < 42.063...
    43 96.826109 135.557187 'Tokyo - Amazon' to 'Beijing - Qincloud' OPTIMIZED in 38.7310783547ms (28.57%)
    44 253.286304 348.142114 'Strasbourg - OVH' to 'Guanghouz - Qincloud' OPTIMIZED in 94.8558099379ms (27.25%)
    45 45.542403 47.665650 'Beijing - Qincloud' to 'Guanghouz - Qincloud' OPTIMIZED in 2.12324663866ms (4.45%)
    46 46.796123 193.877259 'Singapour - Amazon' to 'Guanghouz - Qincloud' OPTIMIZED in 147.081135804ms (75.86%)
    47 11.600123 28.864662 'Hongkong - Qincloud 1' to 'Guanghouz - Qincloud' OPTIMIZED in 17.2645386821ms (59.81%)
    48 14.198486 37.674871 'Hongkong - Qincloud 0' to 'Guanghouz - Qincloud' OPTIMIZED in 23.4763849964ms (62.31%)
    49 173.533544 292.845978 'US West - Amazon' to 'Guanghouz - Qincloud' OPTIMIZED in 119.3124343ms (40.74%)
    50 220.941986 294.773657 'Virginia - Amazon' to 'Guanghouz - Qincloud' OPTIMIZED in 73.8316716356ms (25.05%)
    51 236.891568 361.344309 'Beauharnois - OVH' to 'Guanghouz - Qincloud' OPTIMIZED in 124.452741007ms (34.44%)
    52 5.721768 5.410108 'Guanghouz - UCloud' to 'Guanghouz - Qincloud' OK (in acceptable range 5.41010791367 < 5.7217...
    53 8.664124 8.320640 'Hongkong - Rackspace' to 'Guanghouz - Qincloud' OK (in acceptable range 8.32064028777 < 8.6641...
    54 70.081956 131.256727 'Tokyo - Amazon' to 'Guanghouz - Qincloud' OPTIMIZED in 61.1747704143ms (46.61%)
    55 121.487640 121.247236 'Strasbourg - OVH' to 'Virginia - Amazon' OK (in acceptable range 121.247235714 < 121.48...
    56 240.120950 230.511413 'Beijing - Qincloud' to 'Virginia - Amazon' OK (in acceptable range 230.511413223 < 240.12...
    57 222.681261 223.468777 'Singapour - Amazon' to 'Virginia - Amazon' OPTIMIZED in 0.787516108852ms (0.35%)
    58 209.687812 210.714964 'Hongkong - Qincloud 1' to 'Virginia - Amazon' OPTIMIZED in 1.02715243457ms (0.49%)
    59 206.991920 218.024158 'Hongkong - Qincloud 0' to 'Virginia - Amazon' OPTIMIZED in 11.0322379835ms (5.06%)
    60 76.374496 84.404000 'US West - Amazon' to 'Virginia - Amazon' OPTIMIZED in 8.02950364964ms (9.51%)
    61 220.761130 238.426374 'Guanghouz - Qincloud' to 'Virginia - Amazon' OPTIMIZED in 17.6652436659ms (7.41%)
    62 43.641381 42.894914 'Beauharnois - OVH' to 'Virginia - Amazon' OK (in acceptable range 42.8949142857 < 43.641...
    63 225.314246 389.168935 'Guanghouz - UCloud' to 'Virginia - Amazon' OPTIMIZED in 163.854688875ms (42.10%)
    64 211.599536 229.980266 'Hongkong - Rackspace' to 'Virginia - Amazon' OPTIMIZED in 18.3807299552ms (7.99%)
    65 152.523601 152.000986 'Tokyo - Amazon' to 'Virginia - Amazon' OK (in acceptable range 152.000985612 < 152.52...
    66 239.363849 347.087293 'Strasbourg - OVH' to 'Hongkong - Qincloud 0' OPTIMIZED in 107.723443936ms (31.04%)
    67 45.002513 41.264050 'Beijing - Qincloud' to 'Hongkong - Qincloud 0' OK (in acceptable range 41.26405 < 45.00251260...
    68 36.321246 35.532187 'Singapour - Amazon' to 'Hongkong - Qincloud 0' OK (in acceptable range 35.5321870504 < 36.321...
    69 0.837732 0.606295 'Hongkong - Qincloud 1' to 'Hongkong - Qinclou... OK (in acceptable range 0.606294964029 < 0.837...
    70 160.017212 169.572899 'US West - Amazon' to 'Hongkong - Qincloud 0' OPTIMIZED in 9.55568760174ms (5.64%)
    71 207.156094 218.038657 'Virginia - Amazon' to 'Hongkong - Qincloud 0' OPTIMIZED in 10.8825636177ms (4.99%)
    72 14.436101 36.616367 'Guanghouz - Qincloud' to 'Hongkong - Qincloud 0' OPTIMIZED in 22.1802654572ms (60.57%)
    73 229.083065 283.335871 'Beauharnois - OVH' to 'Hongkong - Qincloud 0' OPTIMIZED in 54.2528066804ms (19.15%)
    74 19.104543 63.614424 'Guanghouz - UCloud' to 'Hongkong - Qincloud 0' OPTIMIZED in 44.5098809822ms (69.97%)
    75 2.138971 1.951871 'Hongkong - Rackspace' to 'Hongkong - Qincloud 0' OK (in acceptable range 1.9518705036 < 2.13897...
    76 53.963688 51.621165 'Tokyo - Amazon' to 'Hongkong - Qincloud 0' OK (in acceptable range 51.6211654676 < 53.963...
    77 255.833453 365.678857 'Strasbourg - OVH' to 'Guanghouz - UCloud' OPTIMIZED in 109.845403905ms (30.04%)
    78 43.109625 52.778208 'Beijing - Qincloud' to 'Guanghouz - UCloud' OPTIMIZED in 9.66858333333ms (18.32%)
    79 52.838234 227.743525 'Singapour - Amazon' to 'Guanghouz - UCloud' OPTIMIZED in 174.905291603ms (76.80%)
    80 15.742594 69.543173 'Hongkong - Qincloud 1' to 'Guanghouz - UCloud' OPTIMIZED in 53.800578459ms (77.36%)
    81 20.123913 66.334302 'Hongkong - Qincloud 0' to 'Guanghouz - UCloud' OPTIMIZED in 46.2103891148ms (69.66%)
    82 178.273566 342.378604 'US West - Amazon' to 'Guanghouz - UCloud' OPTIMIZED in 164.10503814ms (47.93%)
    83 225.984885 382.897636 'Virginia - Amazon' to 'Guanghouz - UCloud' OPTIMIZED in 156.912750822ms (40.98%)
    84 5.724739 5.426122 'Guanghouz - Qincloud' to 'Guanghouz - UCloud' OK (in acceptable range 5.42612230216 < 5.7247...
    85 242.619297 421.211616 'Beauharnois - OVH' to 'Guanghouz - UCloud' OPTIMIZED in 178.592318841ms (42.40%)
    86 14.407255 7.411892 'Hongkong - Rackspace' to 'Guanghouz - UCloud' OK (in acceptable range 7.41189208633 < 14.407...
    87 71.360387 121.463964 'Tokyo - Amazon' to 'Guanghouz - UCloud' OPTIMIZED in 50.1035771675ms (41.25%)
    88 266.439424 278.120979 'Strasbourg - OVH' to 'Tokyo - Amazon' OPTIMIZED in 11.681554111ms (4.20%)
    89 95.726546 130.562108 'Beijing - Qincloud' to 'Tokyo - Amazon' OPTIMIZED in 34.8355621148ms (26.68%)
    90 74.860529 74.136101 'Singapour - Amazon' to 'Tokyo - Amazon' OK (in acceptable range 74.1361007194 < 74.860...
    91 57.655964 57.372640 'Hongkong - Qincloud 1' to 'Tokyo - Amazon' OK (in acceptable range 57.3726402878 < 57.655...
    92 54.828377 51.194863 'Hongkong - Qincloud 0' to 'Tokyo - Amazon' OK (in acceptable range 51.1948633094 < 54.828...
    93 108.687358 105.628540 'US West - Amazon' to 'Tokyo - Amazon' OK (in acceptable range 105.628539568 < 108.68...
    94 152.578827 152.403857 'Virginia - Amazon' to 'Tokyo - Amazon' OK (in acceptable range 152.403857143 < 152.57...
    95 70.801558 147.181209 'Guanghouz - Qincloud' to 'Tokyo - Amazon' OPTIMIZED in 76.3796506621ms (51.89%)
    96 178.120978 184.354986 'Beauharnois - OVH' to 'Tokyo - Amazon' OPTIMIZED in 6.23400729702ms (3.38%)
    97 74.521449 139.606777 'Guanghouz - UCloud' to 'Tokyo - Amazon' OPTIMIZED in 65.0853277031ms (46.62%)
    98 55.151833 73.062180 'Hongkong - Rackspace' to 'Tokyo - Amazon' OPTIMIZED in 17.9103465228ms (24.51%)
    99 205.582540 199.781236 'Strasbourg - OVH' to 'Singapour - Amazon' OK (in acceptable range 199.781235714 < 205.58...
    100 76.846342 70.112595 'Beijing - Qincloud' to 'Singapour - Amazon' OK (in acceptable range 70.1125950413 < 76.846...
    101 36.377196 35.139094 'Hongkong - Qincloud 1' to 'Singapour - Amazon' OK (in acceptable range 35.1390935252 < 36.377...
    102 36.252500 35.560604 'Hongkong - Qincloud 0' to 'Singapour - Amazon' OK (in acceptable range 35.5606043165 < 36.252...
    103 176.300474 175.301252 'US West - Amazon' to 'Singapour - Amazon' OK (in acceptable range 175.301251799 < 176.30...
    104 222.421165 223.566721 'Virginia - Amazon' to 'Singapour - Amazon' OPTIMIZED in 1.14555596095ms (0.51%)
    105 45.856601 184.241842 'Guanghouz - Qincloud' to 'Singapour - Amazon' OPTIMIZED in 138.385240277ms (75.11%)
    106 247.191863 269.351136 'Beauharnois - OVH' to 'Singapour - Amazon' OPTIMIZED in 22.1592724049ms (8.23%)
    107 50.988957 215.262813 'Guanghouz - UCloud' to 'Singapour - Amazon' OPTIMIZED in 164.273856428ms (76.31%)
    108 38.258377 34.939712 'Hongkong - Rackspace' to 'Singapour - Amazon' OK (in acceptable range 34.9397122302 < 38.258...
    109 74.865471 74.137086 'Tokyo - Amazon' to 'Singapour - Amazon' OK (in acceptable range 74.1370863309 < 74.865...
    110 238.208804 345.964200 'Strasbourg - OVH' to 'Hongkong - Qincloud 1' OPTIMIZED in 107.755395652ms (31.15%)
    111 38.542218 38.900467 'Beijing - Qincloud' to 'Hongkong - Qincloud 1' OPTIMIZED in 0.358248179272ms (0.92%)
    112 36.307116 35.202827 'Singapour - Amazon' to 'Hongkong - Qincloud 1' OK (in acceptable range 35.2028273381 < 36.307...
    113 1.923449 0.613331 'Hongkong - Qincloud 0' to 'Hongkong - Qinclou... OK (in acceptable range 0.613330935252 < 1.923...
    114 158.409131 163.004000 'US West - Amazon' to 'Hongkong - Qincloud 1' OPTIMIZED in 4.59486861314ms (2.82%)
    115 209.810568 210.780729 'Virginia - Amazon' to 'Hongkong - Qincloud 1' OPTIMIZED in 0.970160226105ms (0.46%)
    116 13.477819 30.705424 'Guanghouz - Qincloud' to 'Hongkong - Qincloud 1' OPTIMIZED in 17.2276056199ms (56.11%)
    117 229.279568 254.174107 'Beauharnois - OVH' to 'Hongkong - Qincloud 1' OPTIMIZED in 24.8945387975ms (9.79%)
    118 17.851478 72.304719 'Guanghouz - UCloud' to 'Hongkong - Qincloud 1' OPTIMIZED in 54.4532411636ms (75.31%)
    119 2.133971 1.995446 'Hongkong - Rackspace' to 'Hongkong - Qincloud 1' OK (in acceptable range 1.99544604317 < 2.1339...
    120 57.729732 57.445885 'Tokyo - Amazon' to 'Hongkong - Qincloud 1' OK (in acceptable range 57.4458848921 < 57.729...
    121 160.735741 160.635750 'Strasbourg - OVH' to 'US West - Amazon' OK (in acceptable range 160.63575 < 160.735741...
    122 187.261408 169.855325 'Beijing - Qincloud' to 'US West - Amazon' OK (in acceptable range 169.855325 < 187.26140...
    123 176.315312 175.277662 'Singapour - Amazon' to 'US West - Amazon' OK (in acceptable range 175.277661871 < 176.31...
    124 156.863964 162.888799 'Hongkong - Qincloud 1' to 'US West - Amazon' OPTIMIZED in 6.02483479304ms (3.70%)
    125 160.903761 169.578547 'Hongkong - Qincloud 0' to 'US West - Amazon' OPTIMIZED in 8.67478589302ms (5.12%)
    126 76.815309 83.863021 'Virginia - Amazon' to 'US West - Amazon' OPTIMIZED in 7.04771207605ms (8.40%)
    127 172.103768 284.596410 'Guanghouz - Qincloud' to 'US West - Amazon' OPTIMIZED in 112.492641956ms (39.53%)
    128 70.823345 70.792993 'Beauharnois - OVH' to 'US West - Amazon' OK (in acceptable range 70.7929928571 < 70.823...
    129 174.915174 359.936719 'Guanghouz - UCloud' to 'US West - Amazon' OPTIMIZED in 185.021545511ms (51.40%)
    130 163.996109 157.283007 'Hongkong - Rackspace' to 'US West - Amazon' OK (in acceptable range 157.283007194 < 163.99...
    131 108.594942 105.582734 'Tokyo - Amazon' to 'US West - Amazon' OK (in acceptable range 105.582733813 < 108.59...
    In [30]:
    df_packetlost_statistic = pd.concat([go_packetloss_dataframe, hr_packetloss_dataframe, 
                                         bho_packetloss_dataframe, bq_packetloss_dataframe,
                                         gq_packetloss_dataframe, va_packetloss_dataframe, 
                                         hq0_packetloss_dataframe, gu_packetloss_dataframe,
                                         ta_packetloss_dataframe, sa_packetloss_dataframe,
                                         hq1_packetloss_dataframe, wa_packetloss_dataframe
                                        ], ignore_index=True)
    
    df_packetlost_statistic
    
    Out[30]:
      grandenet_ipv6_packet_lost internet_ipv4_packet_lost name state
    0 1.147541 2.601626 'Beijing - Qincloud' to 'Strasbourg - OVH' OPTIMIZED (Better Packet Lost rate)
    1 0.000000 0.851064 'Singapour - Amazon' to 'Strasbourg - OVH' OPTIMIZED (Better Packet Lost rate)
    2 0.071429 0.127660 'Hongkong - Qincloud 1' to 'Strasbourg - OVH' OPTIMIZED (Better Packet Lost rate)
    3 0.785714 0.212766 'Hongkong - Qincloud 0' to 'Strasbourg - OVH' OK (less them 1% diference is considered same)
    4 0.215827 0.070922 'US West - Amazon' to 'Strasbourg - OVH' OK (less them 1% diference is considered same)
    5 0.000000 0.000000 'Virginia - Amazon' to 'Strasbourg - OVH' OK (Same Packet Lost rate)
    6 0.214286 18.652482 'Guanghouz - Qincloud' to 'Strasbourg - OVH' OPTIMIZED (Better Packet Lost rate)
    7 0.070922 0.281690 'Beauharnois - OVH' to 'Strasbourg - OVH' OPTIMIZED (Better Packet Lost rate)
    8 0.785714 26.659574 'Guanghouz - UCloud' to 'Strasbourg - OVH' OPTIMIZED (Better Packet Lost rate)
    9 1.357143 1.631206 'Hongkong - Rackspace' to 'Strasbourg - OVH' OPTIMIZED (Better Packet Lost rate)
    10 0.071429 0.283688 'Tokyo - Amazon' to 'Strasbourg - OVH' OPTIMIZED (Better Packet Lost rate)
    11 0.141844 1.549296 'Strasbourg - OVH' to 'Hongkong - Rackspace' OPTIMIZED (Better Packet Lost rate)
    12 0.163934 0.327869 'Beijing - Qincloud' to 'Hongkong - Rackspace' OPTIMIZED (Better Packet Lost rate)
    13 0.000000 0.780142 'Singapour - Amazon' to 'Hongkong - Rackspace' OPTIMIZED (Better Packet Lost rate)
    14 0.000000 0.000000 'Hongkong - Qincloud 1' to 'Hongkong - Rackspace' OK (Same Packet Lost rate)
    15 0.000000 0.000000 'Hongkong - Qincloud 0' to 'Hongkong - Rackspace' OK (Same Packet Lost rate)
    16 2.517986 0.851064 'US West - Amazon' to 'Hongkong - Rackspace' BAD (Worst Packet Lost rate)
    17 1.276596 0.000000 'Virginia - Amazon' to 'Hongkong - Rackspace' BAD (Worst Packet Lost rate)
    18 0.000000 0.141844 'Guanghouz - Qincloud' to 'Hongkong - Rackspace' OPTIMIZED (Better Packet Lost rate)
    19 1.134752 1.760563 'Beauharnois - OVH' to 'Hongkong - Rackspace' OPTIMIZED (Better Packet Lost rate)
    20 0.071429 1.063830 'Guanghouz - UCloud' to 'Hongkong - Rackspace' OPTIMIZED (Better Packet Lost rate)
    21 0.000000 2.198582 'Tokyo - Amazon' to 'Hongkong - Rackspace' OPTIMIZED (Better Packet Lost rate)
    22 0.780142 0.049296 'Strasbourg - OVH' to 'Beauharnois - OVH' OK (less them 1% diference is considered same)
    23 1.074380 0.573770 'Beijing - Qincloud' to 'Beauharnois - OVH' OK (less them 1% diference is considered same)
    24 0.000000 0.212766 'Singapour - Amazon' to 'Beauharnois - OVH' OPTIMIZED (Better Packet Lost rate)
    25 0.000000 0.141844 'Hongkong - Qincloud 1' to 'Beauharnois - OVH' OPTIMIZED (Better Packet Lost rate)
    26 0.000000 0.000000 'Hongkong - Qincloud 0' to 'Beauharnois - OVH' OK (Same Packet Lost rate)
    27 0.143885 0.000000 'US West - Amazon' to 'Beauharnois - OVH' OK (less them 1% diference is considered same)
    28 0.000000 0.000000 'Virginia - Amazon' to 'Beauharnois - OVH' OK (Same Packet Lost rate)
    29 0.214286 10.092199 'Guanghouz - Qincloud' to 'Beauharnois - OVH' OPTIMIZED (Better Packet Lost rate)
    30 1.071429 18.078014 'Guanghouz - UCloud' to 'Beauharnois - OVH' OPTIMIZED (Better Packet Lost rate)
    31 0.857143 1.638298 'Hongkong - Rackspace' to 'Beauharnois - OVH' OPTIMIZED (Better Packet Lost rate)
    32 0.000000 0.141844 'Tokyo - Amazon' to 'Beauharnois - OVH' OPTIMIZED (Better Packet Lost rate)
    33 3.475177 3.450704 'Strasbourg - OVH' to 'Beijing - Qincloud' OK (less them 1% diference is considered same)
    34 1.928571 3.049645 'Singapour - Amazon' to 'Beijing - Qincloud' OPTIMIZED (Better Packet Lost rate)
    35 1.857143 2.127660 'Hongkong - Qincloud 1' to 'Beijing - Qincloud' OPTIMIZED (Better Packet Lost rate)
    36 0.857143 1.560284 'Hongkong - Qincloud 0' to 'Beijing - Qincloud' OPTIMIZED (Better Packet Lost rate)
    37 1.438849 3.404255 'US West - Amazon' to 'Beijing - Qincloud' OPTIMIZED (Better Packet Lost rate)
    38 3.120567 6.478873 'Virginia - Amazon' to 'Beijing - Qincloud' OPTIMIZED (Better Packet Lost rate)
    39 0.000000 0.425532 'Guanghouz - Qincloud' to 'Beijing - Qincloud' OPTIMIZED (Better Packet Lost rate)
    40 1.985816 3.197183 'Beauharnois - OVH' to 'Beijing - Qincloud' OPTIMIZED (Better Packet Lost rate)
    41 0.000000 0.212766 'Guanghouz - UCloud' to 'Beijing - Qincloud' OPTIMIZED (Better Packet Lost rate)
    42 0.142857 0.709220 'Hongkong - Rackspace' to 'Beijing - Qincloud' OPTIMIZED (Better Packet Lost rate)
    43 1.357143 0.765957 'Tokyo - Amazon' to 'Beijing - Qincloud' OK (less them 1% diference is considered same)
    44 1.347518 24.443662 'Strasbourg - OVH' to 'Guanghouz - Qincloud' OPTIMIZED (Better Packet Lost rate)
    45 0.000000 0.000000 'Beijing - Qincloud' to 'Guanghouz - Qincloud' OK (Same Packet Lost rate)
    46 0.214286 0.212766 'Singapour - Amazon' to 'Guanghouz - Qincloud' OK (less them 1% diference is considered same)
    47 0.214286 1.134752 'Hongkong - Qincloud 1' to 'Guanghouz - Qincloud' OPTIMIZED (Better Packet Lost rate)
    48 0.642857 1.134752 'Hongkong - Qincloud 0' to 'Guanghouz - Qincloud' OPTIMIZED (Better Packet Lost rate)
    49 2.086331 14.014184 'US West - Amazon' to 'Guanghouz - Qincloud' OPTIMIZED (Better Packet Lost rate)
    50 1.134752 10.464789 'Virginia - Amazon' to 'Guanghouz - Qincloud' OPTIMIZED (Better Packet Lost rate)
    51 0.354610 22.147887 'Beauharnois - OVH' to 'Guanghouz - Qincloud' OPTIMIZED (Better Packet Lost rate)
    52 0.142857 0.070922 'Guanghouz - UCloud' to 'Guanghouz - Qincloud' OK (less them 1% diference is considered same)
    53 0.714286 0.000000 'Hongkong - Rackspace' to 'Guanghouz - Qincloud' OK (less them 1% diference is considered same)
    54 1.000000 8.865248 'Tokyo - Amazon' to 'Guanghouz - Qincloud' OPTIMIZED (Better Packet Lost rate)
    55 0.070922 0.000000 'Strasbourg - OVH' to 'Virginia - Amazon' OK (less them 1% diference is considered same)
    56 0.491803 0.975610 'Beijing - Qincloud' to 'Virginia - Amazon' OPTIMIZED (Better Packet Lost rate)
    57 0.000000 0.070922 'Singapour - Amazon' to 'Virginia - Amazon' OPTIMIZED (Better Packet Lost rate)
    58 0.000000 2.553191 'Hongkong - Qincloud 1' to 'Virginia - Amazon' OPTIMIZED (Better Packet Lost rate)
    59 0.000000 0.000000 'Hongkong - Qincloud 0' to 'Virginia - Amazon' OK (Same Packet Lost rate)
    60 0.000000 0.000000 'US West - Amazon' to 'Virginia - Amazon' OK (Same Packet Lost rate)
    61 0.071429 0.992908 'Guanghouz - Qincloud' to 'Virginia - Amazon' OPTIMIZED (Better Packet Lost rate)
    62 0.000000 0.000000 'Beauharnois - OVH' to 'Virginia - Amazon' OK (Same Packet Lost rate)
    63 0.357143 21.652482 'Guanghouz - UCloud' to 'Virginia - Amazon' OPTIMIZED (Better Packet Lost rate)
    64 0.571429 0.070922 'Hongkong - Rackspace' to 'Virginia - Amazon' OK (less them 1% diference is considered same)
    65 0.000000 0.000000 'Tokyo - Amazon' to 'Virginia - Amazon' OK (Same Packet Lost rate)
    66 1.631206 0.774648 'Strasbourg - OVH' to 'Hongkong - Qincloud 0' OK (less them 1% diference is considered same)
    67 0.330579 0.983607 'Beijing - Qincloud' to 'Hongkong - Qincloud 0' OPTIMIZED (Better Packet Lost rate)
    68 0.000000 0.000000 'Singapour - Amazon' to 'Hongkong - Qincloud 0' OK (Same Packet Lost rate)
    69 0.000000 0.000000 'Hongkong - Qincloud 1' to 'Hongkong - Qinclou... OK (Same Packet Lost rate)
    70 0.575540 0.000000 'US West - Amazon' to 'Hongkong - Qincloud 0' OK (less them 1% diference is considered same)
    71 0.000000 0.000000 'Virginia - Amazon' to 'Hongkong - Qincloud 0' OK (Same Packet Lost rate)
    72 0.857143 0.851064 'Guanghouz - Qincloud' to 'Hongkong - Qincloud 0' OK (less them 1% diference is considered same)
    73 0.000000 0.492958 'Beauharnois - OVH' to 'Hongkong - Qincloud 0' OPTIMIZED (Better Packet Lost rate)
    74 0.142857 4.680851 'Guanghouz - UCloud' to 'Hongkong - Qincloud 0' OPTIMIZED (Better Packet Lost rate)
    75 0.000000 0.000000 'Hongkong - Rackspace' to 'Hongkong - Qincloud 0' OK (Same Packet Lost rate)
    76 0.000000 0.141844 'Tokyo - Amazon' to 'Hongkong - Qincloud 0' OPTIMIZED (Better Packet Lost rate)
    77 0.709220 17.605634 'Strasbourg - OVH' to 'Guanghouz - UCloud' OPTIMIZED (Better Packet Lost rate)
    78 0.000000 0.409836 'Beijing - Qincloud' to 'Guanghouz - UCloud' OPTIMIZED (Better Packet Lost rate)
    79 0.785714 0.709220 'Singapour - Amazon' to 'Guanghouz - UCloud' OK (less them 1% diference is considered same)
    80 0.357143 2.808511 'Hongkong - Qincloud 1' to 'Guanghouz - UCloud' OPTIMIZED (Better Packet Lost rate)
    81 0.071429 4.326241 'Hongkong - Qincloud 0' to 'Guanghouz - UCloud' OPTIMIZED (Better Packet Lost rate)
    82 3.237410 21.588652 'US West - Amazon' to 'Guanghouz - UCloud' OPTIMIZED (Better Packet Lost rate)
    83 0.780142 23.556338 'Virginia - Amazon' to 'Guanghouz - UCloud' OPTIMIZED (Better Packet Lost rate)
    84 0.000000 0.000000 'Guanghouz - Qincloud' to 'Guanghouz - UCloud' OK (Same Packet Lost rate)
    85 3.191489 20.669014 'Beauharnois - OVH' to 'Guanghouz - UCloud' OPTIMIZED (Better Packet Lost rate)
    86 0.928571 1.560284 'Hongkong - Rackspace' to 'Guanghouz - UCloud' OPTIMIZED (Better Packet Lost rate)
    87 0.857143 8.297872 'Tokyo - Amazon' to 'Guanghouz - UCloud' OPTIMIZED (Better Packet Lost rate)
    88 0.070922 0.352113 'Strasbourg - OVH' to 'Tokyo - Amazon' OPTIMIZED (Better Packet Lost rate)
    89 0.826446 0.327869 'Beijing - Qincloud' to 'Tokyo - Amazon' OK (less them 1% diference is considered same)
    90 0.000000 0.000000 'Singapour - Amazon' to 'Tokyo - Amazon' OK (Same Packet Lost rate)
    91 0.000000 0.000000 'Hongkong - Qincloud 1' to 'Tokyo - Amazon' OK (Same Packet Lost rate)
    92 0.142857 0.141844 'Hongkong - Qincloud 0' to 'Tokyo - Amazon' OK (less them 1% diference is considered same)
    93 0.000000 0.000000 'US West - Amazon' to 'Tokyo - Amazon' OK (Same Packet Lost rate)
    94 0.000000 0.000000 'Virginia - Amazon' to 'Tokyo - Amazon' OK (Same Packet Lost rate)
    95 0.214286 10.567376 'Guanghouz - Qincloud' to 'Tokyo - Amazon' OPTIMIZED (Better Packet Lost rate)
    96 0.070922 0.211268 'Beauharnois - OVH' to 'Tokyo - Amazon' OPTIMIZED (Better Packet Lost rate)
    97 0.785714 9.716312 'Guanghouz - UCloud' to 'Tokyo - Amazon' OPTIMIZED (Better Packet Lost rate)
    98 0.000000 2.553191 'Hongkong - Rackspace' to 'Tokyo - Amazon' OPTIMIZED (Better Packet Lost rate)
    99 0.212766 0.985915 'Strasbourg - OVH' to 'Singapour - Amazon' OPTIMIZED (Better Packet Lost rate)
    100 0.245902 1.056911 'Beijing - Qincloud' to 'Singapour - Amazon' OPTIMIZED (Better Packet Lost rate)
    101 0.000000 0.000000 'Hongkong - Qincloud 1' to 'Singapour - Amazon' OK (Same Packet Lost rate)
    102 0.000000 0.000000 'Hongkong - Qincloud 0' to 'Singapour - Amazon' OK (Same Packet Lost rate)
    103 0.000000 0.000000 'US West - Amazon' to 'Singapour - Amazon' OK (Same Packet Lost rate)
    104 0.000000 0.000000 'Virginia - Amazon' to 'Singapour - Amazon' OK (Same Packet Lost rate)
    105 0.214286 0.141844 'Guanghouz - Qincloud' to 'Singapour - Amazon' OK (less them 1% diference is considered same)
    106 0.070922 0.140845 'Beauharnois - OVH' to 'Singapour - Amazon' OPTIMIZED (Better Packet Lost rate)
    107 0.071429 0.638298 'Guanghouz - UCloud' to 'Singapour - Amazon' OPTIMIZED (Better Packet Lost rate)
    108 0.000000 1.347518 'Hongkong - Rackspace' to 'Singapour - Amazon' OPTIMIZED (Better Packet Lost rate)
    109 0.000000 0.000000 'Tokyo - Amazon' to 'Singapour - Amazon' OK (Same Packet Lost rate)
    110 1.134752 0.492958 'Strasbourg - OVH' to 'Hongkong - Qincloud 1' OK (less them 1% diference is considered same)
    111 0.991736 1.229508 'Beijing - Qincloud' to 'Hongkong - Qincloud 1' OPTIMIZED (Better Packet Lost rate)
    112 0.071429 0.000000 'Singapour - Amazon' to 'Hongkong - Qincloud 1' OK (less them 1% diference is considered same)
    113 0.000000 0.000000 'Hongkong - Qincloud 0' to 'Hongkong - Qinclou... OK (Same Packet Lost rate)
    114 0.000000 0.000000 'US West - Amazon' to 'Hongkong - Qincloud 1' OK (Same Packet Lost rate)
    115 0.000000 2.957746 'Virginia - Amazon' to 'Hongkong - Qincloud 1' OPTIMIZED (Better Packet Lost rate)
    116 0.285714 0.780142 'Guanghouz - Qincloud' to 'Hongkong - Qincloud 1' OPTIMIZED (Better Packet Lost rate)
    117 0.070922 0.633803 'Beauharnois - OVH' to 'Hongkong - Qincloud 1' OPTIMIZED (Better Packet Lost rate)
    118 0.000000 1.631206 'Guanghouz - UCloud' to 'Hongkong - Qincloud 1' OPTIMIZED (Better Packet Lost rate)
    119 0.000000 0.070922 'Hongkong - Rackspace' to 'Hongkong - Qincloud 1' OPTIMIZED (Better Packet Lost rate)
    120 0.000000 0.070922 'Tokyo - Amazon' to 'Hongkong - Qincloud 1' OPTIMIZED (Better Packet Lost rate)
    121 0.141844 0.000000 'Strasbourg - OVH' to 'US West - Amazon' OK (less them 1% diference is considered same)
    122 0.491803 0.327869 'Beijing - Qincloud' to 'US West - Amazon' OK (less them 1% diference is considered same)
    123 0.000000 0.000000 'Singapour - Amazon' to 'US West - Amazon' OK (Same Packet Lost rate)
    124 0.000000 0.000000 'Hongkong - Qincloud 1' to 'US West - Amazon' OK (Same Packet Lost rate)
    125 0.928571 0.000000 'Hongkong - Qincloud 0' to 'US West - Amazon' OK (less them 1% diference is considered same)
    126 0.070922 0.000000 'Virginia - Amazon' to 'US West - Amazon' OK (less them 1% diference is considered same)
    127 1.642857 16.439716 'Guanghouz - Qincloud' to 'US West - Amazon' OPTIMIZED (Better Packet Lost rate)
    128 0.000000 0.140845 'Beauharnois - OVH' to 'US West - Amazon' OPTIMIZED (Better Packet Lost rate)
    129 1.785714 23.531915 'Guanghouz - UCloud' to 'US West - Amazon' OPTIMIZED (Better Packet Lost rate)
    130 3.357143 0.921986 'Hongkong - Rackspace' to 'US West - Amazon' BAD (Worst Packet Lost rate)
    131 0.000000 0.000000 'Tokyo - Amazon' to 'US West - Amazon' OK (Same Packet Lost rate)

    How fast can we get? Is there a Speed Limit?

    Our monitoring experiment managed to surpass even our high expectations. We observed that GrandeNet globally reduced latency between 15% to 30% and packet loss to lower than 1% (a 5-10x improvement). for a group of computers if compared with standard IPv4.

    Considering all individual links between monitored servers and ping response (latency), between 50% and 70% of connections were optimized through use of GrandeNet with packet loss being lowered on 45% to 65% of all connections.

    GrandeNet still doesn't use a fully connected mesh configuration, so we also observed that a small portion of connections decreases in quality when using GrandeNet IPv6. However, this issue can be resolved through monitoring by creating additional direct tunnels between the servers that show standard IPv4 to be faster. By creating these direct tunnels, we thus stabilize the mesh because it will only include optimized or same speed links (our additional direct tunnels) on GrandeNet.

    In [31]:
    # Global Average result
    
    ipv4_mean = df_average_statistic["internet_ipv4"].mean() 
    ipv6_mean = df_average_statistic["grandenet_ipv6"].mean()
    
    display("IPv4 Final Average from all links: %.2fms" % ipv4_mean)
    display("IPv6 Final Average from all links: %.2fms" % ipv6_mean)
    
    if ipv4_mean > ipv6_mean:
        display("Grandent Optimized the network Globally in %.2f%% in average for each ping response." % \
                (((ipv4_mean - ipv6_mean)/ipv4_mean)*100))
    elif ipv4_mean == ipv6_mean:
        display("<h1>No Optimisation found.</h1>")
    elif ipv4_mean < ipv6_mean:
        display("Grandenet is making things worst in %sms, please review the configuration." % (ipv6_mean - ipv4_mean))
    
     
    'IPv4 Final Average from all links: 161.75ms'
     
    'IPv6 Final Average from all links: 127.46ms'
     
    'Grandent Optimized the network Globally in 21.20% in average for each ping response.'
    In [32]:
    # Number of optimisations
    total = len(df_average_statistic)
    optimized = len(df_average_statistic[df_average_statistic["internet_ipv4"] > df_average_statistic["grandenet_ipv6"]])
    
    worst = len(df_average_statistic[
        df_average_statistic.apply(lambda x: x["internet_ipv4"] < x["grandenet_ipv6"] - max(20, x["internet_ipv4"]*0.1), axis=1)])
    
    
    display("Total Number of Links tested: %s" % total)
    display("Number of Optimized Links: %s (%.2f%%)" % (optimized, (float(optimized)/total)*100))
    display("Number of links which becomes worst: %s (%.2f%%)" % (worst, (float(worst)/total)*100))
    display("Number of links which unchanged : %s (%.2f%%)" % ((total-(optimized+worst)), (float(total-(optimized+worst))/total)*100))
    
     
    'Total Number of Links tested: 132'
     
    'Number of Optimized Links: 78 (59.09%)'
     
    'Number of links which becomes worst: 0 (0.00%)'
     
    'Number of links which unchanged : 54 (40.91%)'
    In [33]:
    ipv4_package_lost_rate = df_packetlost_statistic["internet_ipv4_packet_lost"].mean()
    ipv6_package_lost_rate = df_packetlost_statistic["grandenet_ipv6_packet_lost"].mean()
    
    display("Average of Packet Lost Rate per link using Internet (IPv4): %.2f%%" % ipv4_package_lost_rate)
    display("Average of Packet Lost Rate per link using Grandenet (IPv6): %.2f%%" % ipv6_package_lost_rate)
    
    
    if ipv4_package_lost_rate > ipv6_package_lost_rate:
        display("Grandent Optimized the network Globally in %.2f%% less packet lost in average, it is %.2f times better." % \
                (ipv4_package_lost_rate - ipv6_package_lost_rate, (float(ipv4_package_lost_rate/ipv6_package_lost_rate))))
    elif ipv4_package_lost_rate == ipv6_package_lost_rate:
        display("No Optimisation found.")
    elif ipv4_package_lost_rate < ipv6_package_lost_rate:
        display("Grandenet is making things worst in %.2f%% , please review the configuration." % (ipv6_package_lost_rate - ipv4_package_lost_rate))
    
        
        
    
     
    'Average of Packet Lost Rate per link using Internet (IPv4): 3.12%'
     
    'Average of Packet Lost Rate per link using Grandenet (IPv6): 0.52%'
     
    'Grandent Optimized the network Globally in 2.61% less packet lost in average, it is 6.05 times better.'
    In [34]:
    dps = df_packetlost_statistic
    
    total = len(dps)
    optimized = len(dps[dps["internet_ipv4_packet_lost"] > dps["grandenet_ipv6_packet_lost"]])
    worst = len(dps[(dps["internet_ipv4_packet_lost"] < dps["grandenet_ipv6_packet_lost"])]
                    [(dps["grandenet_ipv6_packet_lost"] - dps["internet_ipv4_packet_lost"]) > 1])
    same = len(dps[(dps["internet_ipv4_packet_lost"] == dps["grandenet_ipv6_packet_lost"])])
    
    same += len(dps[(dps["grandenet_ipv6_packet_lost"] - dps["internet_ipv4_packet_lost"]) < 1]
                     [(dps["grandenet_ipv6_packet_lost"] > dps["internet_ipv4_packet_lost"])])
    
    display("Total Number of Links tested: %s" % total)
    display("Number of Optimized links with less packet lost: %s (%.2f%%)" % (optimized, (float(optimized)/total)*100))
    display("Number of links which becomes worst: %s (%.2f%%)" % (worst, (float(worst)/total)*100))
    display("Number of links which unchanged : %s (%.2f%%)" % (same, (float(same)/total)*100))
    
     
    'Total Number of Links tested: 132'
     
    'Number of Optimized links with less packet lost: 75 (56.82%)'
     
    'Number of links which becomes worst: 3 (2.27%)'
     
    'Number of links which unchanged : 54 (40.91%)'

    Conclusion

    As mentioned above our sample showed GrandeNet IPv6 reducing latency between 15-30% and packet loss lowered to below 1% (5-10x improvement) versus using standard IPv4 connections. 50-70% of overall connections could be optimized lowering packet loss on 45-65% of them. The GrandeNet IPv6 final average response time of 127.46ms finished far ahead of the default IPv4 average response of 161.75ms.

    Overall 21.20% of all pings were optimized using GrandeNet with packet loss being reduced from 3.12% (IPv4) to 0.52% (IPv6) showing that monitoring and optimizing for network connectivity can result in significant benefits. Creating tools automating our experiments and providing easy to use applications for users to display the routing situation in real time along with connectivity problems will be the next logical step.