超高速なパケットI/Oフレームワーク netmap について

の続きで,最近論文読んだやつのプロジェクトの紹介です.

概要

今の汎用OSは高速なパケットI/Oを考慮してない.
20年前のAPIをそのまま使っている.
ネットワークがどんどん高速になっているので,NICとかOSカーネルのパケット処理がボトルネックになってる. (http://news.mynavi.jp/news/2013/04/04/094/index.html)

こういうの解決するために既存手法がいろいろある.

netmapはその試みのひとつ.

  • ユーザプロセス-NIC間の効率のよいパケットI/Oフレームワーク
  • 汎用的な10Gbps環境で14.88Mppsものスループット
  • 60-65 クロックサイクルでwire - userspace間のデータ移動
  • 標準的なデバイスドライバと比較して10-20倍の性能向上
  • FreeBSDにはもう取り込まれている ([base] Revision 227614)

Usenix ATC'12でベストアワード,SIGCOMM 2011でベストアワードを受賞してるらしい.やばそう.

アーキテクチャ

f:id:y_uuki:20130803161153p:plain

netmapは既存の性能向上手法をいくつか使っている.
NICのパケットバッファの(mmapとかで)メモリマッピング,I/Oバッチング,NICのリングキューとマッチするような送信・受信キューのモデリングなど.

既存のものとは違うのはnatmapを使うユーザプロセスのアプリケーションがOSをクラッシュさせることができないようになっていること.
natmapのクライアントはユーザ空間で動作するため,デバイスレジスタやカーネルメモリポインタにダイレクトアクセスできない.

プログラミングモデルは固定長バッファのリングキューを扱うだけなので非常に単純で,アプリケーションは標準的なシステムコールしか使わない.
(ノンブロッキングioctl()でNICと同期,poll()可能なファイルディスクリプタ)

パフォーマンス

f:id:y_uuki:20130803161216p:plain

netmapはCPUのクロックレートが1GHz以下で10Gbpsの上限に達してる.
pktgen(Linuxのカーネルで動作するパケットジェネレータ)やnetsend(UDPを使ったユーザランドで動作するパケットジェネレータ)よりもかなり高いスループットがでてる.

インタフェース

サンプルコードが書いてあった.
/dev/netmapで開いたディスクリプタに対してioctl()とmmap()でリングキューやバッファのメモリ領域を取得して,NETMAP_xxxなインタフェースでリングに対する操作とバッファの中身を読めるイメージ.

重要なのは,1パケットごとにpollとかするんじゃなくて,リングの複数スロットにまとめて1回のシステムコールを発行するところ.
これにより,パケット単位のシステムコールのオーバヘッドを削減できる.

struct netmap_if *nifp;
struct nmreq req;
int i, len;
char *buf;

fd = open("/dev/netmap", 0);
strcpy(req.nr_name, "ix0"); // register the interface
ioctl(fd, NIOCREG, &req); // offset of the structure
mem = mmap(NULL, req.nr_memsize, PROT_READ|PROT_WRITE, 0, fd, 0);
nifp = NETMAP_IF(mem, req.nr_offset);
for (;;) {
    struct pollfd x[1];
    struct netmap_ring *ring = NETMAP_RX_RING(nifp, 0);

    x[0].fd = fd;
    x[0].events = POLLIN;
    poll(x, 1, 1000);
    for ( ; ring->avail > 0 ; ring->avail--) {
        i = ring->cur;
        buf = NETMAP_BUF(ring, i);
        use_data(buf, ring->slot[i].len);
        ring->cur = NETMAP_NEXT(ring, i);
    }
}

ソースコード

システムコール(ioctl,select/poll)に対するパッチとNICドライバのパッチを除いて,現行バージョンは約2000行程度らしい.
さらに,各デバイスドライバのパッチはそれぞれ500行程度で, デバイスドライバの変更を最小にするために機能のほとんどが各ドライバで共通したコードで実装されている.

デバイスドライバパッチのソースをちょっと読んでみた感じだと,リングキューの初期化処理と同期処理(netmap自前のリングとNIC自体のリング)を書けばよいだけみたいだった. 同期処理はちょっと書くのめんどくさそうだった.

資料

あんまり咀嚼して書けてない.

感想

正直,アーキテクチャについてはよくわからない部分が結構あったけど,サンプルコードみたらだいたいイメージ湧いてきた. もうちょっと既存研究あたったほうがよさそう.

netmapで遊ぼうとおもったけど,持ってるNICがMellanox製で,netmap対応ドライバがまだないからつらい. 自分でドライバパッチ書けってことか…

TCP 3-way handshakeのレイテンシ軽減のためのTCP_DEFER_ACCEPTソケットオプション

2013/10/22 追記した.

Starletのコード読んでてlistening socketにTCP_DEFER_ACCEPTとかいうオプション渡してたので、これ何だって思って調べた.
TCPに特に詳しいわけではないので理解に誤りがあるかもしれない.

package Starlet::Server;
...
    # set defer accept
    if ($^O eq 'linux') {
        setsockopt($self->{listen_sock}, IPPROTO_TCP, 9, 1) # 9がTCP_DEFER_ACCEPTを表す
            and $self->{_using_defer_accept} = 1;
    }
...

TCP_DEFER_ACCEPTはLinux 2.4から導入されている.
Linux 2.6.32から挙動が若干変わっているらしい. (linux の TCP_DEFER_ACCEPT (サーバサイド) の挙動について - kazuhoのメモ置き場)
ApacheとかNginxでも使われてるっぽい.

TCP_DEFER_ACCEPTを理解するのに下記の記事が参考になった.
Take advantage of TCP/IP options to optimize data transmission - TechRepublic

TCP_DEFER_ACCEPTが導入された動機

HTTPリクエストに必要なデータサイズは小さいため,HTTPリクエストは1個のパケット(DATAパケット)に収まる.
本当に必要なパケット(DATAパケット)は1個なのにTCPの3-way handshakeをやらないといけなくて,HTTPリクエストを受信するまでに必要なパケット数が4個になる.

これらの4個のパケットのせいで余分な遅延やオーバヘッドが発生してしまう.
例えば,3-way handshakeのfinal ACKがパケットロスしたときに,サーバはESTABLISHED stateに移行しない.
ESTABLISHEDになってないと,final ACKの次に送信されたDATAパケットがサーバ到着後にdropされたりする.
この場合は,サーバがSYS/ACKを再送してクライアントのACKを待つことになる.

TCP_DEFER_ACCEPTの挙動

listening socketかconnected socket(つまりサーバサイドかクライアントサイド)のどちらにTCP_DEFER_ACCEPTオプションをつけるかで挙動が変わる.

listening socketの場合は,final ACKを待たずに,DATAパケットを受信するまで,accept(2)をブロックする. (普通はfinal ACKを受信した時点でacceptは処理をユーザプロセスに戻す)
これにより,final ACKがパケットロスしても,DATAパケットさえ受信すればaccept(2)は成功する.
したがって,DATAパケットのロスが無ければSYN/ACKの再送を回避できる.

connected socketの場合は,サーバからSYN/ACKを受信した後すぐにACKを返さずに,ユーザプロセスがwriteを発行した時点でDATAパケットとACKを一緒にして返す.
これにより,やりとりするパケットを1個減らせる.

上記の挙動からわかるように,TCP_DEFER_ACCEPTの使用はクライアントがACKの送信後にすぐにデータを送信する,つまりクライアントから喋り始めるプロトコルであることが前提となっている.

雑感

SYN/ACKの再送問題を回避したい(他にもあるかもしれない)っていうTCP_DEFER_ACCEPTの目的がすぐに理解できなかった.
acceptをブロックするとか動作の内容は書いてあるけど,何のためにそんなことをするのかを直接的に説明した文章が見つからなくてつらい感じだった.

参考

追記

Starletの作者であるkazuhoさんやkazeburoさんからコメントいただきました.

CentOS 5.9でNICを2枚挿したときのネットワーク設定

10GbpsNIC環境でOSのネットワークスタックのパフォーマンスを測定しようとしたら意外と面倒だった.厳密には,面倒だったのはCentOS 6系での設定で結局あきらめた. 仕方がないからCentOS 5.9でやるとそれほどハマらずに設定できた.

2台のマシンがあり,オンボードNICと10GbpsNICが載っている.このとき,

  • 10GbpsNIC同士を直接10Gbps Eternetで接続する.
  • オンボードNICはゲートウェイを通してインターネットに接続できるようにする.

というのが課題.

これに対して以下の図のようなネットワーク構成にしたらちゃんと通信できた.

f:id:y_uuki:20130422021415p:plain

設定

大雑把な設定内容を以下のような感じ.

  • オンボードNIC周りと10GbpsNIC周りを異なるサブネットに置く.
  • インターネットに接続するために192.168.1.1をデフォルトゲートウェイとする.
  • 10.0.0.1を10.0.0.0/8サブネットをゲートウェイとする.
  • eth1に入ってきたパケットはeth1に出て行くようにルーティングする.

まず,eth0やeth1に対するIPアドレスなどの設定を/etc/sysconfig/network-scripts/ifcfg-eth*に書く.

以下,Host1のみだけどHost2においてもIPADDRとHWADDR以外は同様.

  • /sbin/sysconfig/ifcfg-eth0
DEVICE=eth0
BOOTPROTO=static
BROADCAST=192.168.1.255
HWADDR=xx:xx:xx:xx:xx:xx
IPADDR=192.168.1.10
NETMASK=255.255.255.0
NETWORK=192.168.1.0
ONBOOT=yes
  • /sbin/sysconfig/ifcfg-eth1
DEVICE=eth1
BOOTPROTO=static
BROADCAST=10.255.255.255
HWADDR=yy:yy:yy:yy:yy:yy
IPADDR=10.0.0.100
NETMASK=255.0.0.0
NETWORK=10.0.0.0
ONBOOT=yes
GATEWAY=10.0.0.1

設定を有効にするためにnetworkを再起動.

# service network restart

しかし,ここでeth0経由でインターネットにつなげないという問題が発生した. routeコマンドでみるとデフォルトゲートウェイの設定がおかしかった(どうおかしかったかはメモってなくて忘れた)ので,/sbin/sysconfig/networkのGATEWAYDEVにデフォルトゲートウェイに対してパケットを送受信したいインタフェース名を書く.

GATEWAYDEV=eth0

networkを再起動すると,ipコマンドの出力は以下のようになり,eth0経由でインターネットに接続できた. これをHost1,Host2の両方で設定する.

host1% /sbin/ip -v
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.0.0     *               255.255.252.0   U     0      0        0 eth0
169.254.0.0     *               255.255.0.0     U     0      0        0 eth1
10.0.0.0        *               255.0.0.0       U     0      0        0 eth1
default         192.168.1.1     0.0.0.0         UG    0      0        0 eth0

次は,eth1側の方で,NICが複数あるとパケットを受信したときにそのパケットに対してどのインタフェースから送信するかをルーティングする必要がある.

今回の場合,eth1で受信したパケットはそのままeth1で返せば良い. 受信パケットに対するルーティングはiproute2で行う.

古来のrouteコマンドですと、宛先に応じてNICのデバイスやnext hop routerの指定を行いますが、Linuxではこのテーブルを複数持つことができ、さまざまな条件でどのテーブルを参照させるかを指定することができます。

「さまざまな条件」とは、例えば

  • 送信元IPアドレス
  • パケットが入ってきたデバイス名
  • fwmark といったものです。

同じサブネットへのNIC 2枚指し、またはソースルーティングのおはなし - (ひ)メモ

Host1を例にとり,まず10GbpsNIC通信用のテーブルexpを作成する.(新規に作成しなくても既存のmainテーブルにルールを追加すればよいだけな気がする) このテーブルはパケットの送信時に参照され,送信元IPアドレスが10.0.0.100であれば,eth1にパケットを送るという意味である.

  • /sbin/sysconfig/network-scripts/route-eth2
dev eth1 src 10.0.0.100 table exp

次に,上記テーブルを参照する条件をrule-eth2に書く. 参照条件として送信元IPアドレスが10.0.0.100であればexpテーブルを見るというように設定する.

  • /sbin/sysconfig/network-scripts/rule-eth2
from 10.0.0.100 table exp prio 200 

networkを再起動して設定を有効にするとpingは通るようになった.

host1% service network restart
host1% ping -I eth1 10.0.0.200

しかし,TCP/UDPのベンチマークツールであるiperfで通信すると,

host1% iperf -s -B 10.0.0.100
host2% iperf -c 10.0.0.100

No route to hostと怒られる.

tcpdumpでみてみると到達不能ICMPパケットが返ってきてるっぽい.

16:46:08.071054 IP 10.0.0.200.51674 > 10.0.0.100.ndmp: S 2955619377:2955619377(0) win 5840 <mss 1460,sackOK,timestamp 23138650 0,nop,wscale 7>
16:43:56.564510 IP 10.0.0.100 > 10.0.0.200: ICMP host 10.0.0.100 unreachable - admin prohibited, length 68

hidekiy blog: [linux] ping は通るのに No route to host と言われる

この辺はSELinuxとiptablesが邪魔をしている可能性があるので,あんまりよくないけどSELinuxとiptablesを切る.

SELinuxを切る.

# sestatus
# setenforce 0

SELinuxを無効化する | Smart -Web Magazine

iptablesを切る

# service iptables off

ここまでやって,10GbpsNIC間で問題なく通信できるようになった.

参考

途中要らない設定が入ってそう. ネットワーク難しい.

研究室のサーバに流行りのGrowthForecastを導入してみた

GrowthForecast - Lightning fast Graphing / Visualization

研究室で各サーバと部屋の温度をグラフ化して,値が異常ならメールで通知しろみたいなタスクが降ってきた.
もともと各サーバの統計値をMuninでグラフ化していたけれど,VMware VSphereが入ってる物理サーバの温度とれるようなプラグインないし,自分で書かないといけない感じになったり,Muninの設定とか調べるのだるい感じになってきたから,最近コード眺めてたGrowthForecastを使ってグラフ化しようと思った.

lm-sensorsやVsphereのAPI叩いて温度を取得し,GrowthForecastのAPIにPOSTする感じのスクリプトを作成して,各ノードからcronで定期実行すればできそう.

OSはUbuntu 12.04. curlをインストールしておく.

実行ユーザ作成

まずは,最低限の実行権限だけもたせた実行ユーザ growthforecastを作成する.

$ sudo groupadd growthforecast
$ sudo useradd -g growthforecast -d /home/growthforecast -s /sbin/nologin -m growthforecast

GrowthForecastインストール

$ sudo apt-get build-dep rrdtool
$ sudo -u growthforecast curl -kL http://install.perlbrew.pl | sudo -u growthforecast bash
$ sudo -u growthforecast /home/growthforecast/perl5/perlbrew/bin/perlbrew --notest install perl-5.14.3
$ sudo -u growthforecast /home/growthforecast/perl5/perlbrew/bin/perlbrew switch perl-5.14.3
$ curl -L http://cpanmin.us/ | perl - App::cpanminus
$ cpanm -n GrowthForecast
$ exit

daemontoolsで監視

Ggrowthforecast.plはWebサーバとWorkerを子プロセスとして起動するが,そのへんは良い感じに監視してくれるらしいので,親プロセスだけdaemontoolsで監視する. Proclet という supervisor モジュール書いてリリースした - blog.nomadscafe.jp

daemontoolsで起動するスクリプトを作成

$ cd /home/growthforecast
$ sudo -u growthforecast curl https://gist.github.com/y-uuki/4957550#file-growthforecast-run-sh > run.sh
$ sudo -u growthforecast curl https://gist.github.com/y-uuki/4957550#file-growthforecast-log-run-sh > log.run.sh
$ sudo -u growthforecast chmod +x run.sh log.run.sh

今回は以下のようなスクリプトを作成した.

$ sudo mkdir -p /etc/service/growthforecast
$ sudo chown growthforecast:growthforecast /etc/service/growthforecast
$ sudo -u growthforecast ln -s /home/growthforecast/run.sh /etc/service/growthforecast/run
$ sudo -u growthforecast mkdir -p /etc/service/growthforecast/log/main
$ sudo -u growthforecast ln -s /home/growthforecast/log.run.sh /etc/service/growthforecast/log/run

$ sudo apt-get install daemontools daemontools-run svtools
$ sudo reboot
$ sudo svc -u /etc/service/growthforecast

デーモンの起動・停止

$ sudo svc -u /etc/service/growthforecast # UP
$ sudo svc -d /etc/service/growthforecast  # DOWN

logをみる

$ tail -F /etc/service/growthforecast/log/main/current

log/main/currentが作成されていないかつlog/superviseが存在しない場合,svscanがlogディレクトリを検出していないので再起動すればよい.

感想

GrowthForecastはCPANモジュールになっているので,導入が簡単.
daemontools、まともに使ったことなかったけど,便利そう.
温度取得してGrowthForecastに投げるスクリプトはまた今度.

参考

Linuxカーネルにおけるネットワークスタック周りのChangeLog勉強メモ (2.6.0 ~ 2.6.20)

最近,OSのネットワークスタックに興味があって,Linuxカーネルのネットワークスタック実装の変遷について調べてみた.
変更内容の粒度は割りと適当.

TCPとかFireWallとかNIC周りは興味があるのでだいたい書いてる.
Wireless系は興味ないので全部削ってる.

ネットワークスタック周りだけでもかなり量が多かったので,とりあえず2.6.0から2.6.20までをまとめた.

Linux 2.6.x

2.6.5 (2004/04/04)

http://kernelnewbies.org/Linux_2_6_5

  • Netpoll infrastructure

Netpollが導入された.
Netpollは,I/Oシステムとネットワークシステムが完全には利用できないみたいな不安定な環境でカーネルがパケットを送受信できる仕組みのこと.受信したパケットがnetpoll宛かどうかをTCP/IPのヘッダレベルでNICが判定し,カーネルの受信キューにパケットを積む前にNICが受信処理を行う.
組み込みデバイス環境で使ったりするらしい.
(see http://www.spa.is.uec.ac.jp/research/2006/hama/main.pdf)

2.6.6 (2004/05/10)

http://www.kernel.org/pub/linux/kernel/v2.6/ChangeLog-2.6.6

  • Network packet timestamping optimization

  • Binary Increase Control (BIC) TCP developed by NCSU. It is yet another TCP congestion control algorithm for handling big fat pipes. For normal size congestion windows it behaves the same as existing TCP Reno, but when window is large it uses additive increase to ensure fairness and when window is small it

TCPの輻輳制御アルゴリズムにBICが追加された.
BICについては前回のブログに少し書いてる."CUBIC: A new TCP-friendly high-speed TCP variant"を読んだ

  • IPv6 support in SELinux

  • A mechanism which allows block drivers to respond to queries about the congestion state of their queues

続きを読む

研究室ニートの読みたい論文リスト (TCP and GPU)

研究科や研究室という組織についてはあんまりよく思ってはいないけど,研究自体は嫌いではないので,最近徐々に論文読みたい感じになってきている.

TCPまたはGPU関連で読みたい論文リストのメモ.

TCP

2002

WebサーバにおけるTCP処理をNICにオフロードするための設計と実装と評価.
SMP環境において専用のネットワークプロセッサを用いるアーキテクチャとクラスタ環境において専用のノードを用いるアーキテクチャの両方を評価

2005

前半部分は読んだ.
CUBICは高速ネットワーク環境に適したTCP輻輳制御アルゴリズムであり,BIC-TCPを改良したものである.
CUBICはBICのウィンドウサイズ制御を簡素化し,既存のTCPとの公平性およびRTT(Round Trip Time)公平性を改善している.
Linux2.6.19以降でデフォルトの輻輳制御アルゴリズムとして採用された.[該当コミット] (http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=597811ec167fa01c926a0957a91d9e39baa30e64)

LinuxのTCP/IPスタック処理におけるsocket, TCP/UDP, IP and Ethernetの各レイヤーごとのパフォーマンス解析.
異なるシチュエーションにおけるそれぞれの性能ボトルネックを明らかにする.

TCP Offload Engineを有効にしたChelsio T110 10-Gigabitイーサネットアダプタのパフォーマンス評価.
-- ソケット層のマイクロベンチマークパフォーマンス評価
-- ソケットインタフェース上のMPI層のパフォーマンス評価
-- Apacheサーバを用いたアプリケーションレベルのパフォーマンス評価
10Gbpsのうち7.6Gbpsの性能.
(TCP Offload EngineとはTCPの一部ないし全ての処理のNIC(上記のイーサネットアダプタなど)にオフロードする仕組みのこと)

I/Oバス経由のデータアクセスやキャッシュミス,割り込みのオーバヘッドなどの処理はCPUコアの増加によるネットワークやI/Oバスの帯域幅のスケーラビリティを低下させる.
これらの処理に関わる命令を削減するために,TCP Offload Engineを採用した新しいホスト/NIC間のインタフェースを設計し,プロトタイプを実装した.

2006

Linux2.4および2.6におけるTCP/IPスタックをSMP環境で性能評価.
(SMPはSymmetric Multiprocessingの略で各コアに対称的に処理を割り振る.つまり,普通のマルチコア環境)
1TCPコネクションあたり1プロセッサのアーキテクチャが優位性を示す.
Linux2.4と2.6ではCPUのコストは大差ないが,2.6はカーネルのスケジューリングとロック機構が改良されているので,スケーラビリティに優れている.

NS2におけるTCP輻輳制御アルゴリズムの設計,実装および評価.
輻輳制御アルゴリズムの実装はLinux2.6と似ている.
NS2は有名なネットワークシミュレータでC++で実装されている.
次期バージョンであるNS3はPythonで実装されているらしいけど,ドキュメントが整ってなくて厳しい感じらしい.

これもLinux2.6のTCPスタックのパフォーマンスを数学モデルにより解析.
カーネルのプリエンプションがネットワーキングシステムに相互に悪影響があることに気づいた.
ボトルネックを解決するためのソリューションを提案する.

Red Hat社の中の人の論文.C10K問題 で有名な人でもある.
NICからアプリケーションレベルへデータをコピーするときに一旦カーネルにコピーしてからアプリケーションにコピーする問題のいくつかのソリューションを説明する.

2007

高エネルギー物理学の計算のようなグリッドコンピューティングにおいて,ペタバイトレベルのデータを転送する必要がある.
NICからアプリケーションに渡されるまでのLinuxのパケット受信の特性を解析するための数学モデルを開発.

2008

TCPの受信側に着目したパフォーマンス改善手法の提案.
もともと主要なボトルネックと言われていたデータコピーやチェックサム計算のような"1バイトあたりの処理"コストから,現在のプロセッサにおけるコネクション管理構造体へのメモリアクセスのような"1パケットあたりの処理"コストにボトルネックがシフトしている.
"1パケットあたりの処理"コストを削減するためにACKパケットの送信とパケットの結合をオフロードする.
ハードウェアへのオフロードはせずにソフトウェアのみによるパフォーマンス改善.
ネイティブのLinuxで45-67%の性能向上,Xenで仮想化されたゲストOSとしてのLinuxで86%の性能向上.

不明

多分2002年ぐらい.
本来カーネルで実装されているTCP/IPスタックをアプリケーション側で実装.
ソースコードはGitHubにあった.(https://github.com/jamesbw/tcp-daytona)

GPU

2009

テキスト検索アルゴリズムをGPUで高速化.

2010

ストレージシステムにおけるハッシュの計算をGPUにオフロードする話.
最近のストレージは,データの重複を排除するために,データをブロックに分割し,各ブロックに対してハッシュ値を計算しておき,ハッシュ値を比較することにより,データの重複を検出する.

GPU使えばCPUの100倍の性能でるよとか言ってるけど,CPU実装をちゃんと最適化すれば数倍の差程度でしかないよ,みたいな感じ.
GTX280とCorei7 970との比較.

単一または複数GPU構成のシステムにおけるタスクの負荷分散.
CUDA APIレベルよりももっと抽象的なAPIを用いていいかんじにタスクを分散する.
CUDAのスケジューラの改良的な感じ.

2011

OSのカーネルのいくつかの機能をGPUにより高速化できる.
OSのカーネルの補助的なプロセッサとしてGPUを使用するためのフレームワークを提案し,Linuxにおけるプロトタイプを示す.

2012

RDBMSにおけるクエリをCPUとGPUの両方で実行できるデータベースフレームワークの実装.
GPUメモリでのキャッシュが効くようにメモリマッピングを工夫して,GPUメモリの容量を超えるデータに対しても高速化できることを示す.
マルチコアCPUと比較して4倍から8倍の性能.



TCPとGPUの論文を輪講してると,カーネルという言葉がOSのカーネルなのかGPUプログラムの実行単位のことなのかを他人に説明するのがめんどくさくなってくる.

TCP Performance Re-Visitedを読んだ

2003年の論文.Linux2.4のTCPスタック実装についてのパフォーマンス測定と解析. LinuxのTCP実装に関するちゃんとした測定はまだ誰もやってなくて,我々がちゃんとした測定をする,みたいな感じの一文が5箇所くらいあって,意識高い感じだった.

Abstract

現行のネットワークアダプタとプロセッサにおけるLinux2.4のTCPスタック実装のパフォーマンスについて詳細な測定と解析を行う. 我々は,TCPパフォーマンスにおけるCPUスケーリングとメモリバスの影響について記述する. CPUの速度とメモリの帯域幅が増加するにつれて,TCPのパフォーマンスに関して一般的に受け入れられている見解があてにならなくなってきている. 以前より抱かれていたTCPパフォーマンス信仰の詳細な検査と説明が提供されており,我々はこれらの憶説と経験説が現行の実装にはあてはまらないケースを明らかにする. アーキテクチャの主要な変更が採用されない限り,1GHz/1Gbpsの経験則に頼り続けるのは困難であると我々は結論づけた.

Slide

Reference

  • Annie P. Foong, Thomas R. Huff , Herbert H. Hum , Jaidev P. Patwardhan,Greg J. Regnier, ISPASS '03 Proceedings of the 2003 IEEE International Symposium on Performance Analysis of Systems and Software.