SD-WAN Gateway es una arquitectura de canalización que procesa ráfagas de tráfico y donde se esperan ráfagas de CPU alta. La puerta de enlace debe supervisarse para los núcleos de CPU que giran al 100 %. Sin embargo, los núcleos de DPDK se ejecutan en modo de sondeo por motivos de rendimiento y esperan alcanzar cerca del 100 % de CPU con un alto rendimiento.
Es posible supervisar una puerta de enlace con umbrales que proporcionan estados críticos o de advertencia que evidencian posibles problemas antes de que afecten a los servicios. En la siguiente tabla se enumeran los valores de umbral y las acciones recomendadas.
| Estado de umbral | Valor de umbral | Acción correctiva recomendada |
|---|---|---|
| Advertencia | 80 % | Si el valor del umbral se supera constantemente durante 5 minutos:
Si el valor del umbral se supera constantemente durante 5 minutos:
|
| Crítico | 90 % | Si el valor del umbral se supera constantemente durante 5 minutos:
Si el problema se observa durante una hora:
|
#! /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)