2017-09-26 136 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