2017-09-26 132 views
-1

我尝试通过在单个服务器进程中传输和路由它们来尝试在多个客户端(进程)之间本地移动数据。这个传输是通过localhost:8080上的websockets完成的。服务器和客户端都是用python实现的;客户端是python websocket-client库的简单版本,服务器是tornado.web.Application对象。 现在,当从客户端1 - >服务器 - >客户端2传输数据包(大小约20-100字节)时,我在不同的平台上看到不同的速度: 1.亚马逊AWS:给我一个约0.7毫秒的时间延迟。 2. Raspberry Pi:给我一个4.5msec的时间延迟。树莓中的网络端口传输速度很慢

如果客户端在顶部使用任何排队(collections.deque库),则延迟在RPi中有时超过100毫秒,尽管在AWS中它保持在7.5毫秒内。 我知道本地IP地址套接字必须作为文件描述符保存在易失性内存中,并且增加不同头文件和websocket相关参数的网络开销,会增加数据包处理期间的延迟。 我的猜测是,在RPi上的RAM读写速度比AWS小。我通过在每个平台上运行'dd'来确认这一点,以传输1k大小的块。 RPi不会超过95Mb /秒,而AWS很容易超过900Mb /秒。我想,RPi通过串行接口连接到SD卡。但是,亚马逊必须比他们的EC2虚拟机做得更好。

这里我的问题是这个怀疑是否属实?这两种平台之间的性能差异可能是RAM存取速度的唯一原因吗?

注:我很抱歉,但我不想粘贴我的代码的一部分,除非有一个可怕的原因/需要它。感谢你的理解。

+0

我相当怀疑人能回答这样一个理论性的问题,没有看到相关的代码。 Raspberry PI在你所有的传输级别上都比AWS服务器强大得多。很有可能,你会看到Raspberry Pi上很多链条部分的积累比较慢。 95Mbps的声音听起来像普通SD卡的普通访问速度一样(尽管如果控制器可以更快地购买更快的卡,则可以购买更快的卡)。 – jfriend00

回答

0

颇经过一番研究,我能找出一些细节正在促进这些延迟:

  1. 消息的传送(客户端 - >服务器或服务器 - >客户端)是的WebSocket传输。因此,需要在每个数据包的顶部添加整个IP堆栈。该数据包存储在Raspberry的内存中(与AWS VM相比,它具有低得多的读/写速度)。
    • 在两台机器上运行一个简单的'dd'命令显示不同。
    • 通过增加数据包的有效负载(触发网络碎片)并关闭'setsockopt'中的TCP的Nagle算法(TCP_SETNODELAY),可以使效果更明显。
  2. 如果我转移到不同进程的线程之间的同步消息传输并在AWS和Raspberry上进行比较,我看到了类似的延迟。

例子:

Write speed on AWS: 
$ dd if=/dev/zero of=test bs=1048576 count=200 
200+0 records in 
200+0 records out 
209715200 bytes (210 MB, 200 MiB) copied, 0.301986 s, 694 MB/s 

Write speed on Raspberry: 
# dd if=/dev/zero of=test bs=1048576 count=200 
200+0 records in 
200+0 records out 
209715200 bytes (210 MB) copied, 23.9886 s, 8.7 MB/s