SD-WAN Gateway는 트래픽 버스트를 처리하며 높은 CPU 버스트가 예상됩니다. 100%에서 회전하는 CPU 코어가 있는지 게이트웨이를 모니터링해야 합니다. 그러나 DPDK 코어는 성능상의 이유로 폴링 모드에서 실행되며 높은 처리량에서 100% CPU에 근접할 것으로 예상됩니다.
서비스에 영향을 미치기 전에 잠재적인 문제를 나타내는 주의 또는 위험 상태를 제공하는 임계값을 나타내는 터널 수를 모니터링할 수 있습니다. 다음 표에는 임계값 및 권장 작업이 나열되어 있습니다.
임계값 상태 | 임계값 | 권장되는 수정 조치 | |
---|---|---|---|
DP 코어 | 비 DP 코어 | ||
주의 | 95% | 80% | 임계값이 5분 동안 일관되게 초과할 경우:
임계값이 5분 동안 일관되게 초과할 경우:
|
위험 | 98% | 90% | 임계값이 5분 동안 일관되게 초과할 경우:
이 문제가 1시간 동안 발견된 경우 다음 작업을 수행합니다.
|
다음은 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)