覆盆子中的websockets转移非常慢

时间:2017-09-26 09:04:46

标签: python-3.x amazon-web-services websocket raspberry-pi3

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

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

我的问题是这种怀疑是否属实? RAM访问速度是否可以单独负责两个平台之间的性能差异。

注意:很抱歉,我不想在此处粘贴部分代码,除非有可靠的原因/需要。谢谢你的理解。

1 个答案:

答案 0 :(得分:0)

经过一番研究后,我能够找到导致这些延迟的一些细节:

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

    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