python 동시 다발 snmp 정보 및 성능 테스트
python 으로 snmp 정 보 를 얻 으 면 여러 개의 기 존 라 이브 러 리 를 사용 할 수 있 습 니 다.그 중에서 자주 사용 되 는 것 은
netsnmp
과pysnmp
두 개의 라 이브 러 리 입 니 다.인터넷 에는 두 개의 라 이브 러 리 에 관 한 예 가 비교적 많다.본 고 는 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 을 사용 하 는 것 이 편리 하 다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
로마 숫자를 정수로 또는 그 반대로 변환그 중 하나는 로마 숫자를 정수로 변환하는 함수를 만드는 것이었고 두 번째는 그 반대를 수행하는 함수를 만드는 것이었습니다. 문자만 포함합니다'I', 'V', 'X', 'L', 'C', 'D', 'M' ; 문자열이 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.