我正在研究网络设备监控解决方案。Prototype是用PySNMP编写的,它速度非常慢,对CPU的压力很大,监控的设备数量不多。因此,我想制作一些小型的高性能SNMP轮询服务器,以摆脱PySnmp,将程序分成两部分(数据提供者和数据分析器/决策者)。
Net对SNMPv3来说不是一个好的选择(由于同步engineID发现(如果设备没有响应,这是缓慢的)而不是线程安全,也不是完全异步),而且我不喜欢SNMP++,所以我决定尝试在其他语言上编写这个服务器。Java不是一个选项(没有JVM),所以最终是Erlang或Haskell (我不知道这两个..)。Erlang确实有内置SNMP支持,但我不需要进程/机器分发。
那么,请您推荐哪个lang和snmp协议(管理器)实现更适合这项任务?要求:
发布于 2015-06-17 15:42:54
Erlang支持OTP发行版中的SNMP作为应用程序snmp。这意味着它是稳定的,成熟的,并在企业环境中经受考验。It 支座
SNMP开发工具包包含以下部分:
从语言的角度看,Erlang是一种严格的、动态类型的功能语言,具有严格的评估和嵌入式并发(基于参与者)和强大的可靠性支持。(您可以考虑使用DSL来编写可靠的集群服务。)Erlang编译为字节码或本机(但不像Haskell那样高效)并在自己的VM波束中运行。Haskell是一种严格的静态函数,具有惰性评估功能,不支持并发性和可靠性,但模块中有一些解决方案。在我个人看来,Erlang是一种小得多的语言,对于那些使用祈使语的人来说,学习起来更简单。
Erlang的速度常常不为人们所认可,但在实际应用中,Erlang的性能优于Java、C++或C#解决方案,特别是在并发负载下。甚至还有一个学习将实际的C++应用程序与Erlang应用程序进行比较。结果真是令人惊讶。
我个人会选择Erlang ower Haskell。有一个主要的问题,要编写公司级别的解决方案,OTP是必须的。当Erlang作为一种语言很小很容易的时候,OTP就更难了,但是并发性和可靠性本身就很难,OTP实际上使它变得更容易了。
最后一点,始终有可能将时间关键部分从Erlang重写为C或C++,作为本机实现函数(NIF),我发现与以前为Perl或Python编写类似函数的经验相比,它非常容易。
发布于 2015-06-17 08:11:27
作为一种脚本语言,我希望Python会相当慢。
C或C++应该是尽可能多的表演性。C#或Java可能还不错。二郎应该是合理的。GHC将Haskell编译成本机代码,因此它应该相当快。最后,这将归结到你最喜欢哪个库的外观。
我不知道SNMP是什么,也不知道它做什么。但我找到了用于SNMP的Haskell库。根据文档,一个简单的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 如果你觉得没问题,去自便吧.
https://stackoverflow.com/questions/30884995
复制相似问题