Das SD-WAN Gateway verarbeitet die Datenverkehrsbursts und erwartet Bursts mit hoher CPU. Das Gateway sollte auf CPU-Kernen überwacht werden, die sich bei 100 % drehen. Die DPDK-Kerne werden jedoch aus Leistungsgründen im Abfragemodus ausgeführt, und sie erwarten bei einem hohen Durchsatz eine CPU-Nutzung von fast 100 %.
Sie können ein Gateway mit Schwellenwerten überwachen, die Warnungen oder kritische Statuszustände bereitstellen und vor der Beeinträchtigung der Dienste auf potenzielle Probleme hinweisen. In der folgenden Tabelle sind die Schwellenwerte und empfohlenen Aktionen aufgeführt.
Status des Schwellenwerts | Schwellenwert | Empfohlene fehlerbehebende Aktion | |
---|---|---|---|
DP-Kern | Nicht-DP-Kern | ||
Warnung | 95 % | 80 % | Wenn der Schwellenwert 5 Minuten lang ständig überschritten wird:
Wenn der Schwellenwert 5 Minuten lang ständig überschritten wird:
|
Kritisch | 98 % | 90 % | Wenn der Schwellenwert 5 Minuten lang ständig überschritten wird:
Wenn das Problem eine Stunde lang beobachtet wird:
|
#! /usr/bin/env python """ Check for CPUs spinning at 100% """ import re import collections import time import sys import json import os import subprocess re_cpu = re.compile(r"^cpu\d+\s") CPUStat = collections.namedtuple('CPUStat', ['user', 'nice', 'sys', 'idle']) def get_stats(): stats = open("/proc/stat").readlines() ret = {} for s in stats: if not re_cpu.search(s): continue s = s.split() ret[s[0]] = CPUStat(*[ int(v) for v in s[1:5]]) return ret def verify_dpdk_support(): if os.path.isfile('/opt/vc/etc/dpdk.json'): with open("/opt/vc/etc/dpdk.json") as data: d=json.loads((data.read())) if "status" in d.keys(): return True if d['status'] is "Supported" else False else: return False def another_verify_dpdk_support(): if os.path.isfile('/opt/vc/bin/debug.py'): f=subprocess.check_output(["/opt/vc/bin/debug.py","--dpdk_ports_dump"]) x=[r.split() for r in f.split('\n')] if len(x) <= 1: return False else: return True else: return False dpdk_status=verify_dpdk_support() or another_verify_dpdk_support() if __name__ == "__main__": try: stat1 = get_stats() time.sleep(3) stat2 = get_stats() except: print "UKNOWN - failed to get CPU stat: %s" % str(sys.exc_info()[1]) sys.exit(3) busy_cpu_set = [ cpu for cpu in stat1 if (stat2[cpu].idle - stat1[cpu].idle)==0 ] if not busy_cpu_set: print "OK - no spinning CPUs" sys.exit(0) if dpdk_status == True: if "cpu1" in busy_cpu_set and len(busy_cpu_set) == 1: print "OK - no spinning CPUs" sys.exit(0) elif "cpu1" in busy_cpu_set: busy_cpu_set.remove('cpu1') print "CRITICAL - %s is at 100%%" % (",".join(busy_cpu_set)) sys.exit(2) else: print busy_cpu_set,1 print "CRITICAL - %s is at 100%%" % (",".join(busy_cpu_set)) sys.exit(2) else: print "CRITICAL - %s is at 100%%" % (",".join(busy_cpu_set)) sys.exit(2)