我正在利用多线程在C14中实现性能重的双方协议,目前我正在使用ZeroMQ作为网络层.
该应用程序具有以下简单架构:
>一个主要服务器角色,
>一个主要的客户角色,
>服务器和客户端都生成固定数量的线程
>所有n个并行并发线程对执行一些性能和通信重大但相互独立的协议交换,即它们以n个固定对运行,并且不应该与成对固定对手混合/交换任何数据.
我当前的设计在服务器和客户端上使用单个ZeroMQ Context() – 实例,在所有n个本地线程之间共享,并且每个相应的客户端/服务器线程对创建一个ZMQ_PAIR套接字(我只是递增端口#)本地,共享,沟通的背景.
我的问题
有更智能或更有效的方法吗?
即:使用路由器和经销商可以自然地提高性能吗?
我没有太多的套接字编程经验,而且我的方法是套接字的数量直接与n(许多客户端 – 服务器线程对)成比例.这可能会成千上万,我不确定这是否是一个问题.
我控制了服务器和客户端机器以及源代码,我没有外部限制,我需要担心.我关心的只是表现.
我已经查看了所有模式here,但我找不到任何符合客户端 – 服务器对修复的情况的人,即我不能使用负载平衡等.
最佳答案 快乐的人!
ZeroMQ是一个可爱而强大的工具,适用于高度可扩展,低开销,正式通信(行为,是模仿某些同行的相互行为“One Ask,其他回复”等)模式.
您的模式非常简单,行为不受限制,ZMQ_PAIR可能很适合这种情况.
性能
关于这个属性的定量性质应该有更多的细节.
>进程间处理延迟[us]
>被测系统(SuT)架构的内存占用[MB]
> SuT可以处理的峰值数据流量[MB / s]
性能提示(如果观察到的性能数据定量支持)
>可以通过在实例化时增加Context(nIOthreads)来提高I / O性能
>可以通过硬映射单个线程来微调I / O性能# – > Context.IO-thread#,它对分布式工作负载都很有帮助,并且允许一个人保持“独立”的本地主机IOthread,以便为更高优先级的信令和其他此类需求做好准备.
>应为特定类型的流量设置特定于应用程序的ToS标记,以便允许在网络层上与客户端和服务器之间的路径段一起进行高级处理
>如果内存占用受到伤害(ZeroMQ不是在操作系统内核级别的TCP协议处理上进行零拷贝),可以尝试转移到ZeroMQ的妹妹 – 由ZeroMQ的共同父亲Martin SUSTRIK撰写 – – 符合POSIX标准的nanomsg,具有相似的动力和吸引人的性能数字.值得了解,至少.
ROUTER或DEALER可以提高整体表现吗?
不,不能.考虑到您声明的架构(声称通信繁重),其他更复杂的可扩展形式通信模式行为,以满足其他一些需求,不会增加任何性能优势,但相反,如果不交付,将花费您额外的处理开销任何合理的改进.
虽然您的正式沟通仍然是定义的,但不需要额外的花里胡哨.
在ZMQ_PAIR原型上可能会注意到一点,一些消息来源称这是一个实验原型.如果你的直觉感觉不能让你,除了SuT测试观察,很高兴与此相关,不要介意轻微的重新设计步骤,这将让你拥有未经预先规定的正式沟通模式行为的所有自由,虽然在引擎盖下有“非”实验管道 – 只需用一对ZMQ_PUSH ZMQ_PULL替换独奏ZMQ_PAIR,并使用只有单程票证的消息.拥有完整的SuT设计和实施控制权,这一切都在您的能力范围内.
我有多快走?
针对无流量路由段中的未加载网络传输,ZeroMQ或nanomsg性能/延迟包络发布了一些基准测试记录(当然).
如果您的SuT设计力求更快 – 比如端到端大约800 ns,还有其他方法可以实现这一目标,但您的设计必须遵循其他分布式计算策略,而不是基于消息的数据交换和您的项目预算必须针对必要的超低延迟硬件基础架构的额外支出进行调整.
它可能会令人惊讶,但绝对可行且对系统非常有吸引力,其中数百纳秒是托管数据中心内必备的目标.