我正在研究工作中的网络设备监控解决方案。 Prototype是使用PySNMP在Python上编写的,这种速度非常慢,并且在监控少量设备的情况下对CPU施加了很大的压力。所以我想到制作一些小型高性能SNMP轮询服务器来摆脱PySnmp并将程序分成两部分(数据提供者和数据分析器/决策者)。
Net-SNMP不是SNMPv3的好选择(不是线程安全的,不是完全异步的,因为同步的engineID发现,如果设备没有响应,这很慢)我不喜欢SNMP ++,所以我决定尝试用其他语言编写此服务器。 Java不是一个选项(没有JVM),所以最后它是Erlang或Haskell(我不知道它们两个......)。 Erlang确实有内置的SNMP支持,但我不需要进程/机器分发。
那么请您推荐哪种lang和snmp协议(管理器)实现更适合该任务? 要求:
答案 0 :(得分:3)
Erlang支持将OTP分发中的SNMP作为应用程序snmp
。这意味着它在企业环境中稳定,成熟并经过战斗测试。它supports:
SNMP开发工具包包含以下部分:
- 可扩展的多语言SNMP代理,了解SNMPv1 (RFC1157),SNMPv2c(RFC1901,1905,1906和1907),SNMPv3(RFC2271, 2272,2273,2274和2275),或这些协议的任何组合。
- 多语言SNMP管理器。
- MIB编译器,了解SMIv1 (RFC1155,1212和1215)和SMIv2(RFC1902,1903和1904)。
从语言的角度来看,Erlang是严格但动态类型的函数式语言,具有严格的评估和嵌入式并发(基于actor)和强大的可靠性支持。 (您可以将其视为用于编写可靠的集群服务的DSL。)Erlang编译为字节码或本机(但不如Haskell高效)并在自己的VM BEAM中运行。 Haskell是严格的静态类型函数,具有惰性求值,并且没有嵌入式对并发性和可靠性的支持,但模块中有解决方案。在我个人看来,Erlang是一种小得多的语言,对于那些来自命令式语言的人来说,它更容易学习。
Erlang通常不会因其速度而受到认可,但在实际应用中,Erlang优于Java,C ++或C#解决方案,尤其是在并发负载下。甚至有一个study比较真正的C ++应用程序与Erlang对应物。结果真的很令人惊讶。
我个人会选择Erlang ower Haskell。写作企业级解决方案有一个主要问题,OTP是必须的。在Erlang作为语言小而容易的地方,OTP要困难得多,但并发性和可靠性本身很难,而OTP实际上更容易实现。
正如上一篇评论所述,从Erlang到C或C ++总是有可能重写时间关键部分作为本机实现函数(NIF),与我以前为Perl或Python编写类似函数的经验相比,我发现它非常容易。 / p>
答案 1 :(得分:2)
作为一种脚本语言,我希望Python相当慢。
C或C ++应该尽可能高效。 C#或Java可能也不错。 Erlang应该是合理的。 GHC将Haskell编译为本机机器代码,因此它应该相当快。最后,这将归结为您最喜欢哪个库。
我不知道SNMP是什么或它做什么。但我找到了a Haskell library for SNMP。根据文档,一个简单的SNMP客户端可能看起来像这样:
import Network.Protocol.Snmp
import Control.Applicative
import Network.Socket.ByteString (recv, sendAll)
import Network.Socket hiding (recv, sendAll)
-- create new empty packet
v2 :: Packet
v2 = initial Version2
community = Community "hello"
oi = Coupla [1,3,6,1,2,1,1,4,0] Zero
-- set community, oid
packet :: Community -> Coupla -> Packet
packet community oi =
setCommunityP community . setSuite (Suite [oi]) $ v2
-- here must be code for create udp socket
makeSocket :: Hostname -> Port -> IO Socket
makeSocket = undefined
main :: IO ()
main = do
socket <- makeSocket "localhost" "161"
sendAll socket $ encode $ setRequest (GetRequest 1 0 0) packet
result <- decode <$> recv socket 1500 :: IO Packet
print $ getSuite result
如果你看起来不错,那就自己敲吧......