O SD-WAN Gateway processa bursts de tráfego e são esperados bursts de utilização elevada da CPU. O gateway deve ser monitorizado para núcleos de CPU que giram a 100%. No entanto, os núcleos DPDK são executados no modo de consulta por motivos de desempenho e espera-se que alcancem perto de 100% de utilização da CPU com débito elevado.

Pode monitorizar um gateway com limiares que fornecem estados de alerta ou críticos que indicam potenciais problemas antes de os serviços serem afetados. A tabela que se segue lista os valores de limiar e as ações recomendadas.

Estado de limiar Valor de limiar Ação corretiva recomendada
Núcleo DP Núcleo não DP
Aviso 95% 80%

Se o valor de limiar for ultrapassado de forma consistente durante 5 minutos:

  • Verifique a utilização da CPU por processos.
  • Monitorize por mais 10 minutos.

Se o valor de limiar for ultrapassado de forma consistente durante 5 minutos:

  • Recolha o pacote de diagnóstico do gateway.
  • Abra um pedido de suporte junto da VMware.
Crítico 98% 90%

Se o valor de limiar for ultrapassado de forma consistente durante 5 minutos:

  • Monitorize uma possível falha na obtenção de um pacote crítico, o que pode significar sobrecarga.

Se o problema for observado durante uma hora:

  • Se a sobrecarga for observada ao longo de um intervalo de 5 minutos, adicione capacidade ao gateway e reequilibre para evitar o impacto no serviço relacionado com a capacidade.
    Nota: Antes de reequilibrar o gateway, confirme que as métricas de capacidade estão dentro do limite recomendado. Para obter mais informações sobre as métricas, consulte Capacidade dos componentes do gateway.
Segue-se um exemplo de um script Python para monitorizar a utilização da CPU:
Nota: Também pode utilizar o Telegraf para monitorizar a utilização da CPU. Para obter mais informações, consulte Monitorizar os Gateways utilizando o Telegraf.
#! /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)