La passerelle SD-WAN Gateway traite les rafales de trafic et des rafales de CPU élevées sont attendues. La passerelle doit être surveillée pour les cœurs de CPU qui tournent à 100 %. Toutefois, les cœurs du kit de développement de plan de données (DPDK, Data Plane Development Kit) s'exécutent en mode d'interrogation pour des raisons de performances et doivent atteindre une valeur proche d'un CPU de 100 % à un débit élevé.
Vous pouvez surveiller une passerelle avec des seuils qui fournissent des états d'avertissement ou critiques qui indiquent des problèmes potentiels avant d'avoir une incidence sur les services. Le tableau suivant répertorie les valeurs de seuil et les actions recommandées.
État du seuil | Valeur de seuil | Action corrective recommandée | |
---|---|---|---|
Cœur DP | Cœur non-DP | ||
Avertissement | 95% | 80 % | Si la valeur de seuil est constamment franchie pendant 5 minutes :
Si la valeur de seuil est constamment franchie pendant 5 minutes :
|
Critique | 98% | 90 % | Si la valeur de seuil est constamment franchie pendant 5 minutes :
Si le problème persiste pendant une heure :
|
#! /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)