SD-WAN Gateway는 트래픽 버스트를 처리하며 높은 CPU 버스트가 예상됩니다. 100%에서 회전하는 CPU 코어가 있는지 게이트웨이를 모니터링해야 합니다. 그러나 DPDK 코어는 성능상의 이유로 폴링 모드에서 실행되며 높은 처리량에서 100% CPU에 근접할 것으로 예상됩니다.

서비스에 영향을 미치기 전에 잠재적인 문제를 나타내는 주의 또는 위험 상태를 제공하는 임계값을 나타내는 터널 수를 모니터링할 수 있습니다. 다음 표에는 임계값 및 권장 작업이 나열되어 있습니다.

임계값 상태 임계값 권장되는 수정 조치
DP 코어 비 DP 코어
주의 95% 80%

임계값이 5분 동안 일관되게 초과할 경우:

  • 프로세스별 CPU 사용량을 확인합니다.
  • 10분 더 모니터링합니다.

임계값이 5분 동안 일관되게 초과할 경우:

  • 게이트웨이 진단 번들을 수집합니다.
  • VMware의 지원 사례를 엽니다.
위험 98% 90%

임계값이 5분 동안 일관되게 초과할 경우:

  • 용량 초과를 나타낼 수 있는 가능한 위험 패킷 삭제를 모니터링합니다.

이 문제가 1시간 동안 발견된 경우 다음 작업을 수행합니다.

  • 5분 간격으로 용량 초과가 발견되면 게이트웨이 용량을 추가하고 재조정하여 용량 관련 서비스 영향을 방지합니다.
    참고: 게이트웨이를 재조정하기 전에 용량 메트릭이 권장 제한 내에 있는지 확인합니다. 용량 메트릭에 대한 자세한 내용은 게이트웨이 구성 요소의 용량을 참조하십시오.
다음은 CPU 사용량을 모니터링하기 위한 예제 Python 스크립트입니다.
참고: Telegraf를 사용하여 CPU 사용량을 모니터링할 수도 있습니다. 자세한 내용은 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)