python 동시 다발 snmp 정보 및 성능 테스트

10788 단어 pythonsnmp
python & snmp
python 으로 snmp 정 보 를 얻 으 면 여러 개의 기 존 라 이브 러 리 를 사용 할 수 있 습 니 다.그 중에서 자주 사용 되 는 것 은netsnmppysnmp두 개의 라 이브 러 리 입 니 다.인터넷 에는 두 개의 라 이브 러 리 에 관 한 예 가 비교적 많다.
본 고 는 snmp 의 데 이 터 를 어떻게 동시에 얻 느 냐 에 중심 을 두 고 있다.즉,여러 대의 기계 의 snmp 정 보 를 동시에 얻 는 것 이다.
netsnmp
넷 스 mp 부터.python 의 netsnmp 는 사실 net-snmp 가방 에서 왔 습 니 다.
python 은 c 파일 을 통 해 net-snmp 인 터 페 이 스 를 호출 하여 데 이 터 를 가 져 옵 니 다.
따라서 여러 대의 기 계 를 동시에 얻 을 때 협 정 으로 얻 을 수 없다.협 정 을 사용 하기 때문에 get 데 이 터 를 사용 할 때 협 정 은 net-snmp 인터페이스 가 데 이 터 를 되 돌려 주 기 를 기다 리 며 socket 이 사용 할 때 처럼 데 이 터 를 기다 릴 때 CPU 를 다른 협 정 으로 전환 하지 않 습 니 다.그런 점 에서 협 정 을 사용 하 는 것 과 직렬 을 사용 하 는 것 은 다 르 지 않다.
그렇다면 병발 획득 문 제 는 어떻게 해결 할 것 인가?스 레 드 를 사용 할 수 있 습 니 다.다 중 스 레 드 를 가 져 올 수 있 습 니 다.(물론 다 중 프로 세 스 를 사용 할 수도 있 습 니 다.)여러 스 레 드 가 동시에 net-snmp 인 터 페 이 스 를 호출 하여 데 이 터 를 가 져 온 다음 cpu 는 여러 스 레 드 사이 에서 끊임없이 전환 합 니 다.하나의 스 레 드 가 결 과 를 얻 은 후에 인 터 페 이 스 를 계속 호출 하여 다음 snmp 데 이 터 를 얻 을 수 있 습 니 다.
여기에 나 는 샘플 프로그램 을 하나 썼 다.우선 모든 host 와 oid 를 작업 으로 만들어 대기 열 에 넣 고 여러 스 레 드 를 시작 하여 가 져 오 는 작업 을 수행 합 니 다.프로그램 샘플 은 다음 과 같 습 니 다.

import threading
import time
import netsnmp
import Queue

start_time = time.time()
hosts = ["192.20.150.109", "192.20.150.110", "192.20.150.111", "192.20.150.112", "192.20.150.113", "192.20.150.114",
     "192.20.150.115", "192.20.150.116", "192.20.150.117", "192.20.150.118", "192.20.150.119", "192.20.150.120",
     "192.20.150.121", "192.20.80.148", "192.20.80.149", "192.20.96.59", "192.20.82.14", "192.20.82.15",
     "192.20.82.17", "192.20.82.19", "192.20.82.12", "192.20.80.139", "192.20.80.137", "192.20.80.136",
     "192.20.80.134", "192.20.80.133", "192.20.80.131", "192.20.80.130", "192.20.81.141", "192.20.81.140",
     "192.20.82.26", "192.20.82.28", "192.20.82.23", "192.20.82.21", "192.20.80.128", "192.20.80.127",
     "192.20.80.122", "192.20.81.159", "192.20.80.121", "192.20.80.124", "192.20.81.151", "192.20.80.118",
     "192.20.80.119", "192.20.80.113", "192.20.80.112", "192.20.80.116", "192.20.80.115", "192.20.78.62",
     "192.20.81.124", "192.20.81.125", "192.20.81.122", "192.20.81.121", "192.20.82.33", "192.20.82.31",
     "192.20.82.32", "192.20.82.30", "192.20.81.128", "192.20.82.39", "192.20.82.37", "192.20.82.35",
     "192.20.81.130", "192.20.80.200", "192.20.81.136", "192.20.81.137", "192.20.81.131", "192.20.81.133",
     "192.20.81.134", "192.20.82.43", "192.20.82.45", "192.20.82.41", "192.20.79.152", "192.20.79.155",
     "192.20.79.154", "192.25.76.235", "192.25.76.234", "192.25.76.233", "192.25.76.232", "192.25.76.231",
     "192.25.76.228", "192.25.20.96", "192.25.20.95", "192.25.20.94", "192.25.20.93", "192.24.163.14",
     "192.24.163.21", "192.24.163.29", "192.24.163.6", "192.18.136.22", "192.18.136.23", "192.24.193.2",
     "192.24.193.19", "192.24.193.18", "192.24.193.11", "192.20.157.132", "192.20.157.133", "192.24.212.232",
     "192.24.212.231", "192.24.212.230"]
oids = [".1.3.6.1.4.1.2021.11.9.0",".1.3.6.1.4.1.2021.11.10.0",".1.3.6.1.4.1.2021.11.11.0",".1.3.6.1.4.1.2021.10.1.3.1",
    ".1.3.6.1.4.1.2021.10.1.3.2",".1.3.6.1.4.1.2021.10.1.3.3",".1.3.6.1.4.1.2021.4.6.0",".1.3.6.1.4.1.2021.4.14.0",
    ".1.3.6.1.4.1.2021.4.15.0"]
myq = Queue.Queue()
rq = Queue.Queue()

# host oid    
for host in hosts:
  for oid in oids:
    myq.put((host,oid))

def poll_one_host():
  while True:
    try:
      #           ,        
      host, oid = myq.get(block=False)
      session = netsnmp.Session(Version=2, DestHost=host, Community="cluster",Timeout=3000000,Retries=0)
      var_list = netsnmp.VarList()
      var_list.append(netsnmp.Varbind(oid))
      ret = session.get(var_list)
      rq.put((host, oid, ret, (time.time() - start_time)))
    except Queue.Empty:
      break

thread_arr = []

#     
num_thread = 50
for i in range(num_thread):
  t = threading.Thread(target=poll_one_host, kwargs={})
  t.setDaemon(True)
  t.start()
  thread_arr.append(t)

#        
for i in range(num_thread):
  thread_arr[i].join()

while True:
  try:
    info = rq.get(block=False)
    print info
  except Queue.Empty:
    print time.time() - start_time
    break
netsnmp 는 get 작업 을 지원 하 는 것 외 에 도 walk 작업 을 지원 합 니 다.즉,어떤 oid 를 옮 겨 다 니 는 것 입 니 다.
그러나 walk 를 사용 할 때 는 지연 등 문제 가 발생 하지 않도록 신중 해 야 하 며,구체 적 으로 는 기 존의 snmpwalk 지연 문제 분석 블 로 그 를 참조 할 수 있다.
pysnmp
pysnmp 는 python 으로 이 루어 진 snmp 프로 토 콜 의 라 이브 러 리 입 니 다.그 자신 은 비동기 에 대한 지 지 를 제공 했다.

import time
import Queue
from pysnmp.hlapi.asyncore import *
t = time.time()
myq = Queue.Queue()

#    。         
def cbFun(snmpEngine, sendRequestHandle, errorIndication, errorStatus, errorIndex, varBinds, cbCtx):
   myq.put((time.time()-t, varBinds))
hosts = ["192.20.150.109", "192.20.150.110", "192.20.150.111", "192.20.150.112", "192.20.150.113", "192.20.150.114",
     "192.20.150.115", "192.20.150.116", "192.20.150.117", "192.20.150.118", "192.20.150.119", "192.20.150.120",
     "192.20.150.121", "192.20.80.148", "192.20.80.149", "192.20.96.59", "192.20.82.14", "192.20.82.15",
     "192.20.82.17", "192.20.82.19", "192.20.82.12", "192.20.80.139", "192.20.80.137", "192.20.80.136",
     "192.20.80.134", "192.20.80.133", "192.20.80.131", "192.20.80.130", "192.20.81.141", "192.20.81.140",
     "192.20.82.26", "192.20.82.28", "192.20.82.23", "192.20.82.21", "192.20.80.128", "192.20.80.127",
     "192.20.80.122", "192.20.81.159", "192.20.80.121", "192.20.80.124", "192.20.81.151", "192.20.80.118",
     "192.20.80.119", "192.20.80.113", "192.20.80.112", "192.20.80.116", "192.20.80.115", "192.20.78.62",
     "192.20.81.124", "192.20.81.125", "192.20.81.122", "192.20.81.121", "192.20.82.33", "192.20.82.31",
     "192.20.82.32", "192.20.82.30", "192.20.81.128", "192.20.82.39", "192.20.82.37", "192.20.82.35",
     "192.20.81.130", "192.20.80.200", "192.20.81.136", "192.20.81.137", "192.20.81.131", "192.20.81.133",
     "192.20.81.134", "192.20.82.43", "192.20.82.45", "192.20.82.41", "192.20.79.152", "192.20.79.155",
     "192.20.79.154", "192.25.76.235", "192.25.76.234", "192.25.76.233", "192.25.76.232", "192.25.76.231",
     "192.25.76.228", "192.25.20.96", "192.25.20.95", "192.25.20.94", "192.25.20.93", "192.24.163.14",
     "192.24.163.21", "192.24.163.29", "192.24.163.6", "192.18.136.22", "192.18.136.23", "192.24.193.2",
     "192.24.193.19", "192.24.193.18", "192.24.193.11", "192.20.157.132", "192.20.157.133", "192.24.212.232",
     "192.24.212.231", "192.24.212.230"]

oids = [".1.3.6.1.4.1.2021.11.9.0",".1.3.6.1.4.1.2021.11.10.0",".1.3.6.1.4.1.2021.11.11.0",".1.3.6.1.4.1.2021.10.1.3.1",
    ".1.3.6.1.4.1.2021.10.1.3.2",".1.3.6.1.4.1.2021.10.1.3.3",".1.3.6.1.4.1.2021.4.6.0",".1.3.6.1.4.1.2021.4.14.0",
    ".1.3.6.1.4.1.2021.4.15.0"]
    
snmpEngine = SnmpEngine()

#    
for oid in oids:
  for h in hosts:
    getCmd(snmpEngine,
      CommunityData('cluster'),
      UdpTransportTarget((h, 161), timeout=3, retries=0,),
      ContextData(),
      ObjectType(ObjectIdentity(oid)),
      cbFun=cbFun)
time1 = time.time() - t

#      snmp
snmpEngine.transportDispatcher.runDispatcher()

#    
while True:
  try:
    info = myq.get(block=False)
    print info
  except Queue.Empty:
    print time1
    print time.time() - t
    break

pysnmp 자 체 는 가장 기본 적 인 get 과 getnext 명령 만 지원 하기 때문에 walk 를 사용 하려 면 스스로 이 루어 져 야 합 니 다.
성능 테스트
같은 환경 에서 이들 에 대해 성능 테스트 를 실시 했다.둘 은 198 개의 host,10 개의 oid 를 채집 합 니 다.
테스트 그룹
시간 소모(sec)
netsnmp(20 스 레 드)
6.252
netsnmp(50 라인)
3.269
netsnmp(200 스 레 드)
3.265
pysnmp
4.812
netsnmp 의 채집 속 도 는 스 레 드 수 와 관련 이 있 음 을 볼 수 있 습 니 다.스 레 드 수가 어느 정도 증가 하면 채집 시간 이 더 이상 짧 아 지지 않 습 니 다.스 레 드 를 개척 하 는 데 도 시간 이 걸 리 기 때문이다.기 존의 스 레 드 는 이미 충분히 처리 되 었 다.
pysnmp 성능 이 약간 떨 어 집 니 다.pysnmp 가 퀘 스 트 추가(getCmd 실행 시)에 약 1.2s 소모 되 었 고,이후 채집 에 약 3.3 초 소모 되 었 음 을 상세 하 게 분석 합 니 다.
oid 수 를 증가 시 켜 실험 을 진행 하고 있 습 니 다.host 는 여전히 198 개,oid 는 42 개 입 니 다.
테스트 그룹
시간 소모(sec)
netsnmp(20 스 레 드)
30.935
netsnmp(50 라인)
12.914
netsnmp(200 스 레 드)
4.044
pysnmp
11.043
격차 가 더 벌 어 지 는 모습 을 볼 수 있다.온라인 거리 가 충분 한 상황 에서 netsnmp 의 효율 은 pysnmp 보다 현저히 강하 다.
두 사람 모두 여러 개의 host 를 동시에 수집 할 수 있 기 때문에 사용 하기 쉬 운 측면 에서 netsnmp 는 더욱 간단 하고 netsnmp 는 walk 기능 을 지원 합 니 다.본문 은 netsnmp 를 더욱 추천 합 니 다.
넷 snmp 를 설치 하려 면 넷-snmp 를 설치 해 야 합 니 다.centos 라면 yum 을 사용 하 는 것 이 편리 하 다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기