Η Πύλη SD-WAN επεξεργάζεται ριπές κυκλοφορίας και αναμένονται ριπές υψηλής CPU. Η πύλη πρέπει να παρακολουθείται για πυρήνες CPU που περιστρέφονται στο 100%. Ωστόσο, οι πυρήνες DPDK εκτελούνται σε λειτουργία σταθμοσκόπησης για λόγους απόδοσης και αναμένουν να λάβουν περίπου 100% CPU σε υψηλή ταχύτητα μετάδοσης.
Μπορείτε να παρακολουθείτε μια πύλη με όρια που παρέχουν προειδοποιητικές ή κρίσιμες καταστάσεις που υποδεικνύουν πιθανά ζητήματα πριν από την επίδραση των υπηρεσιών. Ο παρακάτω πίνακας παραθέτει τις οριακές τιμές και τις προτεινόμενες ενέργειες.
Κατάσταση ορίου | Οριακή τιμή | Συνιστώμενη διορθωτική ενέργεια | |
---|---|---|---|
Πυρήνας DP (DP Core) | Χωρίς πυρήνα DP (Non DP Core) | ||
Προειδοποίηση | 95% | 80% | Εάν γίνεται υπέρβαση της οριακής τιμής σταθερά για 5 λεπτά:
Εάν γίνεται υπέρβαση της οριακής τιμής σταθερά για 5 λεπτά:
|
Κρίσιμο | 98% | 90% | Εάν γίνεται υπέρβαση της οριακής τιμής σταθερά για 5 λεπτά:
Εάν το πρόβλημα παρατηρηθεί για μία ώρα:
|
#! /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)