哪种语言和库更适合高性能网络设备轮询服务器(SNMP)?

Which language and lib is better suited for high-performant network devices polling server (SNMP)?

我正在研究网络设备监控解决方案。原型是使用 PySNMP 在 Python 上编写的,它非常慢并且压力 CPU 很多,并且要监视少量设备。所以我想到制作一些小型高性能 SNMP 轮询服务器来摆脱 PySnmp 并将程序一分为二(数据提供者和数据 analyser/decision 制造者)。

Net-SNMP 不是 SNMPv3 的好选择(不是线程安全的,由于同步 engineID 发现不是完全异步的,如果设备没有响应则速度很慢)而且我不喜欢 SNMP++,所以我决定尝试用其他语言编写此服务器。 Java 不是一个选项(没有 JVM),所以最后是 Erlang 或 Haskell(我不知道他们两个..)。 Erlang 确实有内置的 SNMP 支持,但我不需要 process/machine 分发。

那么您能否推荐哪种 lang 和 snmp 协议(管理器)实现更适合该任务? 要求:

作为一种脚本语言,我预计 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 

如果你觉得还可以,那就去把自己搞垮吧...

Erlang 在 OTP 分发中作为应用程序支持 SNMP snmp. It means it is stable, matured and battle tested in a corporate environment. It supports

The SNMP development toolkit contains the following parts:

  • An Extensible multi-lingual SNMP agent, which understands SNMPv1 (RFC1157), SNMPv2c (RFC1901, 1905, 1906 and 1907), SNMPv3 (RFC2271, 2272, 2273, 2274 and 2275), or any combination of these protocols.
  • A multi-lingual SNMP manager.
  • A MIB compiler, which understands SMIv1 (RFC1155, 1212, and 1215) and SMIv2 (RFC1902, 1903, and 1904).

从语言的角度来看,Erlang 是严格但动态类型的函数式语言,具有严格的评估和嵌入式并发性(基于角色)和强大的可靠性支持。 (您可以将其视为用于编写可靠的集群服务的 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 或 [编写类似函数的经验相比,我发现这非常容易=26=].