概況
用python獲取snmp信息有多個現成的庫可以使用,其中比較常用的是 netsnmp
和 pysnmp
兩個庫。網上有較多的關于兩個庫的例子。
本文重點在于如何并發的獲取snmp的數據,即同時獲取多臺機器的snmp信息。
netsnmp
python的netsnmp,其實是來自于net-snmp包。python通過一個c文件調用net-snmp的接口獲取數據。因此,在并發獲取多臺機器的時候,不能夠使用協程獲取。因為使用協程,在get數據的時候,協程會一直等待net-snmp接口返回數據,而不會像socket使用時那樣在等待數據時把CPU切換給其他協程使用。從這點上來說,使用協程和串行獲取沒有區別。
可以使用線程,多線程獲取(當然也可以使用多進程)。多個線程同時調用net-snmp的接口獲取數據,然后cpu在多個線程之間不停切換。當一個線程獲取一個結果后,可以繼續調用接口獲取下一個snmp數據。
經過測試,python3.6版本安裝對應到net-snmp-5.7.2版本可以正常工作。
pysnmp測試
pysnmp是用python實現的一套snmp協議的庫。其自身提供了對于異步的支持,直接安裝pysnmp包即可,
兩者性能測試
網上摘取測試比較數據如下:
在同一個環境下,對兩者進行了性能測試。兩者對198個host,10個oid進行采集。
可以看到netsnmp的采集速度跟線程數有關。當線程數增大到一定程度,采集時間不再縮短。因為開辟線程同樣會消耗時間。而已有的線程已經足夠處理。
pysnmp性能較之略差一下。詳細分析pysnmp在添加任務(執行getCmd時)消耗了約1.2s,之后的采集約消耗3.3秒。
在增加了oid數,在進行實驗。host仍然是198個,oid是42個。
實際測試數據
對于netsnmp,環境上運行測試,snmp get操作比較多,單個訪問在30多ms左右;walk操作時間比較長,訪問50個host,9個oid,啟用20個線程或者進程,對于多線程和多進程,時間沒有太大差別,都在80s-100s之間。再啟用更多都線程或者進程時間也不好縮短,由此可見,對于walk操作,時間大部分花費在異步等待上,多線程整體時間并沒有顯著改善,而且進程開銷更大,因此啟動20個線程輪詢snmp數據;