周报(1)

上周遗留下来的一个问题就是广播信息在客户端接收有延迟(秒),然后就是寻找解决方案。这周的工作分为三个部分,前两个部分属于尝试(之后发现不合适),主要还是在第三个部分:

  1. The Spread Toolkit: 高性能的分布式分组消息系统,提供高性能的可靠多播。
  2. filemq: 基于zeromq中发布-订阅模型的一个数据分发(同步)服务。
  3. openpgm: 也就是之前用的那个可靠多播协议,但是之前没有仔细看,忽略了一些重要的配置参数。

首先是Spread Toolkit,这个工具集主打的功能是分布式、可扩展、高可靠性,可应用于复杂网络的分组通信,也就是多个服务器多个客户端的情况,每个机器都要运行一个守护进程。之所以觉得不合适一是因为它整体比较臃肿、复杂,二是因为它单个消息包大小有限制,本身没有对大块数据的传输做支持。

然后是filemq,相比上一个,这个就简单多了,它就是实现了一个简易的Dropbox:多台机器组成一个分组,每台机器维护一个文件夹,文件夹的任何变化都会同步到该分组的各个文件夹,此外它还加入了账号、密码、多个分组的支持。之所以觉得不合适一是因为它跟需求不是很符合,二是因为它是建立在zeromq基础上的(zeromq本身封装的程度已经挺高了),很多细节都隐藏了。

说回之前的可靠多播协议PGM,上次发现延迟有数秒,是因为它默认的数据传输率为100 kbps,只要将传输率这个参数配置得够大就行了(发现这个值改太大了也不行,会收不到包),当然发送跟接收的传输率最好一致。

Further, PGM sockets are rate limited by default and incur a performance penalty when used over a loop-back interface. For details, refer to the ZMQ_RATE, ZMQ_RECOVERY_IVL and ZMQ_MCAST_LOOP options documented in zmq_setsockopt(3).

那么问题来了,这个数据传输率的设置是不是需要考虑发送接收的buffer大小(我把它们都设置成了1MB),还有断线重连、阻塞非阻塞(non-blocking)之类的问题。这里是socket可以设置的参数:http://api.zeromq.org/2-1:zmq-setsockopt

然后这周还看了这篇论文:A reliable multicast transport protocol for information-centric networks,比较了PSI (Publish/Subscribe Internet) 下几个可靠传输协议的优劣,其实跟我们的需求挺符合的,相比文章中的RMTPSI,目前的解决方案来说更简单粗暴一点。

最后是测试的log:

/**
 * The size of the test file for Multicast is 581 KB.
 * Time format: min:sec.msec
 * [Sender Option]: Buffer size is 1 MB. Send rate is 8000 kbps.
 * [Receiver Option]: Buffer size is 1 MB. Receiv rate is 8000 kbps.
 * For more details, see: http://api.zeromq.org/2-1:zmq-setsockopt
 */
NO: #1
Time: 26:14.741
NO: #2
Time: 26:14.748
NO: #3
Time: 26:14.755
NO: #4
Time: 26:14.773
NO: #5
Time: 26:14.777
NO: #6
Time: 26:14.781
NO: #7
Time: 26:14.785
NO: #8
Time: 26:14.789
NO: #9
Time: 26:14.793
NO: #10
Time: 26:14.798
NO: #11
Time: 26:14.802
NO: #12
Time: 26:15.018
NO: #13
Time: 26:15.636
NO: #14
Time: 26:16.253
NO: #15
Time: 26:16.877
NO: #16
Time: 26:17.488
NO: #17
Time: 26:18.107
NO: #18
Time: 26:18.725
NO: #19
Time: 26:19.366
NO: #20
Time: 26:19.959
NO: #21
Time: 26:20.579
NO: #22
Time: 26:21.196
NO: #23
Time: 26:21.815
NO: #24
Time: 26:22.432
NO: #25
Time: 26:23.050
NO: #26
Time: 26:23.667
NO: #27
Time: 26:24.302
NO: #28
Time: 26:24.903
NO: #29
Time: 26:25.523
NO: #30
Time: 26:26.144
NO: #31
Time: 26:26.759
NO: #32
Time: 26:27.375
NO: #33
Time: 26:27.994
NO: #34
Time: 26:28.627
NO: #35
Time: 26:29.229
NO: #36
Time: 26:29.847
NO: #37
Time: 26:30.466
NO: #38
Time: 26:31.094
NO: #39
Time: 26:31.701
NO: #40
Time: 26:32.327
NO: #41
Time: 26:32.937
NO: #42
Time: 26:33.568
NO: #43
Time: 26:34.173
NO: #44
Time: 26:34.789
NO: #45
Time: 26:35.408
NO: #46
Time: 26:36.035
NO: #47
Time: 26:36.644
NO: #48
Time: 26:37.262
NO: #49
Time: 26:37.885
NO: #50
Time: 26:38.497