Erhebliche und anhaltende verworfene Pakete in den kritischen Warteschlangen sind bei Überkapazitäten üblich und werden sich wahrscheinlich auf die Kunden auswirken.

Die Leistungsindikatoren in den folgenden kritischen Warteschlangen sollten genau überwacht werden.

vc_queue_net_sch, vc_queue_link_select und vc_queue_link_sch: Diese Scheduler sind für die Linkauswahl, den Quality of Service und die Link-Planung für die für Edges vorgesehenen Schlüssel gedacht. Der Orchestrator nimmt Pakete vom globalen Paket-Scheduler (vc_queue_net_sch) an, wählt den entsprechenden Link aus, um sie weiterzuleiten (vc_queue_link_select), und reiht sie in die Warteschlange des Paket-Scheduler auf Linkebene ein (vc_queue_link_sch).

Die verworfenen Pakete hier deuten darauf hin, dass das Gateway den VCMP-Datenverkehr (z. B. die Rückpakete aus dem Internet) nicht schnell genug an die Edges senden kann.

vc_queue_link_encrypt_0 und vc_queue_link_encrypt_1: Dies ist softwarebasierte Paketverschlüsselung, die die Paketverschlüsselung sowie die Kapselung und ähnliche Verarbeitung vor der Paketübertragung verwaltet.

In einem DPDK-aktivieren Gateway werden Kapazitätsprobleme zunächst als verworfene Pakete in dieser Warteschlange beobachtet. Die verworfenen Pakete in der Warteschlange deuten darauf hin, dass das Gateway den Datenverkehr nicht schnell genug verschlüsseln kann.

vc_queue_vcmp_tx: Dies ist die Paketübertragung für VCMP-Pakete. Die Warteschlange übernimmt die Übertragung von Paketen auf Schnittstellen, das Einreihen in eine Warteschlange für eine eventuelle erneute Übertragung, falls erforderlich, und das Freigeben von Paketen. Die verworfenen Pakete in der Warteschlange deuten darauf hin, dass das Gateway den VCMP-Datenverkehr (z. B. die Rückpakete aus dem Internet) nicht schnell genug an die Edges senden kann.

Im Folgenden finden Sie ein Python-Beispielskript zur Überprüfung von verworfenen vcmp_tx-Paketen. Führen Sie das Python-Skript auf einem Gateway mit verworfenen Paketen in der Warteschlange aus, um die Details der Probleme anzuzeigen.

#!/usr/bin/env python
"""
Check VCG vcmp handoff drops packet check
"""
import os
import sys
import subprocess
import commands
import re
import json
from optparse import OptionParser

# Parse commandline options:
parser = OptionParser(usage="%prog -w <warning threshold> -c <critical threshold> [ -h ]")
parser.add_option("-w", "--warning", action="store", type="string", dest="warn_threshold", help="Count Warning threshold should be in <value>")
parser.add_option("-c", "--critical",action="store", type="string", dest="crit_threshold", help="Count Critical threshold should be in <value>")
(options, args) = parser.parse_args()

json_data= {"vcg_handoff_data": {"count":0,"drops":[]}}
vcg_handoff_file="/tmp/vcg_handoff_drop_check"
bw_threshold=768000

def find_bw_throughput():
    total_bw = 0
    value = 2
    flag = os.path.exists("/opt/vc/etc/dpdk-override.json")
    if flag is True:
       with open("/opt/vc/etc/dpdk-override.json") as json_file:
            data = json.load(json_file)
       value = data["enabled"]
    if value == 0:
      status,output = commands.getstatusoutput("ifstat  -bqTn 1 1")
      if status == 0:
         total_bw = float(output.splitlines()[-1].split()[-1]) + float(output.splitlines()[-1].split()[-2])
    return int(total_bw)

def store_vcg_hanoff_queue_qlength():
    samples_count = 5
    if not os.path.isfile(vcg_handoff_file):
       with open(vcg_handoff_file, 'w') as outfile:
           json.dump(json_data, outfile )

    if os.path.isfile(vcg_handoff_file):
       with open(vcg_handoff_file) as vcg_handoff_data:
           handoff_data = json.load(vcg_handoff_data)
    else:
       with open(vcg_handoff_file, 'w') as outfile:
           json.dump(json_data, outfile )

    if os.path.isfile('/opt/vc/bin/debug.py'):
       L=[]
       f=subprocess.check_output(["/opt/vc/bin/debug.py","--handoff"])
       x=[r.split() for r in f.split('\n')]
       res = list(filter(None, x))

       if handoff_data["vcg_handoff_data"]["count"] == 0:
           for item in res:
              if not item[0] == "name":
                 #handoff_data["vcg_handoff_data"]["drops"].append({item[0]:[item[13]]})
                 handoff_data["vcg_handoff_data"]["drops"].append({item[0]:["1"] * samples_count})
                 handoff_data["vcg_handoff_data"]["count"] = 1
           with open(vcg_handoff_file, 'w') as outfile:
                json.dump(handoff_data, outfile )

       if not handoff_data["vcg_handoff_data"]["count"] == 0:
        count_status = handoff_data["vcg_handoff_data"]["count"] - 1
        for item in res:
            if not item[0] == "name":
               for key in  handoff_data["vcg_handoff_data"]["drops"]:
                   field_num = len(item) - 6
                   if item[0] == key.keys()[0]:
                      key[key.keys()[0]].append(item[field_num])
                      del key[key.keys()[0]][0]
                      #key[key.keys()[0]][count_status]=item[field_num]
        handoff_data["vcg_handoff_data"]["count"] += 1
        if handoff_data["vcg_handoff_data"]["count"] == samples_count + 1:
           handoff_data["vcg_handoff_data"]["count"] = 1

        with open(vcg_handoff_file, 'w') as outfile:
           json.dump(handoff_data, outfile )

def get_status_of_drops(warn_value,crit_value):
    result = []
    diff_drops_data = []
    both_value = False
    total_bw = find_bw_throughput()
    if os.path.isfile(vcg_handoff_file):
       with open(vcg_handoff_file) as vcg_handoff_data:
           handoff_data = json.load(vcg_handoff_data)

    for drops in handoff_data["vcg_handoff_data"]["drops"]:
       for key,value in drops.items():
           if key == "vc_queue_vcmp_tx_0":
               for cumlative_data in range(len(value)):
                  if not cumlative_data == 4:
                     drop_value = int(value[cumlative_data+1]) - int(value[cumlative_data])
                     diff_drops_data.append(drop_value)
                     warn_counter = 0
                     crit_counter = 0
                     for data in diff_drops_data:
                        if int(data) >= int(crit_value) and int(total_bw) > int(bw_threshold):
                           both_value = True
                        if int(data) > int(crit_value):
                          crit_counter +=1
                        if int(data) > int(warn_value) and  int(data) < int(crit_value):
                          warn_counter +=1
                     if both_value == True:
                        if not result:
                           result.append({key:diff_drops_data,"current_bw":total_bw,"status":"critical"})
                     if crit_counter  == 4:
                        result.append({key:diff_drops_data,"current_bw":total_bw,"status":"critical"})
                     if warn_counter == 4:
                        result.append({key:diff_drops_data,"status":"warning"})
    if not result:
       return "OK",diff_drops_data,total_bw
    else:
       return result

if __name__ == '__main__':

   crit_threshold = options.crit_threshold
   warn_threshold = options.warn_threshold
   crit = 0
   if not options.crit_threshold:
      print "CRITICAL: Missing critical threshold value."
      sys.exit(2)
   if not options.warn_threshold:
      print "CRITICAL: Missing warning threshold value."
      sys.exit(2)

   store_vcg_hanoff_queue_qlength()
   result = get_status_of_drops(warn_threshold,crit_threshold)
   result_type = isinstance(result, tuple)
   if result_type != True:
      for item in result:
         if item["status"] == "critical":
            crit = 1

   if result[0] == "OK":
      print "OK: Handoff drops with 5 samples are good and Current drop values %s and Current BW is %s Kbps" %(result[1],result[2])
      sys.exit(0)
   elif crit == 1:
      print "Critical: List of drops which are above %s packets: %s. Current_bw value is in kbps" %(crit_threshold, result)
      sys.exit(2)
   else:
      print "Warning: List of drops which are above %s packets: %s. Current_bw value is in kbps" %(warn_threshold,result)
      sys.exit(1)

vc_queue_vcmp_data_0 und vc_queue_vcmp_data_1:Dies ist die erste Phase der Verarbeitung von VCMP-Datenpaketen, die über VCMP-Tunnel empfangen werden. Die Warteschlange verarbeitet die Neuanordnung von Paketen und fehlende Pakete. Dies ist der Beginn der Verarbeitung von Datenpaketen, die über einen VCMP-Tunnel eintreffen.

Die verworfenen Pakete in der Warteschlange deuten darauf hin, dass das Gateway den Datenverkehr von Edges nicht schnell genug empfangen kann. Dies kann ein indirekter Hinweis auf einen Paketverlust auf dem Gateway sein, der eine erhebliche Neuanordnung der Pakete erfordert.

vc_queue_natt_0, vc_queue_natt_1, vc_queue_esp_0 und vc_queue_esp_1: Hierbei handelt es sich um die Entschlüsselung von NATT/ESP-verschlüsseltem Datenverkehr. Der Datenverkehr, der über einen verschlüsselten Tunnel eintrifft, geht hierher, um den für die Entschlüsselung erforderlichen Zustand herzustellen, und wird dann an eine Entschlüsselungsverarbeitungs-Warteschlange übergeben.

Die verworfenen Pakete in der Warteschlange deuten darauf hin, dass das Gateway den Non VMware SD-WAN Site-Verkehr nicht schnell genug entschlüsseln kann.

ipv4_bh: Dabei handelt es sich um die IPv4-Datenpaketverarbeitung, wie Routing, Quality of Service, Flow- und Peer-Verbindung, für aus dem Internet empfangene Rückpakete für NAT-Datenverkehr oder vom PE-Router für VLAN/VRF-Datenverkehr.

In allen Gateways, mit Ausnahme der nicht DPDK-aktivieren Gateways, werden Kapazitätsprobleme zunächst als verworfene Pakete in der Warteschlange beobachtet. Die verworfenen Pakete in der Warteschlange deuten darauf hin, dass das Gateway Pakete nicht schnell genug empfangen kann.