PC-PC間のUDP通信レイテンシをはかってみた

技術紹介

昨日のe7UDP/IPを使ったFPGA-PC間の通信レイテンシをはかってみたに引き続いて,PC同士の通信レイテンシをはかってみました.

注: あくまで,この数字は今回はかってみたという範囲での測定結果です.測定結果は十分に検証されてものではありませんので,ご容赦ください.

測定環境

測定環境として次のように2台のPCを対向で接続します.

pcpc_measure_test

それぞれのスペックは次の通りです.

  • Host PC
  CPU Core i7-3770K 3.50GHz
  メモリ 32GB
  OS CentOS 6.6 (Linux kernel 2.6.32)
  ネットワークI/F Intel 82572EI GbE
  コンパイラ gcc 4.4.7 
  • Server PC
  CPU Core i3-4130 3.40GHz
  メモリ 16GB
  OS Ubuntu 14.04.2 (Linux kernel 3.13.11)
  ネットワークI/F Intel 82572EI GbE
  コンパイラ gcc 4.8.2

もちろん,ちゃんとした測定をするのであれば環境はそろえるべきでしょうが,今回は手持ちの環境ということで…

測定用プログラム

Host PCでは「UDPパケットを送って受信する」プログラムを走らせます.これは,e7UDP/IPを使ったFPGA-PC間の通信レイテンシをはかってみたと同じものを使います.

Server PCでは「受信したパケットを送り返す」プログラムを走らせます.ソースコードは次のとおり.ペイロードの中身のコピーはもちろん確認すらせずに打ち返します.また受信サイズは,送り元にあわせた1024Byteに決めうちしてます.

udp_recv_send.c

#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <sys/time.h>

int main(int argc, char** argv)
{
  int sock;
  struct sockaddr_in addr;
  struct sockaddr_in dest;
  int addrlen = sizeof(dest);

  char b0[1024];

  addr.sin_family = AF_INET;
  addr.sin_port = htons(16385);
  addr.sin_addr.s_addr = INADDR_ANY;

  sock = socket(AF_INET, SOCK_DGRAM, 0);
  bind(sock, (struct sockaddr *)&addr, sizeof(addr));

  for(;;){
    recvfrom(sock, (void*)b0, sizeof(b0), 0, (struct sockaddr*)&dest, &addrlen);
    sendto(sock, (void*)b0, sizeof(b0), 0, (struct sockaddr *)&dest, sizeof(dest));
  }

  close(sock);

  return 0;
}

結果

測定結果です.Host PC側で送受信のたびにソケットのオープン/クローズをするか,ソケットは開きっぱなしものを再利用する(ソケットのオープン/クローズのコストを含まない)かの2パターンではかっています.また,「1回のレイテンシ」は10万回の送受信にかかった時間を10万で割った平均値です.

                   ソケットのオープン/クローズを含む場合    244μ秒
  ソケットのオープン/クローズを含まない場合    216μ秒 

間にスイッチを挟む

今度は,対向ではなくて間にスイッチを挟んでみます.

pcpc_measure_test2

たとえば,1つスイッチを挟むとこんな感じですね.

結果: スイッチを1段挟んだ場合

Host PC <-> FXG16IRM(PLANEX)<->Server PCという構成です.

                   ソケットのオープン/クローズを含む場合   303μ秒
  ソケットのオープン/クローズを含まない場合   271μ秒

 

結果: スイッチを2段挟んだ場合

Host PC <-> FXG16IRM(PLANEX)<->GS108(NETGEAR)<->Server PCという構成です.同じスイッチが用意できなかったのはご愛嬌ということで…

                    ソケットのオープン/クローズを含む場合   323μ秒
  ソケットのオープン/クローズを含まない場合   291μ秒

 

結果: スイッチを3段挟んだ場合

Host PC <-> FXG16IRM<->GS108(NETGEAR)<->DGS-3420-28TC(D-Link)<->Server PCという構成です.DGS-3420-28TCはGbEと10GbEのスイッチですが,GbEのポートだけを使います.

                    ソケットのオープン/クローズを含む場合   366μ秒
  ソケットのオープン/クローズを含まない場合   316μ秒 

結果: スイッチを4段挟んだ場合

さらにもう一段挟んでみます.

Server PC <-> FXG16IRM<->GS108(NETGEAR)<->DGS-3420-28TC(D-Link)<->LSW-GT-4W(BUFFARO)<->Host PCという構成です.

                    ソケットのオープン/クローズを含む場合   397μ秒
  ソケットのオープン/クローズを含まない場合   339μ秒

まとめとこれから?

今回測定した限りでは,PC-FPGA通信のレイテンシに比べるとPC-PCの通信レイテンシは100μ秒〜150μ秒程度の多いという結果になりました.

今後,ですが,ソフトウェアでパフォーマンスチューニングしたときにはどうなるか,というのはみてみたいですね.また,今回の測定ではFPGA側(e7UDP/IPコア)の制約に合わせて1KBのデータの送受信ペイロードを測定しています.これは,ソフトウェアに不利な測定方法であるという点を頭に置いておく必要はありそうです.たとえばペイロード32KBの対向での送受信レイテンシは1267μ秒でした.1KBの送受信レイテンシは216μ秒でしたが,1267 < 32 * 216 ですので,全然リニアではありませんね.

コメント

タイトルとURLをコピーしました