$30 off During Our Annual Pro Sale. View Details »

NIC の高速化とシステムソフトウェア研究 ~ 2010 年くらいからの振り返り ~

Avatar for yasukata yasukata
December 06, 2025

NIC の高速化とシステムソフトウェア研究 ~ 2010 年くらいからの振り返り ~

2023 年 10 月 17 日 IIJ Lab Seminar 発表資料

動画は https://www.iijlab.net/activities/seminars.html の Past seminars のタブから辿ってご参照ください

Avatar for yasukata

yasukata

December 06, 2025
Tweet

More Decks by yasukata

Other Decks in Technology

Transcript

  1. NIC の⾼速化と システムソフトウェア研究 技術研究所 安形 2023 年 10 ⽉ 17

    ⽇ ‒ IIJ Lab Seminar ‒ TechTrend Talk Series vol. 6 2010 年くらいからの振り返り NIC 1
  2. 資料 • 発表資料 • https://seminar-materials.iijlab.net/iijlab-seminar/iijlab-seminar- 20231017.pdf • https://iijlab-seminars.connpass.com/event/297595/ から辿れます •

    ファイルのサイズが⼤きいため (16 MB 程度) ダウンロードしていただく場合は ご注意ください • 技術レポート:Internet Infrastructure Review (IIR) Vol. 60 • システムソフトウェアの通信分野における2010年頃からの研究まとめ • 2023 年 9 ⽉ 26 ⽇発⾏ • HTML / PDF 版:https://www.iij.ad.jp/dev/report/iir/060.html 2
  3. 概要 • 2010 年くらいから 10 Gbps を超えるような速度の NIC が⽐較 的安価で⼊⼿可能になり、広く利⽤されるようになった

    • 既存のソフトウェアの実装にとって、⾼速な NIC の性能を⼗分 に引き出すのは難しいという課題が顕著になった • この課題について、システムソフトウェア分野でのこれまでの 取り組みを紹介 3
  4. 2010 年くらいの利⽤シナリオ スマートフォン データセンター PC サービス利⽤者の端末 サービス提供側 インターネット 7 動画ストリーミング

    ビッグデータ分析 SNS クラウドストレージ その他たくさんの Web・スマホ向けサービス オンラインゲーム アプリケーション例 検索エンジン
  5. 2010 年くらいの利⽤シナリオ データセンター サービス利⽤者の端末 サービス提供側 インターネット ⼤量のリクエストが集まってくる サービス提供側はなるべく短い応答時間でサービスを提供したい データセンター内のサーバー NIC

    10 ~ Gbps 要求 ⼤量のクライアントへ 短時間でサービスを提供したい NIC の⾼速化により 各サーバーが送受信できる データの量が増加した しかし、NIC が速くなったからといって ⼤量のクライアントに短時間でサービスを提供できるわけではなかった 13
  6. 通信関連のシステムソフトウェア データセンター サービス利⽤者の端末 サービス提供側 インターネット ⼤量のリクエストが集まってくる サービス提供側はなるべく短い応答時間でサービスを提供したい データセンター内のサーバー NIC 10

    ~ Gbps 通信関連ソフトウェア NIC デバイスドライバ TCP/IP スタック アプリケーション NIC デバイスドライバ 仮想スイッチ 仮想 NIC バックエンド ユーザー空間 カーネル ホスト 仮想マシン 16
  7. 通信関連のシステムソフトウェア データセンター サービス利⽤者の端末 サービス提供側 インターネット ⼤量のリクエストが集まってくる サービス提供側はなるべく短い応答時間でサービスを提供したい データセンター内のサーバー NIC 10

    ~ Gbps 通信関連ソフトウェア NIC デバイスドライバ TCP/IP スタック アプリケーション NIC デバイスドライバ 仮想スイッチ 仮想 NIC バックエンド ユーザー空間 カーネル ホスト 仮想マシン ハードウェア ( NIC ) が速くなった結果 ソフトウェアの効率が更に重要になった 17
  8. 通信関連のシステムソフトウェア データセンター サービス利⽤者の端末 サービス提供側 インターネット ⼤量のリクエストが集まってくる サービス提供側はなるべく短い応答時間でサービスを提供したい データセンター内のサーバー NIC 10

    ~ Gbps 通信関連ソフトウェア NIC デバイスドライバ TCP/IP スタック アプリケーション NIC デバイスドライバ 仮想スイッチ 仮想 NIC バックエンド ユーザー空間 カーネル ホスト 仮想マシン ハードウェア ( NIC ) が速くなった結果 ソフトウェアの効率が更に重要になった 19
  9. 既存の実装の性能 • Linux TCP スタックのメッセージ(パケット)サイズごとの性能 • 論⽂が提案⼿法との⽐較対象としているベースラインの性能 Sangjin Han, Scott

    Marshall, Byung-Gon Chun, Sylvia Ratnasamy, "MegaPipe: A New Programming Interface for Scalable Network I/O", OSDI 2012 https://www.usenix.org/conference/osdi12/technical-sessions/presentation/han 2012 年の論⽂の発表資料より NIC デバドラ TCP/IP スタック アプリ NIC デバドラ TCP/IP スタック アプリ クライアント サーバー (8 CPU core) 8(posix)スレッド 10 Gbps メッセージ交換 20
  10. 既存の実装の性能 • Linux TCP スタックのメッセージ(パケット)サイズごとの性能 • 論⽂が提案⼿法との⽐較対象としているベースラインの性能 Sangjin Han, Scott

    Marshall, Byung-Gon Chun, Sylvia Ratnasamy, "MegaPipe: A New Programming Interface for Scalable Network I/O", OSDI 2012 https://www.usenix.org/conference/osdi12/technical-sessions/presentation/han 2012 年の論⽂の発表資料より NIC デバドラ TCP/IP スタック アプリ NIC デバドラ TCP/IP スタック アプリ クライアント サーバー (8 CPU core) 8(posix)スレッド 10 Gbps メッセージ交換 1.)Small)Messages)Are)Bad) 0 20 40 60 80 100 0 2 4 6 8 10 64 128 256 512 1K 2K 4K 8K 16K CPU Usage (%) Throughput (Gbps) Message Size (B) Throughput CPU Usage Low)throughput) High)overhead) 21
  11. 1.)Small)Messages)Are)Bad) 0 20 40 60 80 100 0 2 4

    6 8 10 64 128 256 512 1K 2K 4K 8K 16K CPU Usage (%) Throughput (Gbps) Message Size (B) Throughput CPU Usage Low)throughput) High)overhead) 既存の実装の性能 • Linux TCP スタックのメッセージ(パケット)サイズごとの性能 • 論⽂が提案⼿法との⽐較対象としているベースラインの性能 Sangjin Han, Scott Marshall, Byung-Gon Chun, Sylvia Ratnasamy, "MegaPipe: A New Programming Interface for Scalable Network I/O", OSDI 2012 https://www.usenix.org/conference/osdi12/technical-sessions/presentation/han • メッセージサイズ <= 1K • 10 Gbps を達成できない 2012 年の論⽂の発表資料より 22
  12. 1.)Small)Messages)Are)Bad) 0 20 40 60 80 100 0 2 4

    6 8 10 64 128 256 512 1K 2K 4K 8K 16K CPU Usage (%) Throughput (Gbps) Message Size (B) Throughput CPU Usage Low)throughput) High)overhead) 既存の実装の性能 • Linux TCP スタックのメッセージ(パケット)サイズごとの性能 • 論⽂が提案⼿法との⽐較対象としているベースラインの性能 Sangjin Han, Scott Marshall, Byung-Gon Chun, Sylvia Ratnasamy, "MegaPipe: A New Programming Interface for Scalable Network I/O", OSDI 2012 https://www.usenix.org/conference/osdi12/technical-sessions/presentation/han • メッセージサイズ <= 1K • 10 Gbps を達成できない • メッセージサイズ <= 4K • 依然、⾼い CPU 使⽤率 2012 年の論⽂の発表資料より 23
  13. 既存の実装の性能 • CPU について考えると、TCP/IP スタックで費やされる時間は (厳密ではないですが概ね)パケット数に依存する • NIC の特性上、同じ帯域でも、パケットのサイズが ⼩さい場合の⽅が⼤きい場合より多くのパケットを送れる

    帯域 NIC NIC TCP/IP ヘッダはパケットごとについているので、パケットごとに処理が必要 TCP/IP スタックが処理する必要があるヘッダ パケットサイズが⼩さい⽅が TCP/IP スタックにとって 最⼤の仕事の量が多くなる 34
  14. 既存の実装の性能 • CPU について考えると、TCP/IP スタックで費やされる時間は (厳密ではないですが概ね)パケット数に依存する • NIC の特性上、同じ帯域でも、パケットのサイズが ⼩さい場合の⽅が⼤きい場合より多くのパケットを送れる

    帯域 NIC NIC TCP/IP ヘッダはパケットごとについているので、パケットごとに処理が必要 TCP/IP スタックが処理する必要があるヘッダ パケットサイズが⼩さい⽅が TCP/IP スタックにとって 最⼤の仕事の量が多くなる 0 20 40 60 80 100 0 2 4 6 8 10 64 128 256 512 1K 2K 4K 8K 16K CPU Usage (%) Throughput (Gbps) Message Size (B) Throughput CPU Usage Low)throughput) High)overhead) 9) OSDI)2012) 35 Sangjin Han, Scott Marshall, Byung-Gon Chun, Sylvia Ratnasamy, "MegaPipe: A New Programming Interface for Scalable Network I/O", OSDI 2012 https://www.usenix.org/conference/osdi12/technical-sessions/presentation/han
  15. 既存の実装の性能 • CPU について考えると、TCP/IP スタックで費やされる時間は (厳密ではないですが概ね)パケット数に依存する • NIC の特性上、同じ帯域でも、パケットのサイズが ⼩さい場合の⽅が⼤きい場合より多くのパケットを送れる

    帯域 NIC NIC TCP/IP ヘッダはパケットごとについているので、パケットごとに処理が必要 TCP/IP スタックが処理する必要があるヘッダ パケットサイズが⼩さい⽅が TCP/IP スタックにとって 最⼤の仕事の量が多くなる 0 20 40 60 80 100 0 2 4 6 8 10 64 128 256 512 1K 2K 4K 8K 16K CPU Usage (%) Throughput (Gbps) Message Size (B) Throughput CPU Usage Low)throughput) High)overhead) 9) OSDI)2012) 36 Sangjin Han, Scott Marshall, Byung-Gon Chun, Sylvia Ratnasamy, "MegaPipe: A New Programming Interface for Scalable Network I/O", OSDI 2012 https://www.usenix.org/conference/osdi12/technical-sessions/presentation/han
  16. 既存の実装の性能 • CPU について考えると、TCP/IP スタックで費やされる時間は (厳密ではないですが概ね)パケット数に依存する • NIC の特性上、同じ帯域でも、パケットのサイズが ⼩さい場合の⽅が⼤きい場合より多くのパケットを送れる

    帯域 NIC NIC TCP/IP ヘッダはパケットごとについているので、パケットごとに処理が必要 TCP/IP スタックが処理する必要があるヘッダ パケットサイズが⼩さい⽅が TCP/IP スタックにとって 最⼤の仕事の量が多くなる 0 20 40 60 80 100 0 2 4 6 8 10 64 128 256 512 1K 2K 4K 8K 16K CPU Usage (%) Throughput (Gbps) Message Size (B) Throughput CPU Usage Low)throughput) High)overhead) 9) OSDI)2012) 37 Sangjin Han, Scott Marshall, Byung-Gon Chun, Sylvia Ratnasamy, "MegaPipe: A New Programming Interface for Scalable Network I/O", OSDI 2012 https://www.usenix.org/conference/osdi12/technical-sessions/presentation/han
  17. 既存の実装の性能 • CPU について考えると、TCP/IP スタックで費やされる時間は (厳密ではないですが概ね)パケット数に依存する • NIC の特性上、同じ帯域でも、パケットのサイズが ⼩さい場合の⽅が⼤きい場合より多くのパケットを送れる

    帯域 NIC NIC TCP/IP ヘッダはパケットごとについているので、パケットごとに処理が必要 TCP/IP スタックが処理する必要があるヘッダ パケットサイズが⼩さい⽅が TCP/IP スタックにとって 最⼤の仕事の量が多くなる 0 20 40 60 80 100 0 2 4 6 8 10 64 128 256 512 1K 2K 4K 8K 16K CPU Usage (%) Throughput (Gbps) Message Size (B) Throughput CPU Usage Low)throughput) High)overhead) 9) OSDI)2012) 38 Sangjin Han, Scott Marshall, Byung-Gon Chun, Sylvia Ratnasamy, "MegaPipe: A New Programming Interface for Scalable Network I/O", OSDI 2012 https://www.usenix.org/conference/osdi12/technical-sessions/presentation/han
  18. 2010 年くらいの利⽤シナリオ データセンター サービス利⽤者の端末 サービス提供側 インターネット ⼤量のリクエストが集まってくる サービス提供側はなるべく短い応答時間でサービスを提供したい Web サーバー

    インメモリ キャッシュ サーバー やりとりするデータのサイズが ⽐較的⼩さい場合が多い 1.)Small)Messages)Are)Bad) 0 20 40 60 80 100 0 2 4 6 8 10 64 128 256 512 1K 2K 4K 8K 16K CPU Usage (%) Throughput (Gbps) Message Size (B) Throughput CPU Usage Low)throughput) High)overhead) 9) OSDI)2012) 42 Sangjin Han, Scott Marshall, Byung-Gon Chun, Sylvia Ratnasamy, "MegaPipe: A New Programming Interface for Scalable Network I/O", OSDI 2012 https://www.usenix.org/conference/osdi12/technical-sessions/presentation/han
  19. 2010 年くらいの利⽤シナリオ データセンター サービス利⽤者の端末 サービス提供側 インターネット ⼤量のリクエストが集まってくる サービス提供側はなるべく短い応答時間でサービスを提供したい Web サーバー

    インメモリ キャッシュ サーバー やりとりするデータのサイズが ⽐較的⼩さい場合が多い 1.)Small)Messages)Are)Bad) 0 20 40 60 80 100 0 2 4 6 8 10 64 128 256 512 1K 2K 4K 8K 16K CPU Usage (%) Throughput (Gbps) Message Size (B) Throughput CPU Usage Low)throughput) High)overhead) 9) OSDI)2012) TCP/IP スタックが ボトルネックに 43 Sangjin Han, Scott Marshall, Byung-Gon Chun, Sylvia Ratnasamy, "MegaPipe: A New Programming Interface for Scalable Network I/O", OSDI 2012 https://www.usenix.org/conference/osdi12/technical-sessions/presentation/han
  20. 通信関連のシステムソフトウェア データセンター サービス利⽤者の端末 サービス提供側 インターネット ⼤量のリクエストが集まってくる サービス提供側はなるべく短い応答時間でサービスを提供したい データセンター内のサーバー NIC 10

    ~ Gbps 通信関連ソフトウェア NIC デバイスドライバ TCP/IP スタック アプリケーション NIC デバイスドライバ 仮想スイッチ 仮想 NIC バックエンド ユーザー空間 カーネル ホスト 仮想マシン ハードウェア ( NIC ) は速くなったので ソフトウェアの効率が重要になる 44
  21. 通信関連のシステムソフトウェア データセンター サービス利⽤者の端末 サービス提供側 インターネット ⼤量のリクエストが集まってくる サービス提供側はなるべく短い応答時間でサービスを提供したい データセンター内のサーバー NIC 10

    ~ Gbps 通信関連ソフトウェア NIC デバイスドライバ TCP/IP スタック アプリケーション NIC デバイスドライバ 仮想スイッチ 仮想 NIC バックエンド ユーザー空間 カーネル ホスト 仮想マシン ハードウェア ( NIC ) は速くなったので ソフトウェアの効率が重要になる 45
  22. 既存の実装の性能 • 仮想マシンからの単純なパケット転送性能:Linux vhost-net 10 Gbps NIC デバドラ アプリ 仮想

    スイッチ 仮想 NIC バックエンド NIC デバドラ アプリ 送信側 受信側 仮想 マシン ホスト NIC デバドラ vhost-net Linux bridge 46
  23. 既存の実装の性能 • 仮想マシンからの単純なパケット転送性能:Linux vhost-net 0 2 4 6 8 10

    64 128 256 512 1024 1472 Throughput [Gbps] Packet Size [B] 10 Gbps NIC デバドラ アプリ 仮想 スイッチ 仮想 NIC バックエンド NIC デバドラ アプリ 送信側 受信側 仮想 マシン ホスト NIC デバドラ vhost-net Linux bridge 47
  24. 10 Gbps NIC の普及 • ソフトウェアの視点から、性能について⼤きな伸び代ができた 1.)Small)Messages)Are)Bad) 0 20 40

    60 80 100 0 2 4 6 8 10 64 128 256 512 1K 2K 4K 8K 16K CPU Usage (%) Throughput (Gbps) Message Size (B) Throughput CPU Usage Low)throughput) High)overhead) 9) OSDI)2012) 伸び代 0 2 4 6 8 10 64 128 256 512 1024 1472 Throughput [Gbps] Packet Size [B] 伸び代 52 Sangjin Han, Scott Marshall, Byung-Gon Chun, Sylvia Ratnasamy, "MegaPipe: A New Programming Interface for Scalable Network I/O", OSDI 2012 https://www.usenix.org/conference/osdi12/technical-sessions/presentation/han
  25. 課題 • 伸び代をどのように引き出して有効活⽤するか? 1.)Small)Messages)Are)Bad) 0 20 40 60 80 100

    0 2 4 6 8 10 64 128 256 512 1K 2K 4K 8K 16K CPU Usage (%) Throughput (Gbps) Message Size (B) Throughput CPU Usage Low)throughput) High)overhead) 9) OSDI)2012) 伸び代 0 2 4 6 8 10 64 128 256 512 1024 1472 Throughput [Gbps] Packet Size [B] 伸び代 53 Sangjin Han, Scott Marshall, Byung-Gon Chun, Sylvia Ratnasamy, "MegaPipe: A New Programming Interface for Scalable Network I/O", OSDI 2012 https://www.usenix.org/conference/osdi12/technical-sessions/presentation/han
  26. システムコールの呼び出しコスト • システムコール • ユーザー空間プログラムがカーネル空間の機能を呼び出すためのイン ターフェース • ユーザー空間プログラムをカーネルに実装されている TCP/IP スタックを、システムコールを通して利⽤する

    NIC デバイスドライバ TCP/IP スタック アプリケーション ユーザー空間 カーネル システムコール ⾮特権モード 特権モード システムコールと通常の関数呼び出しの違い 62
  27. システムコールの呼び出しコスト • システムコール • ユーザー空間プログラムがカーネル空間の機能を呼び出すためのイン ターフェース • ユーザー空間プログラムをカーネルに実装されている TCP/IP スタックを、システムコールを通して利⽤する

    NIC デバイスドライバ TCP/IP スタック アプリケーション ユーザー空間 カーネル システムコール ⾮特権モード 特権モード システムコールと通常の関数呼び出しの違い システムコールは、CPU のモードを⾮特権モード(ユーザー空間)から 特権モード(カーネル)への切り替えた後、カーネルに実装された関数を呼ぶ 63
  28. システムコールの呼び出しコスト • システムコール • ユーザー空間プログラムがカーネル空間の機能を呼び出すためのイン ターフェース • ユーザー空間プログラムをカーネルに実装されている TCP/IP スタックを、システムコールを通して利⽤する

    NIC デバイスドライバ TCP/IP スタック アプリケーション ユーザー空間 カーネル システムコール ⾮特権モード 特権モード システムコールと通常の関数呼び出しの違い システムコールは、CPU のモードを⾮特権モード(ユーザー空間)から 特権モード(カーネル)への切り替えた後、カーネルに実装された関数を呼ぶ システムコールのための特権モード切り替えは x86-64 であれば syscall という CPU 命令を利⽤ 64
  29. システムコールの呼び出しコスト • システムコール • ユーザー空間プログラムがカーネル空間の機能を呼び出すためのイン ターフェース • ユーザー空間プログラムをカーネルに実装されている TCP/IP スタックを、システムコールを通して利⽤する

    NIC デバイスドライバ TCP/IP スタック アプリケーション ユーザー空間 カーネル ⾮特権モード 特権モード システムコールと通常の関数呼び出しの違い システムコールは、CPU のモードを⾮特権モード(ユーザー空間)から 特権モード(カーネル)への切り替えた後、カーネルに実装された関数を呼ぶ システムコールのための特権モード切り替えは x86-64 であれば syscall という CPU 命令を利⽤ ユーザー空間で アプリケーションを実⾏中 65
  30. システムコールの呼び出しコスト • システムコール • ユーザー空間プログラムがカーネル空間の機能を呼び出すためのイン ターフェース • ユーザー空間プログラムをカーネルに実装されている TCP/IP スタックを、システムコールを通して利⽤する

    NIC デバイスドライバ TCP/IP スタック アプリケーション ユーザー空間 カーネル ⾮特権モード 特権モード システムコールと通常の関数呼び出しの違い システムコールは、CPU のモードを⾮特権モード(ユーザー空間)から 特権モード(カーネル)への切り替えた後、カーネルに実装された関数を呼ぶ システムコールのための特権モード切り替えは x86-64 であれば syscall という CPU 命令を利⽤ アプリケーションが syscall 命令を実⾏ syscall 66
  31. システムコールの呼び出しコスト • システムコール • ユーザー空間プログラムがカーネル空間の機能を呼び出すためのイン ターフェース • ユーザー空間プログラムをカーネルに実装されている TCP/IP スタックを、システムコールを通して利⽤する

    NIC デバイスドライバ TCP/IP スタック アプリケーション ユーザー空間 カーネル ⾮特権モード 特権モード システムコールと通常の関数呼び出しの違い システムコールは、CPU のモードを⾮特権モード(ユーザー空間)から 特権モード(カーネル)への切り替えた後、カーネルに実装された関数を呼ぶ システムコールのための特権モード切り替えは x86-64 であれば syscall という CPU 命令を利⽤ 実⾏コンテキストが カーネルへ切り替わる 67
  32. システムコールの呼び出しコスト • システムコール • ユーザー空間プログラムがカーネル空間の機能を呼び出すためのイン ターフェース • ユーザー空間プログラムをカーネルに実装されている TCP/IP スタックを、システムコールを通して利⽤する

    NIC デバイスドライバ TCP/IP スタック アプリケーション ユーザー空間 カーネル ⾮特権モード 特権モード システムコールと通常の関数呼び出しの違い システムコールは、CPU のモードを⾮特権モード(ユーザー空間)から 特権モード(カーネル)への切り替えた後、カーネルに実装された関数を呼ぶ システムコールのための特権モード切り替えは x86-64 であれば syscall という CPU 命令を利⽤ カーネル内に実装された 関数が実⾏される (e.g., TCP/IP スタック処理) 68
  33. システムコールの呼び出しコスト • システムコール • ユーザー空間プログラムがカーネル空間の機能を呼び出すためのイン ターフェース • ユーザー空間プログラムをカーネルに実装されている TCP/IP スタックを、システムコールを通して利⽤する

    NIC デバイスドライバ TCP/IP スタック アプリケーション ユーザー空間 カーネル ⾮特権モード 特権モード システムコールと通常の関数呼び出しの違い システムコールは、CPU のモードを⾮特権モード(ユーザー空間)から 特権モード(カーネル)への切り替えた後、カーネルに実装された関数を呼ぶ システムコールのための特権モード切り替えは x86-64 であれば syscall という CPU 命令を利⽤ カーネルは処理を完了 すると、コンテキストを ユーザー空間へ戻す 69
  34. システムコールの呼び出しコスト • システムコール • ユーザー空間プログラムがカーネル空間の機能を呼び出すためのイン ターフェース • ユーザー空間プログラムをカーネルに実装されている TCP/IP スタックを、システムコールを通して利⽤する

    NIC デバイスドライバ TCP/IP スタック アプリケーション ユーザー空間 カーネル ⾮特権モード 特権モード システムコールと通常の関数呼び出しの違い システムコールは、CPU のモードを⾮特権モード(ユーザー空間)から 特権モード(カーネル)への切り替えた後、カーネルに実装された関数を呼ぶ モード切り替えは 時間がかかる処理 ポイント 頻繁に呼び出すと 性能劣化に繋がる システムコールのための特権モード切り替えは x86-64 であれば syscall という CPU 命令を利⽤ 70
  35. システムコールの頻度を減らす • FlexSC (OSDI 2010) • ユーザー・カーネル空間の間に共有メモリを⽤意 • ユーザー空間プログラムはリクエスト内容を共有メモリ上に書き込み •

    カーネル内で専⽤のカーネルスレッドが共有リクエストを読み取り カーネル機能を実⾏ 84 カーネル機能 アプリケーション ユーザー空間 カーネル カーネル機能 共有メモリ カーネルスレッド 実⾏
  36. 解決策:システムコールの頻度を減らす • FlexSC (OSDI 2010) • ユーザー・カーネル空間の間に共有メモリを⽤意 • ユーザー空間プログラムはリクエスト内容を共有メモリ上に書き込み •

    カーネル内で専⽤のカーネルスレッドが共有リクエストを読み取り カーネル機能を実⾏ 85 カーネル機能 アプリケーション ユーザー空間 カーネル カーネル機能 共有メモリ カーネルスレッド 実⾏ 12 Exception-less interface: syscall page write(fd, buf, 4096); entry = free_syscall_entry(); /* write syscall */ /* write syscall */ entry->syscall = 1; entry->num_args = 3; entry->args[0] = fd; entry->args[1] = buf; entry->args[2] = 4096; entry->status = SUBMIT SUBMIT; while while (entry->status != DONE DONE) do_something_else(); return return entry->return_code; DONE DONE Livio Soares and Michael Stumm. 2010. FlexSC: Flexible System Call Scheduling with Exception-Less System Calls. In 9th USENIX Symposium on Operating Systems Design and Implementation (OSDI 10).(https://www.usenix.org/conference/osdi10/flexsc-flexible-system-call-scheduling-exception-less-system-calls)
  37. 解決策:システムコールの頻度を減らす • FlexSC (OSDI 2010) • ユーザー・カーネル空間の間に共有メモリを⽤意 • ユーザー空間プログラムはリクエスト内容を共有メモリ上に書き込み •

    カーネル内で専⽤のカーネルスレッドが共有リクエストを読み取り カーネル機能を実⾏ 86 カーネル機能 アプリケーション ユーザー空間 カーネル カーネル機能 共有メモリ カーネルスレッド 実⾏ 12 Exception-less interface: syscall page write(fd, buf, 4096); entry = free_syscall_entry(); /* write syscall */ /* write syscall */ entry->syscall = 1; entry->num_args = 3; entry->args[0] = fd; entry->args[1] = buf; entry->args[2] = 4096; entry->status = SUBMIT SUBMIT; while while (entry->status != DONE DONE) do_something_else(); return return entry->return_code; DONE DONE 通常の write システムコール Livio Soares and Michael Stumm. 2010. FlexSC: Flexible System Call Scheduling with Exception-Less System Calls. In 9th USENIX Symposium on Operating Systems Design and Implementation (OSDI 10).(https://www.usenix.org/conference/osdi10/flexsc-flexible-system-call-scheduling-exception-less-system-calls)
  38. 解決策:システムコールの頻度を減らす • FlexSC (OSDI 2010) • ユーザー・カーネル空間の間に共有メモリを⽤意 • ユーザー空間プログラムはリクエスト内容を共有メモリ上に書き込み •

    カーネル内で専⽤のカーネルスレッドが共有リクエストを読み取り カーネル機能を実⾏ 87 カーネル機能 アプリケーション ユーザー空間 カーネル カーネル機能 共有メモリ カーネルスレッド 実⾏ 12 Exception-less interface: syscall page write(fd, buf, 4096); entry = free_syscall_entry(); /* write syscall */ /* write syscall */ entry->syscall = 1; entry->num_args = 3; entry->args[0] = fd; entry->args[1] = buf; entry->args[2] = 4096; entry->status = SUBMIT SUBMIT; while while (entry->status != DONE DONE) do_something_else(); return return entry->return_code; DONE DONE FlexSC だとこんなかんじ Livio Soares and Michael Stumm. 2010. FlexSC: Flexible System Call Scheduling with Exception-Less System Calls. In 9th USENIX Symposium on Operating Systems Design and Implementation (OSDI 10).(https://www.usenix.org/conference/osdi10/flexsc-flexible-system-call-scheduling-exception-less-system-calls)
  39. 解決策:システムコールの頻度を減らす • FlexSC (OSDI 2010) • ユーザー・カーネル空間の間に共有メモリを⽤意 • ユーザー空間プログラムはリクエスト内容を共有メモリ上に書き込み •

    カーネル内で専⽤のカーネルスレッドが共有リクエストを読み取り カーネル機能を実⾏ 88 カーネル機能 アプリケーション ユーザー空間 カーネル カーネル機能 共有メモリ カーネルスレッド 実⾏ 12 Exception-less interface: syscall page write(fd, buf, 4096); entry = free_syscall_entry(); /* write syscall */ /* write syscall */ entry->syscall = 1; entry->num_args = 3; entry->args[0] = fd; entry->args[1] = buf; entry->args[2] = 4096; entry->status = SUBMIT SUBMIT; while while (entry->status != DONE DONE) do_something_else(); return return entry->return_code; DONE DONE リクエスト⽤エントリを取得 Livio Soares and Michael Stumm. 2010. FlexSC: Flexible System Call Scheduling with Exception-Less System Calls. In 9th USENIX Symposium on Operating Systems Design and Implementation (OSDI 10).(https://www.usenix.org/conference/osdi10/flexsc-flexible-system-call-scheduling-exception-less-system-calls)
  40. 解決策:システムコールの頻度を減らす • FlexSC (OSDI 2010) • ユーザー・カーネル空間の間に共有メモリを⽤意 • ユーザー空間プログラムはリクエスト内容を共有メモリ上に書き込み •

    カーネル内で専⽤のカーネルスレッドが共有リクエストを読み取り カーネル機能を実⾏ 89 カーネル機能 アプリケーション ユーザー空間 カーネル カーネル機能 共有メモリ カーネルスレッド 実⾏ 12 Exception-less interface: syscall page write(fd, buf, 4096); entry = free_syscall_entry(); /* write syscall */ /* write syscall */ entry->syscall = 1; entry->num_args = 3; entry->args[0] = fd; entry->args[1] = buf; entry->args[2] = 4096; entry->status = SUBMIT SUBMIT; while while (entry->status != DONE DONE) do_something_else(); return return entry->return_code; DONE DONE リクエスト⽤エントリを取得 カーネル機能 実⾏ カーネル機能 アプリケーション ユーザー空間 カーネル 共有メモリ カーネルスレッド このエントリはユーザー空間と カーネル空間の共有メモリ上に存在
  41. 解決策:システムコールの頻度を減らす • FlexSC (OSDI 2010) • ユーザー・カーネル空間の間に共有メモリを⽤意 • ユーザー空間プログラムはリクエスト内容を共有メモリ上に書き込み •

    カーネル内で専⽤のカーネルスレッドが共有リクエストを読み取り カーネル機能を実⾏ 90 カーネル機能 アプリケーション ユーザー空間 カーネル カーネル機能 共有メモリ カーネルスレッド 実⾏ 12 Exception-less interface: syscall page write(fd, buf, 4096); entry = free_syscall_entry(); /* write syscall */ /* write syscall */ entry->syscall = 1; entry->num_args = 3; entry->args[0] = fd; entry->args[1] = buf; entry->args[2] = 4096; entry->status = SUBMIT SUBMIT; while while (entry->status != DONE DONE) do_something_else(); return return entry->return_code; DONE DONE システムコール番号を設定 (write は 1) Livio Soares and Michael Stumm. 2010. FlexSC: Flexible System Call Scheduling with Exception-Less System Calls. In 9th USENIX Symposium on Operating Systems Design and Implementation (OSDI 10).(https://www.usenix.org/conference/osdi10/flexsc-flexible-system-call-scheduling-exception-less-system-calls)
  42. 解決策:システムコールの頻度を減らす • FlexSC (OSDI 2010) • ユーザー・カーネル空間の間に共有メモリを⽤意 • ユーザー空間プログラムはリクエスト内容を共有メモリ上に書き込み •

    カーネル内で専⽤のカーネルスレッドが共有リクエストを読み取り カーネル機能を実⾏ 91 カーネル機能 アプリケーション ユーザー空間 カーネル カーネル機能 共有メモリ カーネルスレッド 実⾏ 12 Exception-less interface: syscall page write(fd, buf, 4096); entry = free_syscall_entry(); /* write syscall */ /* write syscall */ entry->syscall = 1; entry->num_args = 3; entry->args[0] = fd; entry->args[1] = buf; entry->args[2] = 4096; entry->status = SUBMIT SUBMIT; while while (entry->status != DONE DONE) do_something_else(); return return entry->return_code; DONE DONE 引数の数を指定 Livio Soares and Michael Stumm. 2010. FlexSC: Flexible System Call Scheduling with Exception-Less System Calls. In 9th USENIX Symposium on Operating Systems Design and Implementation (OSDI 10).(https://www.usenix.org/conference/osdi10/flexsc-flexible-system-call-scheduling-exception-less-system-calls)
  43. 解決策:システムコールの頻度を減らす • FlexSC (OSDI 2010) • ユーザー・カーネル空間の間に共有メモリを⽤意 • ユーザー空間プログラムはリクエスト内容を共有メモリ上に書き込み •

    カーネル内で専⽤のカーネルスレッドが共有リクエストを読み取り カーネル機能を実⾏ 92 カーネル機能 アプリケーション ユーザー空間 カーネル カーネル機能 共有メモリ カーネルスレッド 実⾏ 12 Exception-less interface: syscall page write(fd, buf, 4096); entry = free_syscall_entry(); /* write syscall */ /* write syscall */ entry->syscall = 1; entry->num_args = 3; entry->args[0] = fd; entry->args[1] = buf; entry->args[2] = 4096; entry->status = SUBMIT SUBMIT; while while (entry->status != DONE DONE) do_something_else(); return return entry->return_code; DONE DONE 引数を指定 Livio Soares and Michael Stumm. 2010. FlexSC: Flexible System Call Scheduling with Exception-Less System Calls. In 9th USENIX Symposium on Operating Systems Design and Implementation (OSDI 10).(https://www.usenix.org/conference/osdi10/flexsc-flexible-system-call-scheduling-exception-less-system-calls)
  44. 解決策:システムコールの頻度を減らす • FlexSC (OSDI 2010) • ユーザー・カーネル空間の間に共有メモリを⽤意 • ユーザー空間プログラムはリクエスト内容を共有メモリ上に書き込み •

    カーネル内で専⽤のカーネルスレッドが共有リクエストを読み取り カーネル機能を実⾏ 93 カーネル機能 アプリケーション ユーザー空間 カーネル カーネル機能 共有メモリ カーネルスレッド 実⾏ 12 Exception-less interface: syscall page write(fd, buf, 4096); entry = free_syscall_entry(); /* write syscall */ /* write syscall */ entry->syscall = 1; entry->num_args = 3; entry->args[0] = fd; entry->args[1] = buf; entry->args[2] = 4096; entry->status = SUBMIT SUBMIT; while while (entry->status != DONE DONE) do_something_else(); return return entry->return_code; DONE DONE ステータスをSUBMITへ変更 Livio Soares and Michael Stumm. 2010. FlexSC: Flexible System Call Scheduling with Exception-Less System Calls. In 9th USENIX Symposium on Operating Systems Design and Implementation (OSDI 10).(https://www.usenix.org/conference/osdi10/flexsc-flexible-system-call-scheduling-exception-less-system-calls)
  45. 解決策:システムコールの頻度を減らす • FlexSC (OSDI 2010) • ユーザー・カーネル空間の間に共有メモリを⽤意 • ユーザー空間プログラムはリクエスト内容を共有メモリ上に書き込み •

    カーネル内で専⽤のカーネルスレッドが共有リクエストを読み取り カーネル機能を実⾏ 94 カーネル機能 アプリケーション ユーザー空間 カーネル カーネル機能 共有メモリ カーネルスレッド 実⾏ 12 Exception-less interface: syscall page write(fd, buf, 4096); entry = free_syscall_entry(); /* write syscall */ /* write syscall */ entry->syscall = 1; entry->num_args = 3; entry->args[0] = fd; entry->args[1] = buf; entry->args[2] = 4096; entry->status = SUBMIT SUBMIT; while while (entry->status != DONE DONE) do_something_else(); return return entry->return_code; DONE DONE ステータスをSUBMITへ変更 カーネル機能 実⾏ カーネル機能 アプリケーション ユーザー空間 カーネル 共有メモリ カーネルスレッド Livio Soares and Michael Stumm. 2010. FlexSC: Flexible System Call Scheduling with Exception-Less System Calls. In 9th USENIX Symposium on Operating Systems Design and Implementation (OSDI 10).(https://www.usenix.org/conference/osdi10/flexsc-flexible-system-call-scheduling-exception-less-system-calls)
  46. 解決策:システムコールの頻度を減らす • FlexSC (OSDI 2010) • ユーザー・カーネル空間の間に共有メモリを⽤意 • ユーザー空間プログラムはリクエスト内容を共有メモリ上に書き込み •

    カーネル内で専⽤のカーネルスレッドが共有リクエストを読み取り カーネル機能を実⾏ 95 カーネル機能 アプリケーション ユーザー空間 カーネル カーネル機能 共有メモリ カーネルスレッド 実⾏ 12 Exception-less interface: syscall page write(fd, buf, 4096); entry = free_syscall_entry(); /* write syscall */ /* write syscall */ entry->syscall = 1; entry->num_args = 3; entry->args[0] = fd; entry->args[1] = buf; entry->args[2] = 4096; entry->status = SUBMIT SUBMIT; while while (entry->status != DONE DONE) do_something_else(); return return entry->return_code; DONE DONE 専⽤カーネルスレッドは SUBMIT 状態を 読み取り、リクエストの処理を開始する カーネル機能 実⾏ カーネル機能 アプリケーション ユーザー空間 カーネル 共有メモリ カーネルスレッド Livio Soares and Michael Stumm. 2010. FlexSC: Flexible System Call Scheduling with Exception-Less System Calls. In 9th USENIX Symposium on Operating Systems Design and Implementation (OSDI 10).(https://www.usenix.org/conference/osdi10/flexsc-flexible-system-call-scheduling-exception-less-system-calls)
  47. 解決策:システムコールの頻度を減らす • FlexSC (OSDI 2010) • ユーザー・カーネル空間の間に共有メモリを⽤意 • ユーザー空間プログラムはリクエスト内容を共有メモリ上に書き込み •

    カーネル内で専⽤のカーネルスレッドが共有リクエストを読み取り カーネル機能を実⾏ 96 カーネル機能 アプリケーション ユーザー空間 カーネル カーネル機能 共有メモリ カーネルスレッド 実⾏ 12 Exception-less interface: syscall page write(fd, buf, 4096); entry = free_syscall_entry(); /* write syscall */ /* write syscall */ entry->syscall = 1; entry->num_args = 3; entry->args[0] = fd; entry->args[1] = buf; entry->args[2] = 4096; entry->status = SUBMIT SUBMIT; while while (entry->status != DONE DONE) do_something_else(); return return entry->return_code; DONE DONE アプリケーションはステータスが DONE になるまで待機 カーネル機能 実⾏ カーネル機能 アプリケーション ユーザー空間 カーネル 共有メモリ カーネルスレッド Livio Soares and Michael Stumm. 2010. FlexSC: Flexible System Call Scheduling with Exception-Less System Calls. In 9th USENIX Symposium on Operating Systems Design and Implementation (OSDI 10).(https://www.usenix.org/conference/osdi10/flexsc-flexible-system-call-scheduling-exception-less-system-calls)
  48. 解決策:システムコールの頻度を減らす • FlexSC (OSDI 2010) • ユーザー・カーネル空間の間に共有メモリを⽤意 • ユーザー空間プログラムはリクエスト内容を共有メモリ上に書き込み •

    カーネル内で専⽤のカーネルスレッドが共有リクエストを読み取り カーネル機能を実⾏ 97 カーネル機能 アプリケーション ユーザー空間 カーネル カーネル機能 共有メモリ カーネルスレッド 実⾏ 12 Exception-less interface: syscall page write(fd, buf, 4096); entry = free_syscall_entry(); /* write syscall */ /* write syscall */ entry->syscall = 1; entry->num_args = 3; entry->args[0] = fd; entry->args[1] = buf; entry->args[2] = 4096; entry->status = SUBMIT SUBMIT; while while (entry->status != DONE DONE) do_something_else(); return return entry->return_code; DONE DONE カーネルスレッドは処理が完了し次第 結果をreturn_codeに設定した後 ステータスをDONEに変更 カーネル機能 実⾏ カーネル機能 アプリケーション ユーザー空間 カーネル 共有メモリ カーネルスレッド Livio Soares and Michael Stumm. 2010. FlexSC: Flexible System Call Scheduling with Exception-Less System Calls. In 9th USENIX Symposium on Operating Systems Design and Implementation (OSDI 10).(https://www.usenix.org/conference/osdi10/flexsc-flexible-system-call-scheduling-exception-less-system-calls)
  49. 解決策:システムコールの頻度を減らす • FlexSC (OSDI 2010) • ユーザー・カーネル空間の間に共有メモリを⽤意 • ユーザー空間プログラムはリクエスト内容を共有メモリ上に書き込み •

    カーネル内で専⽤のカーネルスレッドが共有リクエストを読み取り カーネル機能を実⾏ 98 カーネル機能 アプリケーション ユーザー空間 カーネル カーネル機能 共有メモリ カーネルスレッド 実⾏ 12 Exception-less interface: syscall page write(fd, buf, 4096); entry = free_syscall_entry(); /* write syscall */ /* write syscall */ entry->syscall = 1; entry->num_args = 3; entry->args[0] = fd; entry->args[1] = buf; entry->args[2] = 4096; entry->status = SUBMIT SUBMIT; while while (entry->status != DONE DONE) do_something_else(); return return entry->return_code; DONE DONE ポイント:ユーザー空間とカーネルの間のやりとりを 共有メモリを通じて⾏うことで syscall 命令に伴うコンテキストの切り替えをなくせる カーネル機能 実⾏ カーネル機能 アプリケーション ユーザー空間 カーネル 共有メモリ カーネルスレッド Livio Soares and Michael Stumm. 2010. FlexSC: Flexible System Call Scheduling with Exception-Less System Calls. In 9th USENIX Symposium on Operating Systems Design and Implementation (OSDI 10).(https://www.usenix.org/conference/osdi10/flexsc-flexible-system-call-scheduling-exception-less-system-calls)
  50. 解決策:システムコールの頻度を減らす • FlexSC (OSDI 2010) • ユーザー・カーネル空間の間に共有メモリを⽤意 • ユーザー空間プログラムはリクエスト内容を共有メモリ上に書き込み •

    カーネル内で専⽤のカーネルスレッドが共有リクエストを読み取り カーネル機能を実⾏ 99 カーネル機能 アプリケーション ユーザー空間 カーネル カーネル機能 共有メモリ カーネルスレッド 実⾏ 28 ApacheBench throughput (4 cores) 0 200 400 600 800 1000 0 5,000 10,000 15,000 20,000 25,000 30,000 35,000 40,000 45,000 flexsc sync Request Concurrency Throughput (requests/sec.) 115% improvement Livio Soares and Michael Stumm. 2010. FlexSC: Flexible System Call Scheduling with Exception-Less System Calls. In 9th USENIX Symposium on Operating Systems Design and Implementation (OSDI 10).(https://www.usenix.org/conference/osdi10/flexsc-flexible-system-call-scheduling-exception-less-system-calls)
  51. • アプリとカーネルの境界をなくす • Unikernels • Mirage (ASPLOS 2013) • OSv

    (USENIX ATC 2014) • Lupin Linux (EuroSys 2020) • Unikraft (EuroSys 2021) • Unikernel Linux (EuroSys 2023) • ライブラリ OS • VirtuOS (SOSP 2013) • EbbRT (OSDI 2016) • Demikernel (SOSP 2021) • アプリのコードを検証後カーネルで実⾏ • Privbox (USENIX ATC 2022) • Userspace bypass (OSDI 2023) システムコールの頻度を減らす 105
  52. • アプリとカーネルの境界をなくす • Unikernels • Mirage (ASPLOS 2013) • OSv

    (USENIX ATC 2014) • Lupin Linux (EuroSys 2020) • Unikraft (EuroSys 2021) • Unikernel Linux (EuroSys 2023) • ライブラリ OS • VirtuOS (SOSP 2013) • EbbRT (OSDI 2016) • Demikernel (SOSP 2021) • アプリのコードを検証後カーネルで実⾏ • Privbox (USENIX ATC 2022) • Userspace bypass (OSDI 2023) システムコールの頻度を減らす NIC デバイスドライバ TCP/IP スタック アプリケーション カーネル 仮想マシン ホスト(ハイパーバイザー) アプリケーションはカーネル空間で動く 106
  53. • アプリとカーネルの境界をなくす • Unikernels • Mirage (ASPLOS 2013) • OSv

    (USENIX ATC 2014) • Lupin Linux (EuroSys 2020) • Unikraft (EuroSys 2021) • Unikernel Linux (EuroSys 2023) • ライブラリ OS • VirtuOS (SOSP 2013) • EbbRT (OSDI 2016) • Demikernel (SOSP 2021) • アプリのコードを検証後カーネルで実⾏ • Privbox (USENIX ATC 2022) • Userspace bypass (OSDI 2023) システムコールの頻度を減らす NIC デバイスドライバ TCP/IP スタック アプリケーション カーネル 仮想マシン ホスト(ハイパーバイザー) アプリケーションはカーネル空間で動く 107
  54. システムコールの頻度を減らす • アプリとカーネルの境界をなくす • Unikernels • Mirage (ASPLOS 2013) •

    OSv (USENIX ATC 2014) • Lupin Linux (EuroSys 2020) • Unikraft (EuroSys 2021) • Unikernel Linux (EuroSys 2023) • ライブラリ OS • VirtuOS (SOSP 2013) • EbbRT (OSDI 2016) • Demikernel (SOSP 2021) • アプリのコードを検証後カーネルで実⾏ • Privbox (USENIX ATC 2022) • Userspace bypass (OSDI 2023) NIC デバイスドライバ TCP/IP スタック アプリケーション ユーザー空間 OS 機能がユーザー空間で動く 108
  55. システムコールの頻度を減らす • アプリとカーネルの境界をなくす • Unikernels • Mirage (ASPLOS 2013) •

    OSv (USENIX ATC 2014) • Lupin Linux (EuroSys 2020) • Unikraft (EuroSys 2021) • Unikernel Linux (EuroSys 2023) • ライブラリ OS • VirtuOS (SOSP 2013) • EbbRT (OSDI 2016) • Demikernel (SOSP 2021) • アプリのコードを検証後カーネルで実⾏ • Privbox (USENIX ATC 2022) • Userspace bypass (OSDI 2023) NIC デバイスドライバ TCP/IP スタック アプリケーション ユーザー空間 OS 機能がユーザー空間で動く 109
  56. システムコールの頻度を減らす • アプリとカーネルの境界をなくす • Unikernels • Mirage (ASPLOS 2013) •

    OSv (USENIX ATC 2014) • Lupin Linux (EuroSys 2020) • Unikraft (EuroSys 2021) • Unikernel Linux (EuroSys 2023) • ライブラリ OS • VirtuOS (SOSP 2013) • EbbRT (OSDI 2016) • Demikernel (SOSP 2021) • アプリのコードを検証後カーネルで実⾏ • Privbox (USENIX ATC 2022) • Userspace bypass (OSDI 2023) NIC デバイスドライバ TCP/IP スタック アプリケーション カーネル アプリケーションはカーネル空間で動く 110
  57. システムコールの頻度を減らす • アプリとカーネルの境界をなくす • Unikernels • Mirage (ASPLOS 2013) •

    OSv (USENIX ATC 2014) • Lupin Linux (EuroSys 2020) • Unikraft (EuroSys 2021) • Unikernel Linux (EuroSys 2023) • ライブラリ OS • VirtuOS (SOSP 2013) • EbbRT (OSDI 2016) • Demikernel (SOSP 2021) • アプリのコードを検証後カーネルで実⾏ • Privbox (USENIX ATC 2022) • Userspace bypass (OSDI 2023) 0 0.02 0.04 0.06 0.08 0.1 microvm lupine-nokml lupine lupine-general hermitux osv rump .19.17 Latency (μs) null read write Figure 9. System call latency via lmbench. 論⽂中グラフより 111 Hsuan-Chi Kuo, Dan Williams, Ricardo Koller, and Sibin Mohan. 2020. A Linux in Unikernel Clothing. In Proceedings of the Fifteenth European Conference on Computer Systems (EuroSys ʼ 20).(https://doi.org/10.1145/3342195.3387526)
  58. システムコールの頻度を減らす • アプリとカーネルの境界をなくす • Unikernels • Mirage (ASPLOS 2013) •

    OSv (USENIX ATC 2014) • Lupin Linux (EuroSys 2020) • Unikraft (EuroSys 2021) • Unikernel Linux (EuroSys 2023) • ライブラリ OS • VirtuOS (SOSP 2013) • EbbRT (OSDI 2016) • Demikernel (SOSP 2021) • アプリのコードを検証後カーネルで実⾏ • Privbox (USENIX ATC 2022) • Userspace bypass (OSDI 2023) 0 0.02 0.04 0.06 0.08 0.1 microvm lupine-nokml lupine lupine-ge Latency (μs) null read write 論⽂中グラフより 拡⼤ 112 Hsuan-Chi Kuo, Dan Williams, Ricardo Koller, and Sibin Mohan. 2020. A Linux in Unikernel Clothing. In Proceedings of the Fifteenth European Conference on Computer Systems (EuroSys ʼ 20).(https://doi.org/10.1145/3342195.3387526)
  59. システムコールの頻度を減らす • アプリとカーネルの境界をなくす • Unikernels • Mirage (ASPLOS 2013) •

    OSv (USENIX ATC 2014) • Lupin Linux (EuroSys 2020) • Unikraft (EuroSys 2021) • Unikernel Linux (EuroSys 2023) • ライブラリ OS • VirtuOS (SOSP 2013) • EbbRT (OSDI 2016) • Demikernel (SOSP 2021) • アプリのコードを検証後カーネルで実⾏ • Privbox (USENIX ATC 2022) • Userspace bypass (OSDI 2023) 0 0.02 0.04 0.06 0.08 0.1 microvm lupine-nokml lupine lupine-ge Latency (μs) null read write 論⽂中グラフより 拡⼤ 113 Hsuan-Chi Kuo, Dan Williams, Ricardo Koller, and Sibin Mohan. 2020. A Linux in Unikernel Clothing. In Proceedings of the Fifteenth European Conference on Computer Systems (EuroSys ʼ 20).(https://doi.org/10.1145/3342195.3387526)
  60. システムコールの頻度を減らす • アプリとカーネルの境界をなくす • Unikernels • Mirage (ASPLOS 2013) •

    OSv (USENIX ATC 2014) • Lupin Linux (EuroSys 2020) • Unikraft (EuroSys 2021) • Unikernel Linux (EuroSys 2023) • ライブラリ OS • VirtuOS (SOSP 2013) • EbbRT (OSDI 2016) • Demikernel (SOSP 2021) • アプリのコードを検証後カーネルで実⾏ • Privbox (USENIX ATC 2022) • Userspace bypass (OSDI 2023) 114
  61. システムコールの頻度を減らす • アプリとカーネルの境界をなくす • Unikernels • Mirage (ASPLOS 2013) •

    OSv (USENIX ATC 2014) • Lupin Linux (EuroSys 2020) • Unikraft (EuroSys 2021) • Unikernel Linux (EuroSys 2023) • ライブラリ OS • VirtuOS (SOSP 2013) • EbbRT (OSDI 2016) • Demikernel (SOSP 2021) • アプリのコードを検証後カーネルで実⾏ • Privbox (USENIX ATC 2022) • Userspace bypass (OSDI 2023) 既存の Linux 実装を使いたい 115
  62. システムコールの頻度を減らす • アプリとカーネルの境界をなくす • Unikernels • Mirage (ASPLOS 2013) •

    OSv (USENIX ATC 2014) • Lupin Linux (EuroSys 2020) • Unikraft (EuroSys 2021) • Unikernel Linux (EuroSys 2023) • ライブラリ OS • VirtuOS (SOSP 2013) • EbbRT (OSDI 2016) • Demikernel (SOSP 2021) • アプリのコードを検証後カーネルで実⾏ • Privbox (USENIX ATC 2022) • Userspace bypass (OSDI 2023) 既存の Linux 実装を使いたい 開発を簡単にしたい 開発を簡単にしたい 116
  63. システムコールの頻度を減らす • アプリとカーネルの境界をなくす • Unikernels • Mirage (ASPLOS 2013) •

    OSv (USENIX ATC 2014) • Lupin Linux (EuroSys 2020) • Unikraft (EuroSys 2021) • Unikernel Linux (EuroSys 2023) • ライブラリ OS • VirtuOS (SOSP 2013) • EbbRT (OSDI 2016) • Demikernel (SOSP 2021) • アプリのコードを検証後カーネルで実⾏ • Privbox (USENIX ATC 2022) • Userspace bypass (OSDI 2023) 既存の Linux 実装を使いたい 開発を簡単にしたい 開発を簡単にしたい I/O デバイスの差異を吸収したい 117
  64. システムコールの頻度を減らす • アプリとカーネルの境界をなくす • Unikernels • Mirage (ASPLOS 2013) •

    OSv (USENIX ATC 2014) • Lupin Linux (EuroSys 2020) • Unikraft (EuroSys 2021) • Unikernel Linux (EuroSys 2023) • ライブラリ OS • VirtuOS (SOSP 2013) • EbbRT (OSDI 2016) • Demikernel (SOSP 2021) • アプリのコードを検証後カーネルで実⾏ • Privbox (USENIX ATC 2022) • Userspace bypass (OSDI 2023) 既存の Linux 実装を使いたい 開発を簡単にしたい 開発を簡単にしたい I/O デバイスの差異を吸収したい 既存のカーネル機能が使える 118
  65. 通信関連のシステムソフトウェア データセンター サービス利⽤者の端末 サービス提供側 インターネット ⼤量のリクエストが集まってくる サービス提供側はなるべく短い応答時間でサービスを提供したい データセンター内のサーバー NIC 10

    ~ Gbps 通信関連ソフトウェア NIC デバイスドライバ TCP/IP スタック アプリケーション ユーザー空間 カーネル 121 既存の仕組みだと⽐較的処理が軽い UDP でも ⼩さいパケットを⾼速にやりとりできなかった
  66. NIC と通信関連プログラムの構成 NIC デバイスドライバ TCP/IP スタック アプリケーション ユーザー空間 カーネル DMA

    NIC レジスタ • デスクリプタリング位置 ソフトウェア(デバドラ)は メモリを通じてアクセス 125
  67. NIC と通信関連プログラムの構成 NIC デバイスドライバ TCP/IP スタック アプリケーション ユーザー空間 カーネル DMA

    NIC レジスタ • デスクリプタリング位置 送信⽤ デスクリプタリング 受信⽤ ソフトウェアが任意の 位置(メモリアドレス) に配置できる ソフトウェア(デバドラ)は メモリを通じてアクセス 126
  68. NIC と通信関連プログラムの構成 NIC デバイスドライバ TCP/IP スタック アプリケーション ユーザー空間 カーネル DMA

    NIC レジスタ • デスクリプタリング位置 送信⽤ デスクリプタリング 受信⽤ ソフトウェアが任意の 位置(メモリアドレス) に配置できる ソフトウェア(デバドラ)は メモリを通じてアクセス 127 NIC の送受信キューを表現するデータ構造 (NIC のハードウェア仕様中で定義される)
  69. NIC と通信関連プログラムの構成 NIC デバイスドライバ TCP/IP スタック アプリケーション ユーザー空間 カーネル DMA

    NIC レジスタ • デスクリプタリング位置 送信⽤ デスクリプタリング 受信⽤ ソフトウェアが任意の 位置(メモリアドレス) に配置できる • パケットバッファのメモリアドレス • パケットのサイズ • その他:状態保持⽤フラグ デスクリプタが保持する内容 ソフトウェア(デバドラ)は メモリを通じてアクセス 128 NIC の送受信キューを表現するデータ構造 (NIC のハードウェア仕様中で定義される)
  70. NIC と通信関連プログラムの構成 NIC デバイスドライバ TCP/IP スタック アプリケーション ユーザー空間 カーネル DMA

    NIC レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail 送信⽤ デスクリプタリング 受信⽤ ソフトウェア(デバドラ)は メモリを通じてアクセス 129 • パケットバッファのメモリアドレス • パケットのサイズ • その他:状態保持⽤フラグ デスクリプタが保持する内容 NIC の送受信キューを表現するデータ構造 (NIC のハードウェア仕様中で定義される)
  71. NIC と通信関連プログラムの構成 NIC デバイスドライバ TCP/IP スタック アプリケーション ユーザー空間 カーネル DMA

    NIC レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail 送信⽤ デスクリプタリング 受信⽤ ソフトウェア(デバドラ)は メモリを通じてアクセス 130 • パケットバッファのメモリアドレス • パケットのサイズ • その他:状態保持⽤フラグ デスクリプタが保持する内容 NIC の送受信キューを表現するデータ構造 (NIC のハードウェア仕様中で定義される)
  72. NIC と通信関連プログラムの構成 送信⽤ NIC デバイスドライバ TCP/IP スタック アプリケーション ユーザー空間 カーネル

    デスクリプタリング 受信⽤ NIC レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail DMA 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス 131 • パケットバッファのメモリアドレス • パケットのサイズ • その他:状態保持⽤フラグ デスクリプタが保持する内容 NIC の送受信キューを表現するデータ構造 (NIC のハードウェア仕様中で定義される)
  73. NIC と通信関連プログラムの構成 送信⽤ NIC デバイスドライバ TCP/IP スタック アプリケーション ユーザー空間 カーネル

    デスクリプタリング 受信⽤ NIC レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail DMA 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス 132 • パケットバッファのメモリアドレス • パケットのサイズ • その他:状態保持⽤フラグ デスクリプタが保持する内容 NIC の送受信キューを表現するデータ構造 (NIC のハードウェア仕様中で定義される)
  74. NIC と通信関連プログラムの構成 送信⽤ NIC デバイスドライバ TCP/IP スタック アプリケーション ユーザー空間 カーネル

    デスクリプタリング 受信⽤ NIC レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail DMA 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス 133 • パケットバッファのメモリアドレス • パケットのサイズ • その他:状態保持⽤フラグ デスクリプタが保持する内容 NIC の送受信キューを表現するデータ構造 (NIC のハードウェア仕様中で定義される) メモリ上の概観 . . . メモリ領域(DRAM)
  75. NIC と通信関連プログラムの構成 送信⽤ NIC デバイスドライバ TCP/IP スタック アプリケーション ユーザー空間 カーネル

    デスクリプタリング 受信⽤ NIC レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail DMA 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス 134 • パケットバッファのメモリアドレス • パケットのサイズ • その他:状態保持⽤フラグ デスクリプタが保持する内容 NIC の送受信キューを表現するデータ構造 (NIC のハードウェア仕様中で定義される) デスクリプタリング位置 転送リング head 転送リング tail 受信リング head 受信リング tail . . . . . . メモリ上の概観
  76. NIC と通信関連プログラムの構成 送信⽤ NIC デバイスドライバ TCP/IP スタック アプリケーション ユーザー空間 カーネル

    デスクリプタリング 受信⽤ NIC レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail DMA 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス 135 • パケットバッファのメモリアドレス • パケットのサイズ • その他:状態保持⽤フラグ デスクリプタが保持する内容 NIC の送受信キューを表現するデータ構造 (NIC のハードウェア仕様中で定義される) デスクリプタリング位置 転送リング head 転送リング tail 受信リング head 受信リング tail . . . . . . メモリ上の概観 ソフトウェアはメモリを通じて NIC のレジスタにアクセス可能
  77. NIC と通信関連プログラムの構成 送信⽤ NIC デバイスドライバ TCP/IP スタック アプリケーション ユーザー空間 カーネル

    デスクリプタリング 受信⽤ NIC レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail DMA 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス 136 • パケットバッファのメモリアドレス • パケットのサイズ • その他:状態保持⽤フラグ デスクリプタが保持する内容 NIC の送受信キューを表現するデータ構造 (NIC のハードウェア仕様中で定義される) デスクリプタリング位置 転送リング head 転送リング tail 受信リング head 受信リング tail . . . . . . メモリ上の概観
  78. NIC と通信関連プログラムの構成 送信⽤ NIC デバイスドライバ TCP/IP スタック アプリケーション ユーザー空間 カーネル

    デスクリプタリング 受信⽤ NIC レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail DMA 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス 137 • パケットバッファのメモリアドレス • パケットのサイズ • その他:状態保持⽤フラグ デスクリプタが保持する内容 NIC の送受信キューを表現するデータ構造 (NIC のハードウェア仕様中で定義される) デスクリプタリング位置 転送リング head 転送リング tail 受信リング head 受信リング tail . . . . . . メモリ上の概観
  79. NIC と通信関連プログラムの構成 送信⽤ NIC デバイスドライバ TCP/IP スタック アプリケーション ユーザー空間 カーネル

    デスクリプタリング 受信⽤ NIC レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail DMA 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス 138 • パケットバッファのメモリアドレス • パケットのサイズ • その他:状態保持⽤フラグ デスクリプタが保持する内容 NIC の送受信キューを表現するデータ構造 (NIC のハードウェア仕様中で定義される) デスクリプタリング位置 転送リング head 転送リング tail 受信リング head 受信リング tail . . . . . . メモリ上の概観
  80. NIC と通信関連プログラムの構成 送信⽤ NIC デバイスドライバ TCP/IP スタック アプリケーション ユーザー空間 カーネル

    デスクリプタリング 受信⽤ NIC レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail DMA 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス 139 • パケットバッファのメモリアドレス • パケットのサイズ • その他:状態保持⽤フラグ デスクリプタが保持する内容 NIC の送受信キューを表現するデータ構造 (NIC のハードウェア仕様中で定義される) デスクリプタリング位置 転送リング head 転送リング tail 受信リング head 受信リング tail . . . . . . メモリ上の概観
  81. NIC と通信関連プログラムの構成 送信⽤ NIC デバイスドライバ TCP/IP スタック アプリケーション ユーザー空間 カーネル

    デスクリプタリング 受信⽤ NIC レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail DMA 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス 140 • パケットバッファのメモリアドレス • パケットのサイズ • その他:状態保持⽤フラグ デスクリプタが保持する内容 NIC の送受信キューを表現するデータ構造 (NIC のハードウェア仕様中で定義される) デスクリプタリング位置 転送リング head 転送リング tail 受信リング head 受信リング tail . . . . . . メモリ上の概観
  82. NIC と通信関連プログラムの構成 送信⽤ NIC デバイスドライバ TCP/IP スタック アプリケーション ユーザー空間 カーネル

    デスクリプタリング 受信⽤ NIC レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail DMA 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス 141 • パケットバッファのメモリアドレス • パケットのサイズ • その他:状態保持⽤フラグ デスクリプタが保持する内容 NIC の送受信キューを表現するデータ構造 (NIC のハードウェア仕様中で定義される) デスクリプタリング位置 転送リング head 転送リング tail 受信リング head 受信リング tail . . . . . . メモリ上の概観
  83. NIC と通信関連プログラムの構成 送信⽤ NIC デバイスドライバ TCP/IP スタック アプリケーション ユーザー空間 カーネル

    デスクリプタリング 受信⽤ NIC レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail DMA 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス 142 • パケットバッファのメモリアドレス • パケットのサイズ • その他:状態保持⽤フラグ デスクリプタが保持する内容 NIC の送受信キューを表現するデータ構造 (NIC のハードウェア仕様中で定義される) デスクリプタリング位置 転送リング head 転送リング tail 受信リング head 受信リング tail . . . . . . メモリ上の概観 ソフトウェア(デバドラ)は初期設定 として、まずデスクリプタリング⽤に 連続的なメモリ領域を確保
  84. NIC と通信関連プログラムの構成 送信⽤ NIC デバイスドライバ TCP/IP スタック アプリケーション ユーザー空間 カーネル

    デスクリプタリング 受信⽤ NIC レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail DMA 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス 143 • パケットバッファのメモリアドレス • パケットのサイズ • その他:状態保持⽤フラグ デスクリプタが保持する内容 NIC の送受信キューを表現するデータ構造 (NIC のハードウェア仕様中で定義される) デスクリプタリング位置 転送リング head 転送リング tail 受信リング head 受信リング tail . . . . . . メモリ上の概観 . . . ソフトウェア(デバドラ)は初期設定 として、まずデスクリプタリング⽤に 連続的なメモリ領域を確保 . . .
  85. NIC と通信関連プログラムの構成 送信⽤ NIC デバイスドライバ TCP/IP スタック アプリケーション ユーザー空間 カーネル

    デスクリプタリング 受信⽤ NIC レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail DMA 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス 144 • パケットバッファのメモリアドレス • パケットのサイズ • その他:状態保持⽤フラグ デスクリプタが保持する内容 NIC の送受信キューを表現するデータ構造 (NIC のハードウェア仕様中で定義される) デスクリプタリング位置 転送リング head 転送リング tail 受信リング head 受信リング tail . . . . . . メモリ上の概観 . . . NIC レジスタのデスクリプタリング位置 を保持するフィールドへ 確保した連続的なメモリ領域の 先頭アドレスを代⼊する . . .
  86. NIC と通信関連プログラムの構成 送信⽤ NIC デバイスドライバ TCP/IP スタック アプリケーション ユーザー空間 カーネル

    デスクリプタリング 受信⽤ NIC レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail DMA 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス 145 • パケットバッファのメモリアドレス • パケットのサイズ • その他:状態保持⽤フラグ デスクリプタが保持する内容 NIC の送受信キューを表現するデータ構造 (NIC のハードウェア仕様中で定義される) デスクリプタリング位置 転送リング head 転送リング tail 受信リング head 受信リング tail . . . . . . メモリ上の概観 . . . NIC レジスタのデスクリプタリング位置 を保持するフィールドへ 確保した連続的なメモリ領域の 先頭アドレスを代⼊する . . .
  87. NIC と通信関連プログラムの構成 送信⽤ NIC デバイスドライバ TCP/IP スタック アプリケーション ユーザー空間 カーネル

    デスクリプタリング 受信⽤ NIC レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail DMA 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス 146 • パケットバッファのメモリアドレス • パケットのサイズ • その他:状態保持⽤フラグ デスクリプタが保持する内容 NIC の送受信キューを表現するデータ構造 (NIC のハードウェア仕様中で定義される) デスクリプタリング位置 転送リング head 転送リング tail 受信リング head 受信リング tail . . . . . . . . . デスクリプタ[0] デスクリプタ[1] デスクリプタ[2] メモリ上の概観 これで、 確保した連続的なメモリ領域が デスクリプタの配列として NIC から認識される . . . スペースの都合で転送⽤デスクリプタは省略しています
  88. NIC と通信関連プログラムの構成 送信⽤ NIC デバイスドライバ TCP/IP スタック アプリケーション ユーザー空間 カーネル

    デスクリプタリング 受信⽤ NIC レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail DMA 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス 147 • パケットバッファのメモリアドレス • パケットのサイズ • その他:状態保持⽤フラグ デスクリプタが保持する内容 NIC の送受信キューを表現するデータ構造 (NIC のハードウェア仕様中で定義される) デスクリプタリング位置 転送リング head 転送リング tail 受信リング head 受信リング tail . . . . . . . . . デスクリプタ[0] デスクリプタ[1] デスクリプタ[2] メモリ上の概観 これで、 確保した連続的なメモリ領域が デスクリプタの配列として NIC から認識される . . . スペースの都合で転送⽤デスクリプタは省略しています
  89. NIC と通信関連プログラムの構成 送信⽤ NIC デバイスドライバ TCP/IP スタック アプリケーション ユーザー空間 カーネル

    デスクリプタリング 受信⽤ NIC レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail DMA 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス 148 • パケットバッファのメモリアドレス • パケットのサイズ • その他:状態保持⽤フラグ デスクリプタが保持する内容 NIC の送受信キューを表現するデータ構造 (NIC のハードウェア仕様中で定義される) デスクリプタリング位置 転送リング head 転送リング tail 受信リング head 受信リング tail . . . . . . . . . デスクリプタ[0] デスクリプタ[1] デスクリプタ[2] メモリ上の概観 NIC レジスタのうち、 リングの head, tail を保持する レジスタは、デスクリプタ配列の インデックスを保持する . . . スペースの都合で転送⽤デスクリプタは省略しています
  90. NIC と通信関連プログラムの構成 送信⽤ NIC デバイスドライバ TCP/IP スタック アプリケーション ユーザー空間 カーネル

    デスクリプタリング 受信⽤ NIC レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail DMA 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス 149 • パケットバッファのメモリアドレス • パケットのサイズ • その他:状態保持⽤フラグ デスクリプタが保持する内容 NIC の送受信キューを表現するデータ構造 (NIC のハードウェア仕様中で定義される) デスクリプタリング位置 転送リング head 転送リング tail 受信リング head 受信リング tail . . . . . . . . . デスクリプタ[0] デスクリプタ[1] デスクリプタ[2] メモリ上の概観 NIC レジスタのうち、 リングの head, tail を保持する レジスタは、デスクリプタ配列の インデックスを保持する . . . スペースの都合で転送⽤デスクリプタは省略しています
  91. NIC と通信関連プログラムの構成 送信⽤ NIC デバイスドライバ TCP/IP スタック アプリケーション ユーザー空間 カーネル

    デスクリプタリング 受信⽤ NIC レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail DMA 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス 150 • パケットバッファのメモリアドレス • パケットのサイズ • その他:状態保持⽤フラグ デスクリプタが保持する内容 NIC の送受信キューを表現するデータ構造 (NIC のハードウェア仕様中で定義される) デスクリプタリング位置 転送リング head 転送リング tail 受信リング head 受信リング tail . . . . . . . . . デスクリプタ[0] デスクリプタ[1] デスクリプタ[2] メモリ上の概観 . . . スペースの都合で転送⽤デスクリプタは省略しています
  92. NIC と通信関連プログラムの構成 送信⽤ NIC デバイスドライバ TCP/IP スタック アプリケーション ユーザー空間 カーネル

    デスクリプタリング 受信⽤ NIC レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail DMA 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス 151 • パケットバッファのメモリアドレス • パケットのサイズ • その他:状態保持⽤フラグ デスクリプタが保持する内容 NIC の送受信キューを表現するデータ構造 (NIC のハードウェア仕様中で定義される) デスクリプタリング位置 転送リング head 転送リング tail 受信リング head 受信リング tail . . . . . . . . . デスクリプタ[0] デスクリプタ[1] デスクリプタ[2] メモリ上の概観 . . . スペースの都合で転送⽤デスクリプタは省略しています 次に、ソフトウェア(デバドラ)は パケットバッファ⽤メモリを確保する
  93. NIC と通信関連プログラムの構成 送信⽤ NIC デバイスドライバ TCP/IP スタック アプリケーション ユーザー空間 カーネル

    デスクリプタリング 受信⽤ NIC レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail DMA 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス 152 • パケットバッファのメモリアドレス • パケットのサイズ • その他:状態保持⽤フラグ デスクリプタが保持する内容 NIC の送受信キューを表現するデータ構造 (NIC のハードウェア仕様中で定義される) デスクリプタリング位置 転送リング head 転送リング tail 受信リング head 受信リング tail . . . . . . . . . デスクリプタ[0] デスクリプタ[1] デスクリプタ[2] メモリ上の概観 . . . スペースの都合で転送⽤デスクリプタは省略しています パケットバッファ パケットバッファ . . . パケットバッファ
  94. NIC と通信関連プログラムの構成 送信⽤ NIC デバイスドライバ TCP/IP スタック アプリケーション ユーザー空間 カーネル

    デスクリプタリング 受信⽤ NIC レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail DMA 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス 153 • パケットバッファのメモリアドレス • パケットのサイズ • その他:状態保持⽤フラグ デスクリプタが保持する内容 NIC の送受信キューを表現するデータ構造 (NIC のハードウェア仕様中で定義される) デスクリプタリング位置 転送リング head 転送リング tail 受信リング head 受信リング tail . . . . . . . . . デスクリプタ[0] デスクリプタ[1] デスクリプタ[2] メモリ上の概観 . . . スペースの都合で転送⽤デスクリプタは省略しています パケットバッファ パケットバッファ . . . パケットバッファ
  95. NIC と通信関連プログラムの構成 送信⽤ NIC デバイスドライバ TCP/IP スタック アプリケーション ユーザー空間 カーネル

    デスクリプタリング 受信⽤ NIC レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail DMA 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス 154 • パケットバッファのメモリアドレス • パケットのサイズ • その他:状態保持⽤フラグ デスクリプタが保持する内容 NIC の送受信キューを表現するデータ構造 (NIC のハードウェア仕様中で定義される) デスクリプタリング位置 転送リング head 転送リング tail 受信リング head 受信リング tail . . . . . . . . . デスクリプタ[0] デスクリプタ[1] デスクリプタ[2] メモリ上の概観 . . . スペースの都合で転送⽤デスクリプタは省略しています パケットバッファ パケットバッファ . . . パケットバッファ ソフトウェア(デバドラ)はデスクリプタの フィールドにパケットバッファのアドレス を書き込むことで NIC への紐付けを⾏う
  96. NIC と通信関連プログラムの構成 送信⽤ NIC デバイスドライバ TCP/IP スタック アプリケーション ユーザー空間 カーネル

    デスクリプタリング 受信⽤ NIC レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail DMA 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス 155 • パケットバッファのメモリアドレス • パケットのサイズ • その他:状態保持⽤フラグ デスクリプタが保持する内容 NIC の送受信キューを表現するデータ構造 (NIC のハードウェア仕様中で定義される) デスクリプタリング位置 転送リング head 転送リング tail 受信リング head 受信リング tail . . . . . . . . . デスクリプタ[0] デスクリプタ[1] デスクリプタ[2] メモリ上の概観 . . . スペースの都合で転送⽤デスクリプタは省略しています パケットバッファ パケットバッファ . . . パケットバッファ ソフトウェア(デバドラ)はデスクリプタの フィールドにパケットバッファのアドレス を書き込むことで NIC への紐付けを⾏う
  97. NIC と通信関連プログラムの構成 送信⽤ NIC デバイスドライバ TCP/IP スタック アプリケーション ユーザー空間 カーネル

    デスクリプタリング 受信⽤ NIC レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail DMA 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス 156 • パケットバッファのメモリアドレス • パケットのサイズ • その他:状態保持⽤フラグ デスクリプタが保持する内容 NIC の送受信キューを表現するデータ構造 (NIC のハードウェア仕様中で定義される) デスクリプタリング位置 転送リング head 転送リング tail 受信リング head 受信リング tail . . . . . . . . . デスクリプタ[0] デスクリプタ[1] デスクリプタ[2] メモリ上の概観 . . . スペースの都合で転送⽤デスクリプタは省略しています パケットバッファ パケットバッファ . . . パケットバッファ ソフトウェア(デバドラ)はデスクリプタの フィールドにパケットバッファのアドレス を書き込むことで NIC への紐付けを⾏う
  98. NIC と通信関連プログラムの構成 送信⽤ NIC デバイスドライバ TCP/IP スタック アプリケーション ユーザー空間 カーネル

    デスクリプタリング 受信⽤ NIC レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail DMA 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス 157 • パケットバッファのメモリアドレス • パケットのサイズ • その他:状態保持⽤フラグ デスクリプタが保持する内容 NIC の送受信キューを表現するデータ構造 (NIC のハードウェア仕様中で定義される) デスクリプタリング位置 転送リング head 転送リング tail 受信リング head 受信リング tail . . . . . . . . . デスクリプタ[0] デスクリプタ[1] デスクリプタ[2] メモリ上の概観 . . . スペースの都合で転送⽤デスクリプタは省略しています パケットバッファ パケットバッファ . . . パケットバッファ ソフトウェア(デバドラ)はデスクリプタの フィールドにパケットバッファのアドレス を書き込むことで NIC への紐付けを⾏う
  99. NIC と通信関連プログラムの構成 送信⽤ NIC デバイスドライバ TCP/IP スタック アプリケーション ユーザー空間 カーネル

    デスクリプタリング 受信⽤ NIC レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail DMA 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス 158 • パケットバッファのメモリアドレス • パケットのサイズ • その他:状態保持⽤フラグ デスクリプタが保持する内容 NIC の送受信キューを表現するデータ構造 (NIC のハードウェア仕様中で定義される) デスクリプタリング位置 転送リング head 転送リング tail 受信リング head 受信リング tail . . . . . . . . . デスクリプタ[0] デスクリプタ[1] デスクリプタ[2] メモリ上の概観 . . . スペースの都合で転送⽤デスクリプタは省略しています パケットバッファ パケットバッファ . . . パケットバッファ ソフトウェア(デバドラ)はデスクリプタの フィールドにパケットバッファのアドレス を書き込むことで NIC への紐付けを⾏う
  100. NIC と通信関連プログラムの構成 送信⽤ NIC デバイスドライバ TCP/IP スタック アプリケーション ユーザー空間 カーネル

    デスクリプタリング 受信⽤ NIC レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail DMA 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス 159 • パケットバッファのメモリアドレス • パケットのサイズ • その他:状態保持⽤フラグ デスクリプタが保持する内容 NIC の送受信キューを表現するデータ構造 (NIC のハードウェア仕様中で定義される) デスクリプタリング位置 転送リング head 転送リング tail 受信リング head 受信リング tail . . . . . . . . . デスクリプタ[0] デスクリプタ[1] デスクリプタ[2] メモリ上の概観 . . . スペースの都合で転送⽤デスクリプタは省略しています パケットバッファ パケットバッファ . . . パケットバッファ ソフトウェア(デバドラ)はデスクリプタの フィールドにパケットバッファのアドレス を書き込むことで NIC への紐付けを⾏う
  101. NIC と通信関連プログラムの構成 送信⽤ NIC デバイスドライバ TCP/IP スタック アプリケーション ユーザー空間 カーネル

    デスクリプタリング 受信⽤ NIC レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail DMA 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス 160 • パケットバッファのメモリアドレス • パケットのサイズ • その他:状態保持⽤フラグ デスクリプタが保持する内容 NIC の送受信キューを表現するデータ構造 (NIC のハードウェア仕様中で定義される) デスクリプタリング位置 転送リング head 転送リング tail 受信リング head 受信リング tail . . . . . . . . . デスクリプタ[0] デスクリプタ[1] デスクリプタ[2] メモリ上の概観 . . . スペースの都合で転送⽤デスクリプタは省略しています パケットバッファ パケットバッファ . . . パケットバッファ ソフトウェア(デバドラ)はデスクリプタの フィールドにパケットバッファのアドレス を書き込むことで NIC への紐付けを⾏う
  102. NIC と通信関連プログラムの構成 送信⽤ NIC デバイスドライバ TCP/IP スタック アプリケーション ユーザー空間 カーネル

    デスクリプタリング 受信⽤ NIC レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail DMA 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス 161 • パケットバッファのメモリアドレス • パケットのサイズ • その他:状態保持⽤フラグ デスクリプタが保持する内容 NIC の送受信キューを表現するデータ構造 (NIC のハードウェア仕様中で定義される) デスクリプタリング位置 転送リング head 転送リング tail 受信リング head 受信リング tail . . . . . . . . . デスクリプタ[0] デスクリプタ[1] デスクリプタ[2] メモリ上の概観 . . . スペースの都合で転送⽤デスクリプタは省略しています パケットバッファ パケットバッファ . . . パケットバッファ ソフトウェア(デバドラ)はデスクリプタの フィールドにパケットバッファのアドレス を書き込むことで NIC への紐付けを⾏う
  103. NIC と通信関連プログラムの構成 送信⽤ NIC デバイスドライバ TCP/IP スタック アプリケーション ユーザー空間 カーネル

    デスクリプタリング 受信⽤ NIC レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail DMA 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス 162 • パケットバッファのメモリアドレス • パケットのサイズ • その他:状態保持⽤フラグ デスクリプタが保持する内容 NIC の送受信キューを表現するデータ構造 (NIC のハードウェア仕様中で定義される) デスクリプタリング位置 転送リング head 転送リング tail 受信リング head 受信リング tail . . . . . . . . . デスクリプタ[0] デスクリプタ[1] デスクリプタ[2] メモリ上の概観 . . . スペースの都合で転送⽤デスクリプタは省略しています パケットバッファ パケットバッファ . . . パケットバッファ
  104. NIC と通信関連プログラムの構成 送信⽤ NIC デバイスドライバ TCP/IP スタック アプリケーション ユーザー空間 カーネル

    デスクリプタリング 受信⽤ NIC レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail DMA 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス 163 • パケットバッファのメモリアドレス • パケットのサイズ • その他:状態保持⽤フラグ デスクリプタが保持する内容 NIC の送受信キューを表現するデータ構造 (NIC のハードウェア仕様中で定義される) デスクリプタリング位置 転送リング head 転送リング tail 受信リング head 受信リング tail . . . . . . . . . デスクリプタ[0] デスクリプタ[1] デスクリプタ[2] メモリ上の概観 . . . スペースの都合で転送⽤デスクリプタは省略しています パケットバッファ パケットバッファ . . . パケットバッファ 新規パケットの到着
  105. NIC と通信関連プログラムの構成 送信⽤ NIC デバイスドライバ TCP/IP スタック アプリケーション ユーザー空間 カーネル

    デスクリプタリング 受信⽤ NIC レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail DMA 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス 164 • パケットバッファのメモリアドレス • パケットのサイズ • その他:状態保持⽤フラグ デスクリプタが保持する内容 NIC の送受信キューを表現するデータ構造 (NIC のハードウェア仕様中で定義される) デスクリプタリング位置 転送リング head 転送リング tail 受信リング head 受信リング tail . . . . . . . . . デスクリプタ[0] デスクリプタ[1] デスクリプタ[2] メモリ上の概観 . . . スペースの都合で転送⽤デスクリプタは省略しています パケットバッファ パケットバッファ . . . パケットバッファ 受信したデータはデスクリプタ経由で 紐づけられたパケットバッファへ書き込まれる 新規パケットの到着
  106. NIC と通信関連プログラムの構成 送信⽤ NIC デバイスドライバ TCP/IP スタック アプリケーション ユーザー空間 カーネル

    デスクリプタリング 受信⽤ NIC レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail DMA 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス 165 • パケットバッファのメモリアドレス • パケットのサイズ • その他:状態保持⽤フラグ デスクリプタが保持する内容 NIC の送受信キューを表現するデータ構造 (NIC のハードウェア仕様中で定義される) デスクリプタリング位置 転送リング head 転送リング tail 受信リング head 受信リング tail . . . . . . . . . デスクリプタ[0] デスクリプタ[1] デスクリプタ[2] メモリ上の概観 . . . スペースの都合で転送⽤デスクリプタは省略しています パケットバッファ パケットバッファ . . . パケットバッファ 受信したデータはデスクリプタ経由で 紐づけられたパケットバッファへ書き込まれる 新規パケットの到着
  107. NIC と通信関連プログラムの構成 送信⽤ NIC デバイスドライバ TCP/IP スタック アプリケーション ユーザー空間 カーネル

    デスクリプタリング 受信⽤ NIC レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail DMA 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス 166 • パケットバッファのメモリアドレス • パケットのサイズ • その他:状態保持⽤フラグ デスクリプタが保持する内容 NIC の送受信キューを表現するデータ構造 (NIC のハードウェア仕様中で定義される) デスクリプタリング位置 転送リング head 転送リング tail 受信リング head 受信リング tail . . . . . . . . . デスクリプタ[0] デスクリプタ[1] デスクリプタ[2] メモリ上の概観 . . . スペースの都合で転送⽤デスクリプタは省略しています パケットバッファ パケットバッファ . . . パケットバッファ NIC は受信したパケットのサイズを 紐付けを⾏っているデスクリプタの フィールドに反映する 新規パケットの到着
  108. NIC と通信関連プログラムの構成 送信⽤ NIC デバイスドライバ TCP/IP スタック アプリケーション ユーザー空間 カーネル

    デスクリプタリング 受信⽤ NIC レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail DMA 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス 167 • パケットバッファのメモリアドレス • パケットのサイズ • その他:状態保持⽤フラグ デスクリプタが保持する内容 NIC の送受信キューを表現するデータ構造 (NIC のハードウェア仕様中で定義される) デスクリプタリング位置 転送リング head 転送リング tail 受信リング head 受信リング tail . . . . . . . . . デスクリプタ[0] デスクリプタ[1] デスクリプタ[2] メモリ上の概観 . . . スペースの都合で転送⽤デスクリプタは省略しています パケットバッファ パケットバッファ . . . パケットバッファ NIC は受信したパケットのサイズを 紐付けを⾏っているデスクリプタの フィールドに反映する 新規パケットの到着
  109. NIC と通信関連プログラムの構成 送信⽤ NIC デバイスドライバ TCP/IP スタック アプリケーション ユーザー空間 カーネル

    デスクリプタリング 受信⽤ NIC レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail DMA 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス 168 • パケットバッファのメモリアドレス • パケットのサイズ • その他:状態保持⽤フラグ デスクリプタが保持する内容 NIC の送受信キューを表現するデータ構造 (NIC のハードウェア仕様中で定義される) デスクリプタリング位置 転送リング head 転送リング tail 受信リング head 受信リング tail . . . . . . . . . デスクリプタ[0] デスクリプタ[1] デスクリプタ[2] メモリ上の概観 . . . スペースの都合で転送⽤デスクリプタは省略しています パケットバッファ パケットバッファ . . . パケットバッファ NIC は受信したパケットのサイズを 紐付けを⾏っているデスクリプタの フィールドに反映する 新規パケットの到着
  110. NIC と通信関連プログラムの構成 送信⽤ NIC デバイスドライバ TCP/IP スタック アプリケーション ユーザー空間 カーネル

    デスクリプタリング 受信⽤ NIC レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail DMA 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス 169 • パケットバッファのメモリアドレス • パケットのサイズ • その他:状態保持⽤フラグ デスクリプタが保持する内容 NIC の送受信キューを表現するデータ構造 (NIC のハードウェア仕様中で定義される) デスクリプタリング位置 転送リング head 転送リング tail 受信リング head 受信リング tail . . . . . . . . . デスクリプタ[0] デスクリプタ[1] デスクリプタ[2] メモリ上の概観 . . . スペースの都合で転送⽤デスクリプタは省略しています パケットバッファ パケットバッファ . . . パケットバッファ その後、NIC によって、 レジスタの受信リング head の値が更新される 新規パケットの到着
  111. NIC と通信関連プログラムの構成 送信⽤ NIC デバイスドライバ TCP/IP スタック アプリケーション ユーザー空間 カーネル

    デスクリプタリング 受信⽤ NIC レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail DMA 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス 170 • パケットバッファのメモリアドレス • パケットのサイズ • その他:状態保持⽤フラグ デスクリプタが保持する内容 NIC の送受信キューを表現するデータ構造 (NIC のハードウェア仕様中で定義される) デスクリプタリング位置 転送リング head 転送リング tail 受信リング head 受信リング tail . . . . . . . . . デスクリプタ[0] デスクリプタ[1] デスクリプタ[2] メモリ上の概観 . . . スペースの都合で転送⽤デスクリプタは省略しています パケットバッファ パケットバッファ . . . パケットバッファ その後、NIC によって、 レジスタの受信リング head の値が更新される 新規パケットの到着 ( 受信リング head ではなく、 状態保持⽤フラグに受信状況を設定する NIC もあります )
  112. NIC と通信関連プログラムの構成 送信⽤ NIC デバイスドライバ TCP/IP スタック アプリケーション ユーザー空間 カーネル

    デスクリプタリング 受信⽤ NIC レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail DMA 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス 171 • パケットバッファのメモリアドレス • パケットのサイズ • その他:状態保持⽤フラグ デスクリプタが保持する内容 NIC の送受信キューを表現するデータ構造 (NIC のハードウェア仕様中で定義される) デスクリプタリング位置 転送リング head 転送リング tail 受信リング head 受信リング tail . . . . . . . . . デスクリプタ[0] デスクリプタ[1] デスクリプタ[2] メモリ上の概観 . . . スペースの都合で転送⽤デスクリプタは省略しています パケットバッファ パケットバッファ . . . パケットバッファ ソフトウェアは NIC レジスタの 受信リング head を読み取り、 デスクリプタ[0, 1] に紐づくバッファに データが書き込まれたことを検知する 新規パケットの到着 その後、NIC によって、 レジスタの受信リング head の値が更新される
  113. NIC と通信関連プログラムの構成 送信⽤ NIC デバイスドライバ TCP/IP スタック アプリケーション ユーザー空間 カーネル

    デスクリプタリング 受信⽤ NIC レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail DMA 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス 172 • パケットバッファのメモリアドレス • パケットのサイズ • その他:状態保持⽤フラグ デスクリプタが保持する内容 NIC の送受信キューを表現するデータ構造 (NIC のハードウェア仕様中で定義される) デスクリプタリング位置 転送リング head 転送リング tail 受信リング head 受信リング tail . . . . . . . . . デスクリプタ[0] デスクリプタ[1] デスクリプタ[2] メモリ上の概観 . . . スペースの都合で転送⽤デスクリプタは省略しています パケットバッファ パケットバッファ . . . パケットバッファ ソフトウェアは NIC レジスタの 受信リング head を読み取り、 デスクリプタ[0, 1] に紐づくバッファに データが書き込まれたことを検知する 新規パケットの到着 ソフトウェアは受信パケットを受け取った後 レジスタの受信リング tail の値を更新して 受信パケットを消費したことを NIC へ通知する
  114. NIC と通信関連プログラムの構成 送信⽤ NIC デバイスドライバ TCP/IP スタック アプリケーション ユーザー空間 カーネル

    デスクリプタリング 受信⽤ NIC レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail DMA 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス 173 • パケットバッファのメモリアドレス • パケットのサイズ • その他:状態保持⽤フラグ デスクリプタが保持する内容 NIC の送受信キューを表現するデータ構造 (NIC のハードウェア仕様中で定義される) デスクリプタリング位置 転送リング head 転送リング tail 受信リング head 受信リング tail . . . . . . . . . デスクリプタ[0] デスクリプタ[1] デスクリプタ[2] メモリ上の概観 . . . スペースの都合で転送⽤デスクリプタは省略しています パケットバッファ パケットバッファ . . . パケットバッファ ソフトウェアは NIC レジスタの 受信リング head を読み取り、 デスクリプタ[0, 1] に紐づくバッファに データが書き込まれたことを検知する 新規パケットの到着 head がデスクリプタ配列の最後まで 進められたら head はデスクリプタ[0] へ戻る (リングバッファとして機能する)
  115. NIC と通信関連プログラムの構成 送信⽤ NIC デバイスドライバ TCP/IP スタック アプリケーション ユーザー空間 カーネル

    デスクリプタリング 受信⽤ NIC レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail DMA 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス 174 新規パケットの到着 • パケットバッファのメモリアドレス • パケットのサイズ • その他:状態保持⽤フラグ デスクリプタが保持する内容
  116. (ある程度)⼀般的な受信処理の流れ 送信⽤ NIC デバイスドライバ TCP/IP スタック アプリケーション ユーザー空間 カーネル デスクリプタリング

    受信⽤ NIC レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail DMA 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス 175 新規パケットの到着 • パケットバッファのメモリアドレス • パケットのサイズ • その他:状態保持⽤フラグ デスクリプタが保持する内容
  117. (ある程度)⼀般的な受信処理の流れ 送信⽤ NIC デバイスドライバ TCP/IP スタック アプリケーション ユーザー空間 カーネル デスクリプタリング

    受信⽤ NIC レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail DMA 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス 176 新規パケットの到着 • パケットバッファのメモリアドレス • パケットのサイズ • その他:状態保持⽤フラグ デスクリプタが保持する内容
  118. (ある程度)⼀般的な受信処理の流れ 送信⽤ NIC デバイスドライバ TCP/IP スタック アプリケーション ユーザー空間 カーネル デスクリプタリング

    受信⽤ NIC レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail DMA 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス 177 新規パケットの到着 • パケットバッファのメモリアドレス • パケットのサイズ • その他:状態保持⽤フラグ デスクリプタが保持する内容
  119. (ある程度)⼀般的な受信処理の流れ 送信⽤ NIC デバイスドライバ TCP/IP スタック アプリケーション ユーザー空間 カーネル デスクリプタリング

    受信⽤ NIC レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail DMA 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス 178 新規パケットの到着 • パケットバッファのメモリアドレス • パケットのサイズ • その他:状態保持⽤フラグ デスクリプタが保持する内容
  120. (ある程度)⼀般的な受信処理の流れ 送信⽤ NIC デバイスドライバ TCP/IP スタック アプリケーション ユーザー空間 カーネル デスクリプタリング

    受信⽤ NIC レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail DMA 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス 179 新規パケットの到着 • パケットバッファのメモリアドレス • パケットのサイズ • その他:状態保持⽤フラグ デスクリプタが保持する内容
  121. (ある程度)⼀般的な受信処理の流れ 送信⽤ NIC デバイスドライバ TCP/IP スタック アプリケーション ユーザー空間 カーネル デスクリプタリング

    受信⽤ NIC レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail DMA 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス 180 新規パケットの到着 • パケットバッファのメモリアドレス • パケットのサイズ • その他:状態保持⽤フラグ デスクリプタが保持する内容 ハ ー ド ウ ェ ア 割 り 込 み NIC からパケット受信を通知する ハードウェア割り込みが送られる
  122. (ある程度)⼀般的な受信処理の流れ 送信⽤ NIC デバイスドライバ TCP/IP スタック アプリケーション ユーザー空間 カーネル デスクリプタリング

    受信⽤ NIC レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail DMA 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス 181 新規パケットの到着 • パケットバッファのメモリアドレス • パケットのサイズ • その他:状態保持⽤フラグ デスクリプタが保持する内容 NIC からパケット受信を通知する ハードウェア割り込みが送られる 割り込みハンドラ ハードウェア仕様として、事前に登録された ハードウェア割り込みハンドラが起動される
  123. (ある程度)⼀般的な受信処理の流れ 送信⽤ NIC デバイスドライバ TCP/IP スタック アプリケーション ユーザー空間 カーネル デスクリプタリング

    受信⽤ NIC レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail DMA 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス 182 新規パケットの到着 • パケットバッファのメモリアドレス • パケットのサイズ • その他:状態保持⽤フラグ デスクリプタが保持する内容 割り込みハンドラ ハードウェア仕様として、事前に登録された ハードウェア割り込みハンドラが起動される 受信処理⽤カーネルスレッド
  124. (ある程度)⼀般的な受信処理の流れ 送信⽤ NIC デバイスドライバ TCP/IP スタック アプリケーション ユーザー空間 カーネル デスクリプタリング

    受信⽤ NIC レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail DMA 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス 183 新規パケットの到着 • パケットバッファのメモリアドレス • パケットのサイズ • その他:状態保持⽤フラグ デスクリプタが保持する内容 ハードウェア割り込みハンドラは 受信パケット処理⽤のカーネルスレッドを起動 割り込みハンドラ ハードウェア仕様として、事前に登録された ハードウェア割り込みハンドラが起動される 受信処理⽤カーネルスレッド Kick
  125. (ある程度)⼀般的な受信処理の流れ 送信⽤ NIC デバイスドライバ TCP/IP スタック アプリケーション ユーザー空間 カーネル デスクリプタリング

    受信⽤ NIC レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail DMA 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス 184 新規パケットの到着 • パケットバッファのメモリアドレス • パケットのサイズ • その他:状態保持⽤フラグ デスクリプタが保持する内容 ハードウェア割り込みハンドラは 受信パケット処理⽤のカーネルスレッドを起動 このカーネルスレッドがパケットバッファ からデータを取り出し TCP/IP 処理を実⾏ 受信処理⽤カーネルスレッド
  126. (ある程度)⼀般的な受信処理の流れ 送信⽤ NIC デバイスドライバ TCP/IP スタック アプリケーション ユーザー空間 カーネル デスクリプタリング

    受信⽤ NIC レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail DMA 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス 185 新規パケットの到着 • パケットバッファのメモリアドレス • パケットのサイズ • その他:状態保持⽤フラグ デスクリプタが保持する内容 ハードウェア割り込みハンドラは 受信パケット処理⽤のカーネルスレッドを起動 このカーネルスレッドがパケットバッファ からデータを取り出し TCP/IP 処理を実⾏ 受信処理⽤カーネルスレッド ソケット キュー
  127. (ある程度)⼀般的な受信処理の流れ 送信⽤ NIC デバイスドライバ TCP/IP スタック アプリケーション ユーザー空間 カーネル デスクリプタリング

    受信⽤ NIC レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail DMA 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス 186 新規パケットの到着 • パケットバッファのメモリアドレス • パケットのサイズ • その他:状態保持⽤フラグ デスクリプタが保持する内容 ハードウェア割り込みハンドラは 受信パケット処理⽤のカーネルスレッドを起動 このカーネルスレッドがパケットバッファ からデータを取り出し TCP/IP 処理を実⾏ +ソケットのキューへデータを紐付け 受信処理⽤カーネルスレッド ソケット キュー
  128. (ある程度)⼀般的な受信処理の流れ 送信⽤ NIC デバイスドライバ TCP/IP スタック アプリケーション ユーザー空間 カーネル デスクリプタリング

    受信⽤ NIC レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail DMA 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス 187 新規パケットの到着 • パケットバッファのメモリアドレス • パケットのサイズ • その他:状態保持⽤フラグ デスクリプタが保持する内容 ハードウェア割り込みハンドラは 受信パケット処理⽤のカーネルスレッドを起動 受信⽤パケットバッファと NIC の紐付きを 解除+新しいバッファを紐づける 受信処理⽤カーネルスレッド ソケット キュー
  129. (ある程度)⼀般的な受信処理の流れ 送信⽤ NIC デバイスドライバ TCP/IP スタック アプリケーション ユーザー空間 カーネル デスクリプタリング

    受信⽤ NIC レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail DMA 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス 188 新規パケットの到着 • パケットバッファのメモリアドレス • パケットのサイズ • その他:状態保持⽤フラグ デスクリプタが保持する内容 ハードウェア割り込みハンドラは 受信パケット処理⽤のカーネルスレッドを起動 受信処理⽤カーネルスレッド ソケット キュー 受信⽤パケットバッファと NIC の紐付きを 解除+新しいバッファを紐づける
  130. (ある程度)⼀般的な受信処理の流れ 送信⽤ NIC デバイスドライバ TCP/IP スタック アプリケーション ユーザー空間 カーネル デスクリプタリング

    受信⽤ NIC レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail DMA 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス 189 新規パケットの到着 • パケットバッファのメモリアドレス • パケットのサイズ • その他:状態保持⽤フラグ デスクリプタが保持する内容 ハードウェア割り込みハンドラは 受信パケット処理⽤のカーネルスレッドを起動 受信処理⽤カーネルスレッド ソケット キュー 受信⽤パケットバッファと NIC の紐付きを 解除+新しいバッファを紐づける
  131. (ある程度)⼀般的な受信処理の流れ 送信⽤ NIC デバイスドライバ TCP/IP スタック アプリケーション ユーザー空間 カーネル デスクリプタリング

    受信⽤ NIC レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail DMA 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス 190 新規パケットの到着 • パケットバッファのメモリアドレス • パケットのサイズ • その他:状態保持⽤フラグ デスクリプタが保持する内容 ハードウェア割り込みハンドラは 受信パケット処理⽤のカーネルスレッドを起動 受信処理⽤カーネルスレッド ソケット キュー 受信⽤パケットバッファと NIC の紐付きを 解除+新しいバッファを紐づける
  132. (ある程度)⼀般的な受信処理の流れ 送信⽤ NIC デバイスドライバ TCP/IP スタック アプリケーション ユーザー空間 カーネル デスクリプタリング

    受信⽤ NIC レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail DMA 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス 191 新規パケットの到着 • パケットバッファのメモリアドレス • パケットのサイズ • その他:状態保持⽤フラグ デスクリプタが保持する内容 ハードウェア割り込みハンドラは 受信パケット処理⽤のカーネルスレッドを起動 受信リングの tail を進める 受信処理⽤カーネルスレッド ソケット キュー
  133. (ある程度)⼀般的な受信処理の流れ 送信⽤ NIC デバイスドライバ TCP/IP スタック アプリケーション ユーザー空間 カーネル デスクリプタリング

    受信⽤ NIC レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail DMA 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス 192 新規パケットの到着 • パケットバッファのメモリアドレス • パケットのサイズ • その他:状態保持⽤フラグ デスクリプタが保持する内容 ハードウェア割り込みハンドラは 受信パケット処理⽤のカーネルスレッドを起動 受信処理⽤カーネルスレッド ソケット キュー 受信リングの tail を進める
  134. (ある程度)⼀般的な受信処理の流れ 送信⽤ NIC デバイスドライバ TCP/IP スタック アプリケーション ユーザー空間 カーネル デスクリプタリング

    受信⽤ NIC レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail DMA 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス 193 新規パケットの到着 • パケットバッファのメモリアドレス • パケットのサイズ • その他:状態保持⽤フラグ デスクリプタが保持する内容 ハードウェア割り込みハンドラは 受信パケット処理⽤のカーネルスレッドを起動 受信処理⽤カーネルスレッド ソケット キュー パケットは受信リングの tail より先へは head を進めないので新規パケット受信の ためには tail の更新が必要
  135. (ある程度)⼀般的な受信処理の流れ 送信⽤ NIC デバイスドライバ TCP/IP スタック アプリケーション ユーザー空間 カーネル デスクリプタリング

    受信⽤ NIC レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail DMA 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス 194 新規パケットの到着 • パケットバッファのメモリアドレス • パケットのサイズ • その他:状態保持⽤フラグ デスクリプタが保持する内容 受信パケット処理⽤のカーネルスレッドが アプリケーションスレッドへ通知を送る 受信処理⽤カーネルスレッド ソケット キュー Kick read(), select(), poll() 等でブロックされていれば、ブロックが解除される
  136. (ある程度)⼀般的な受信処理の流れ 送信⽤ NIC デバイスドライバ TCP/IP スタック アプリケーション ユーザー空間 カーネル デスクリプタリング

    受信⽤ NIC レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail DMA 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス 195 新規パケットの到着 • パケットバッファのメモリアドレス • パケットのサイズ • その他:状態保持⽤フラグ デスクリプタが保持する内容 ソケット キュー read(), select(), poll() 等でブロックされていれば、ブロックが解除される
  137. (ある程度)⼀般的な受信処理の流れ 送信⽤ NIC デバイスドライバ TCP/IP スタック アプリケーション ユーザー空間 カーネル デスクリプタリング

    受信⽤ NIC レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail DMA 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス 196 新規パケットの到着 • パケットバッファのメモリアドレス • パケットのサイズ • その他:状態保持⽤フラグ デスクリプタが保持する内容 ソケット キュー read(), select(), poll() 等でブロックされていれば、ブロックが解除される
  138. (ある程度)⼀般的な受信処理の流れ 送信⽤ NIC デバイスドライバ TCP/IP スタック アプリケーション ユーザー空間 カーネル デスクリプタリング

    受信⽤ NIC レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail DMA 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス 197 新規パケットの到着 • パケットバッファのメモリアドレス • パケットのサイズ • その他:状態保持⽤フラグ デスクリプタが保持する内容 アプリケーションはシステムコールを通じて ソケットのキューへ紐づけられたデータを ユーザー空間へコピーしてもらう (read(), recvmsg() 等のシステムコールを利⽤) ソケット キュー read(), recvmsg(), etc.
  139. (ある程度)⼀般的な受信処理の流れ 送信⽤ NIC デバイスドライバ TCP/IP スタック アプリケーション ユーザー空間 カーネル デスクリプタリング

    受信⽤ NIC レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail DMA 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス 198 新規パケットの到着 • パケットバッファのメモリアドレス • パケットのサイズ • その他:状態保持⽤フラグ デスクリプタが保持する内容 アプリケーションはシステムコールを通じて ソケットのキューへ紐づけられたデータを ユーザー空間へコピーしてもらう (read(), recvmsg() 等のシステムコールを利⽤) ソケット キュー read(), recvmsg(), etc. syscall
  140. (ある程度)⼀般的な受信処理の流れ 送信⽤ NIC デバイスドライバ TCP/IP スタック アプリケーション ユーザー空間 カーネル デスクリプタリング

    受信⽤ NIC レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail DMA 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス 199 新規パケットの到着 • パケットバッファのメモリアドレス • パケットのサイズ • その他:状態保持⽤フラグ デスクリプタが保持する内容 アプリケーションはシステムコールを通じて ソケットのキューへ紐づけられたデータを ユーザー空間へコピーしてもらう (read(), recvmsg() 等のシステムコールを利⽤) ソケット キュー read(), recvmsg(), etc.
  141. (ある程度)⼀般的な受信処理の流れ 送信⽤ NIC デバイスドライバ TCP/IP スタック アプリケーション ユーザー空間 カーネル デスクリプタリング

    受信⽤ NIC レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail DMA 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス 200 新規パケットの到着 • パケットバッファのメモリアドレス • パケットのサイズ • その他:状態保持⽤フラグ デスクリプタが保持する内容 アプリケーションはシステムコールを通じて ソケットのキューへ紐づけられたデータを ユーザー空間へコピーしてもらう (read(), recvmsg() 等のシステムコールを利⽤) ソケット キュー メモリコピー read(), recvmsg(), etc.
  142. (ある程度)⼀般的な受信処理の流れ 送信⽤ NIC デバイスドライバ TCP/IP スタック アプリケーション ユーザー空間 カーネル デスクリプタリング

    受信⽤ NIC レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail DMA 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス 201 新規パケットの到着 • パケットバッファのメモリアドレス • パケットのサイズ • その他:状態保持⽤フラグ デスクリプタが保持する内容 アプリケーションはシステムコールを通じて ソケットのキューへ紐づけられたデータを ユーザー空間へコピーしてもらう (read(), recvmsg() 等のシステムコールを利⽤) ソケット キュー read(), recvmsg(), etc.
  143. (ある程度)⼀般的な受信処理の流れ 送信⽤ NIC デバイスドライバ TCP/IP スタック アプリケーション ユーザー空間 カーネル デスクリプタリング

    受信⽤ NIC レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail DMA 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス 202 新規パケットの到着 • パケットバッファのメモリアドレス • パケットのサイズ • その他:状態保持⽤フラグ デスクリプタが保持する内容 アプリケーションはシステムコールを通じて ソケットのキューへ紐づけられたデータを ユーザー空間へコピーしてもらう (read(), recvmsg() 等のシステムコールを利⽤) ソケット キュー read(), recvmsg(), etc.
  144. (ある程度)⼀般的な受信処理の流れ 送信⽤ NIC デバイスドライバ TCP/IP スタック アプリケーション ユーザー空間 カーネル デスクリプタリング

    受信⽤ NIC レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail DMA 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス 203 新規パケットの到着 • パケットバッファのメモリアドレス • パケットのサイズ • その他:状態保持⽤フラグ デスクリプタが保持する内容 アプリケーションはシステムコールを通じて ソケットのキューへ紐づけられたデータを ユーザー空間へコピーしてもらう (read(), recvmsg() 等のシステムコールを利⽤) ソケット キュー read(), recvmsg(), etc.
  145. (ある程度)⼀般的な受信処理の流れ 送信⽤ NIC デバイスドライバ TCP/IP スタック アプリケーション ユーザー空間 カーネル デスクリプタリング

    受信⽤ NIC レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail DMA 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス 204 新規パケットの到着 • パケットバッファのメモリアドレス • パケットのサイズ • その他:状態保持⽤フラグ デスクリプタが保持する内容 アプリケーションはシステムコールを通じて ソケットのキューへ紐づけられたデータを ユーザー空間へコピーしてもらう (read(), recvmsg() 等のシステムコールを利⽤) ソケット キュー read(), recvmsg(), etc.
  146. (ある程度)⼀般的な受信処理の流れ 送信⽤ NIC デバイスドライバ TCP/IP スタック アプリケーション ユーザー空間 カーネル デスクリプタリング

    受信⽤ NIC レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail DMA 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス 205 新規パケットの到着 • パケットバッファのメモリアドレス • パケットのサイズ • その他:状態保持⽤フラグ デスクリプタが保持する内容 アプリケーションはシステムコールを通じて ソケットのキューへ紐づけられたデータを ユーザー空間へコピーしてもらう (read(), recvmsg() 等のシステムコールを利⽤) ソケット キュー read(), recvmsg(), etc. syscall
  147. (ある程度)⼀般的な受信処理の流れ 送信⽤ NIC デバイスドライバ TCP/IP スタック アプリケーション ユーザー空間 カーネル デスクリプタリング

    受信⽤ NIC レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail DMA 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス 206 新規パケットの到着 • パケットバッファのメモリアドレス • パケットのサイズ • その他:状態保持⽤フラグ デスクリプタが保持する内容 アプリケーションはシステムコールを通じて ソケットのキューへ紐づけられたデータを ユーザー空間へコピーしてもらう (read(), recvmsg() 等のシステムコールを利⽤) ソケット キュー read(), recvmsg(), etc.
  148. (ある程度)⼀般的な受信処理の流れ 送信⽤ NIC デバイスドライバ TCP/IP スタック アプリケーション ユーザー空間 カーネル デスクリプタリング

    受信⽤ NIC レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail DMA 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス 207 新規パケットの到着 • パケットバッファのメモリアドレス • パケットのサイズ • その他:状態保持⽤フラグ デスクリプタが保持する内容 アプリケーションはシステムコールを通じて ソケットのキューへ紐づけられたデータを ユーザー空間へコピーしてもらう (read(), recvmsg() 等のシステムコールを利⽤) ソケット キュー read(), recvmsg(), etc.
  149. (ある程度)⼀般的な受信処理の流れ 送信⽤ NIC デバイスドライバ TCP/IP スタック アプリケーション ユーザー空間 カーネル デスクリプタリング

    受信⽤ NIC レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail DMA 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス 208 新規パケットの到着 • パケットバッファのメモリアドレス • パケットのサイズ • その他:状態保持⽤フラグ デスクリプタが保持する内容 アプリケーションはシステムコールを通じて ソケットのキューへ紐づけられたデータを ユーザー空間へコピーしてもらう (read(), recvmsg() 等のシステムコールを利⽤) ソケット キュー メモリコピー read(), recvmsg(), etc.
  150. (ある程度)⼀般的な受信処理の流れ 送信⽤ NIC デバイスドライバ TCP/IP スタック アプリケーション ユーザー空間 カーネル デスクリプタリング

    受信⽤ NIC レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail DMA 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス 209 新規パケットの到着 • パケットバッファのメモリアドレス • パケットのサイズ • その他:状態保持⽤フラグ デスクリプタが保持する内容 アプリケーションはシステムコールを通じて ソケットのキューへ紐づけられたデータを ユーザー空間へコピーしてもらう (read(), recvmsg() 等のシステムコールを利⽤) ソケット キュー read(), recvmsg(), etc.
  151. (ある程度)⼀般的な受信処理の流れ 送信⽤ NIC デバイスドライバ TCP/IP スタック アプリケーション ユーザー空間 カーネル デスクリプタリング

    受信⽤ NIC レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail DMA 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス 210 新規パケットの到着 • パケットバッファのメモリアドレス • パケットのサイズ • その他:状態保持⽤フラグ デスクリプタが保持する内容 アプリケーションはシステムコールを通じて ソケットのキューへ紐づけられたデータを ユーザー空間へコピーしてもらう (read(), recvmsg() 等のシステムコールを利⽤) ソケット キュー read(), recvmsg(), etc.
  152. (ある程度)⼀般的な受信処理の流れ 送信⽤ NIC デバイスドライバ TCP/IP スタック アプリケーション ユーザー空間 カーネル デスクリプタリング

    受信⽤ NIC レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail DMA 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス 211 新規パケットの到着 • パケットバッファのメモリアドレス • パケットのサイズ • その他:状態保持⽤フラグ デスクリプタが保持する内容 アプリケーションはシステムコールを通じて ソケットのキューへ紐づけられたデータを ユーザー空間へコピーしてもらう (read(), recvmsg() 等のシステムコールを利⽤) ソケット キュー read(), recvmsg(), etc.
  153. (ある程度)⼀般的な受信処理の流れ 送信⽤ NIC デバイスドライバ TCP/IP スタック アプリケーション ユーザー空間 カーネル デスクリプタリング

    受信⽤ NIC レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail DMA 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス 212 新規パケットの到着 • パケットバッファのメモリアドレス • パケットのサイズ • その他:状態保持⽤フラグ デスクリプタが保持する内容 アプリケーションはシステムコールを通じて ソケットのキューへ紐づけられたデータを ユーザー空間へコピーしてもらう (read(), recvmsg() 等のシステムコールを利⽤) ソケット キュー read(), recvmsg(), etc.
  154. (ある程度)⼀般的な送信処理の流れ 送信⽤ NIC デバイスドライバ TCP/IP スタック アプリケーション ユーザー空間 カーネル デスクリプタリング

    受信⽤ NIC レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail DMA 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス 213 • パケットバッファのメモリアドレス • パケットのサイズ • その他:状態保持⽤フラグ デスクリプタが保持する内容 ソケット キュー アプリケーションはシステムコールを通じて データの送信をカーネルへリクエストする (write(), sendmsg() 等のシステムコールを利⽤)
  155. (ある程度)⼀般的な送信処理の流れ 送信⽤ NIC デバイスドライバ TCP/IP スタック アプリケーション ユーザー空間 カーネル デスクリプタリング

    受信⽤ NIC レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail DMA 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス 214 • パケットバッファのメモリアドレス • パケットのサイズ • その他:状態保持⽤フラグ デスクリプタが保持する内容 ソケット キュー アプリケーションはシステムコールを通じて データの送信をカーネルへリクエストする (write(), sendmsg() 等のシステムコールを利⽤) syscall write(), sendmsg(), etc.
  156. (ある程度)⼀般的な送信処理の流れ 送信⽤ NIC デバイスドライバ TCP/IP スタック アプリケーション ユーザー空間 カーネル デスクリプタリング

    受信⽤ NIC レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail DMA 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス 215 • パケットバッファのメモリアドレス • パケットのサイズ • その他:状態保持⽤フラグ デスクリプタが保持する内容 ソケット キュー アプリケーションはシステムコールを通じて データの送信をカーネルへリクエストする (write(), sendmsg() 等のシステムコールを利⽤) write(), sendmsg(), etc.
  157. (ある程度)⼀般的な送信処理の流れ 送信⽤ NIC デバイスドライバ TCP/IP スタック アプリケーション ユーザー空間 カーネル デスクリプタリング

    受信⽤ NIC レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail DMA 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス 216 • パケットバッファのメモリアドレス • パケットのサイズ • その他:状態保持⽤フラグ デスクリプタが保持する内容 ソケット キュー カーネルは送信⽤パケットバッファを確保 write(), sendmsg(), etc.
  158. (ある程度)⼀般的な送信処理の流れ 送信⽤ NIC デバイスドライバ TCP/IP スタック アプリケーション ユーザー空間 カーネル デスクリプタリング

    受信⽤ NIC レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail DMA 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス 217 • パケットバッファのメモリアドレス • パケットのサイズ • その他:状態保持⽤フラグ デスクリプタが保持する内容 ソケット キュー カーネルは送信⽤パケットバッファを確保 write(), sendmsg(), etc. 送信⽤パケットバッファ
  159. (ある程度)⼀般的な送信処理の流れ 送信⽤ NIC デバイスドライバ TCP/IP スタック アプリケーション ユーザー空間 カーネル デスクリプタリング

    受信⽤ NIC レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail DMA 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス 218 • パケットバッファのメモリアドレス • パケットのサイズ • その他:状態保持⽤フラグ デスクリプタが保持する内容 ソケット キュー write(), sendmsg(), etc. 送信⽤パケットバッファ ユーザー空間からデータをカーネル空間で 確保した送信⽤パケットバッファへコピー メモリコピー
  160. (ある程度)⼀般的な送信処理の流れ 送信⽤ NIC デバイスドライバ TCP/IP スタック アプリケーション ユーザー空間 カーネル デスクリプタリング

    受信⽤ NIC レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail DMA 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス 219 • パケットバッファのメモリアドレス • パケットのサイズ • その他:状態保持⽤フラグ デスクリプタが保持する内容 ソケット キュー write(), sendmsg(), etc. 送信⽤パケットバッファ ユーザー空間からデータをカーネル空間で 確保した送信⽤パケットバッファへコピー
  161. (ある程度)⼀般的な送信処理の流れ 送信⽤ NIC デバイスドライバ TCP/IP スタック アプリケーション ユーザー空間 カーネル デスクリプタリング

    受信⽤ NIC レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail DMA 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス 220 • パケットバッファのメモリアドレス • パケットのサイズ • その他:状態保持⽤フラグ デスクリプタが保持する内容 ソケット キュー write(), sendmsg(), etc. 送信⽤パケットバッファ TCP/IP スタックの処理を実⾏ (ヘッダの付与)
  162. (ある程度)⼀般的な送信処理の流れ 送信⽤ NIC デバイスドライバ TCP/IP スタック アプリケーション ユーザー空間 カーネル デスクリプタリング

    受信⽤ NIC レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail DMA 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス 221 • パケットバッファのメモリアドレス • パケットのサイズ • その他:状態保持⽤フラグ デスクリプタが保持する内容 ソケット キュー write(), sendmsg(), etc. 送信⽤パケットバッファ 転送⽤デスクリプタリングを通して 送信⽤パケットバッファを NIC へ紐付け
  163. (ある程度)⼀般的な送信処理の流れ 送信⽤ NIC デバイスドライバ TCP/IP スタック アプリケーション ユーザー空間 カーネル デスクリプタリング

    受信⽤ NIC レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail DMA 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス 222 • パケットバッファのメモリアドレス • パケットのサイズ • その他:状態保持⽤フラグ デスクリプタが保持する内容 ソケット キュー write(), sendmsg(), etc. 送信⽤パケットバッファ 転送⽤デスクリプタリングを通して 送信⽤パケットバッファを NIC へ紐付け
  164. (ある程度)⼀般的な送信処理の流れ 送信⽤ NIC デバイスドライバ TCP/IP スタック アプリケーション ユーザー空間 カーネル デスクリプタリング

    受信⽤ NIC レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail DMA 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス 223 • パケットバッファのメモリアドレス • パケットのサイズ • その他:状態保持⽤フラグ デスクリプタが保持する内容 ソケット キュー write(), sendmsg(), etc. 送信⽤パケットバッファ 転送⽤デスクリプタリングを通して 送信⽤パケットバッファを NIC へ紐付け
  165. (ある程度)⼀般的な送信処理の流れ 送信⽤ NIC デバイスドライバ TCP/IP スタック アプリケーション ユーザー空間 カーネル デスクリプタリング

    受信⽤ NIC レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail DMA 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス 224 • パケットバッファのメモリアドレス • パケットのサイズ • その他:状態保持⽤フラグ デスクリプタが保持する内容 ソケット キュー write(), sendmsg(), etc. 送信⽤パケットバッファ NIC レジスタの転送リングの tail の値を更新
  166. (ある程度)⼀般的な送信処理の流れ 送信⽤ NIC デバイスドライバ TCP/IP スタック アプリケーション ユーザー空間 カーネル デスクリプタリング

    受信⽤ NIC レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail DMA 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス 225 • パケットバッファのメモリアドレス • パケットのサイズ • その他:状態保持⽤フラグ デスクリプタが保持する内容 ソケット キュー write(), sendmsg(), etc. 送信⽤パケットバッファ NIC レジスタの転送リングの tail の値を更新
  167. (ある程度)⼀般的な送信処理の流れ 送信⽤ NIC デバイスドライバ TCP/IP スタック アプリケーション ユーザー空間 カーネル デスクリプタリング

    受信⽤ NIC レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail DMA 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス 226 • パケットバッファのメモリアドレス • パケットのサイズ • その他:状態保持⽤フラグ デスクリプタが保持する内容 ソケット キュー write(), sendmsg(), etc. 送信⽤パケットバッファ NIC レジスタの転送リングの tail の値を更新 これをきっかけに NIC から パケットが転送される パケットの転送
  168. (ある程度)⼀般的な送信処理の流れ 送信⽤ NIC デバイスドライバ TCP/IP スタック アプリケーション ユーザー空間 カーネル デスクリプタリング

    受信⽤ NIC レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail DMA 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス 227 • パケットバッファのメモリアドレス • パケットのサイズ • その他:状態保持⽤フラグ デスクリプタが保持する内容 ソケット キュー write(), sendmsg(), etc. 送信⽤パケットバッファ NIC レジスタの転送リングの tail の値を更新 これをきっかけに NIC から パケットが転送される パケットの転送 転送完了後、 NIC が転送リングの head を進める
  169. (ある程度)⼀般的な送信処理の流れ 送信⽤ NIC デバイスドライバ TCP/IP スタック アプリケーション ユーザー空間 カーネル デスクリプタリング

    受信⽤ NIC レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail DMA 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス 228 • パケットバッファのメモリアドレス • パケットのサイズ • その他:状態保持⽤フラグ デスクリプタが保持する内容 ソケット キュー write(), sendmsg(), etc. 送信⽤パケットバッファ NIC レジスタの転送リングの tail の値を更新 これをきっかけに NIC から パケットが転送される パケットの転送 転送完了後、 NIC が転送リングの head を進める
  170. パケット I/O フレームワーク • カーネル(の⼤部分)をバイパスしてユーザー空間から NIC の I/O を実⾏できるようにする •

    DPDK (2010) • netmap (USENIX ATC 2012) on costs almost negligible: a packet generator reams pre-generated packets, and a packet re- hich just counts incoming packets. est equipment e run most of our experiments on systems d with an i7-870 4-core CPU at 2.93 GHz Hz with turbo-boost), memory running at Hz, and a dual port 10 Gbit/s card based on the 599 NIC. The numbers reported in this paper the netmap version in FreeBSD HEAD/amd64 0 2 4 6 8 10 12 14 16 0 0.5 1 1.5 2 2.5 3 Tx Rate (Mpps) Clock speed (GHz) netmap on 4 cores netmap on 2 cores netmap on 1 core Linux/pktgen FreeBSD/netsend • 0.9 GHz で 10 Gbps NIC の ラインレート(14.88 Mpps) で送信できる 230 Luigi Rizzo. 2012. Netmap: A Novel Framework for Fast Packet I/O. In 2012 USENIX Annual Technical Conference (USENIX ATC 12), 101- 112.(https://www.usenix.org/conference/atc12/technical-sessions/presentation/rizzo)
  171. パケット I/O フレームワーク • カーネル(の⼤部分)をバイパスしてユーザー空間から NIC の I/O を実⾏できるようにする •

    DPDK (2010) • netmap (USENIX ATC 2012) on costs almost negligible: a packet generator reams pre-generated packets, and a packet re- hich just counts incoming packets. est equipment e run most of our experiments on systems d with an i7-870 4-core CPU at 2.93 GHz Hz with turbo-boost), memory running at Hz, and a dual port 10 Gbit/s card based on the 599 NIC. The numbers reported in this paper the netmap version in FreeBSD HEAD/amd64 0 2 4 6 8 10 12 14 16 0 0.5 1 1.5 2 2.5 3 Tx Rate (Mpps) Clock speed (GHz) netmap on 4 cores netmap on 2 cores netmap on 1 core Linux/pktgen FreeBSD/netsend • 0.9 GHz で 10 Gbps NIC の ラインレート(14.88 Mpps) で送信できる 231 Luigi Rizzo. 2012. Netmap: A Novel Framework for Fast Packet I/O. In 2012 USENIX Annual Technical Conference (USENIX ATC 12), 101- 112.(https://www.usenix.org/conference/atc12/technical-sessions/presentation/rizzo)
  172. DPDK の場合 送信⽤ NIC デバイスドライバ アプリケーション ユーザー空間 カーネル デスクリプタリング 受信⽤

    NIC レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail DMA 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス TCP/IP スタック 232
  173. DPDK の場合 送信⽤ NIC デバイスドライバ アプリケーション ユーザー空間 カーネル デスクリプタリング 受信⽤

    NIC レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail DMA 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス 233 カーネルの TCP/IP スタックは経由しない
  174. DPDK の場合 送信⽤ NIC デバイスドライバ アプリケーション ユーザー空間 デスクリプタリング 受信⽤ NIC

    レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail DMA 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス 234 カーネルの TCP/IP スタックは経由しない デバイスドライバをユーザー空間で実⾏
  175. DPDK の場合 送信⽤ NIC デバイスドライバ アプリケーション ユーザー空間 デスクリプタリング 受信⽤ NIC

    レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail DMA 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス 235 カーネルの TCP/IP スタックは経由しない デバイスドライバをユーザー空間で実⾏ NIC に紐づいたパケットバッファも ユーザー空間に配置
  176. DPDK の場合 送信⽤ NIC デバイスドライバ アプリケーション ユーザー空間 デスクリプタリング 受信⽤ NIC

    レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail DMA 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス 236 DPDK API カーネルの TCP/IP スタックは経由しない デバイスドライバをユーザー空間で実⾏ NIC に紐づいたパケットバッファも ユーザー空間に配置
  177. DPDK の場合:受信パケットの検知 送信⽤ NIC デバイスドライバ アプリケーション ユーザー空間 デスクリプタリング 受信⽤ NIC

    レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail DMA 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス 237 DPDK API
  178. DPDK の場合:受信パケットの検知 送信⽤ NIC デバイスドライバ アプリケーション ユーザー空間 デスクリプタリング 受信⽤ NIC

    レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail DMA 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス 238 DPDK API API を通してアプリケーションのループの 中で、受信リングの head の値を監視
  179. DPDK の場合:受信パケットの検知 送信⽤ NIC デバイスドライバ アプリケーション ユーザー空間 デスクリプタリング 受信⽤ NIC

    レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail DMA 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス 239 DPDK API 新規パケットの到着 API を通してアプリケーションのループの 中で、受信リングの head の値を監視
  180. DPDK の場合:受信パケットの検知 送信⽤ NIC デバイスドライバ アプリケーション ユーザー空間 デスクリプタリング 受信⽤ NIC

    レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail DMA 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス 240 DPDK API 新規パケットの到着 API を通してアプリケーションのループの 中で、受信リングの head の値を監視
  181. DPDK の場合:受信パケットの検知 送信⽤ NIC デバイスドライバ アプリケーション ユーザー空間 デスクリプタリング 受信⽤ NIC

    レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail DMA 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス 241 DPDK API 新規パケットの到着 API を通してアプリケーションのループの 中で、受信リングの head の値を監視 head が動いたことを確認 パケットの受信を検知
  182. DPDK の場合:受信パケットの読み込み 送信⽤ NIC デバイスドライバ アプリケーション ユーザー空間 デスクリプタリング 受信⽤ NIC

    レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail DMA 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス 242 DPDK API 新規パケットの到着 受信⽤パケットバッファは ユーザー空間にあり、 受信したデータは検知された段階で 既にアプリケーションから⾒えている
  183. DPDK の場合:受信パケットの読み込み 送信⽤ NIC デバイスドライバ アプリケーション ユーザー空間 デスクリプタリング 受信⽤ NIC

    レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail DMA 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス 243 DPDK API 新規パケットの到着 受信⽤パケットバッファは ユーザー空間にあり、 受信したデータは検知された段階で 既にアプリケーションから⾒えている なので、 読み込みのために追加の作業はなし
  184. DPDK の場合:受信リング tail の更新 送信⽤ NIC デバイスドライバ アプリケーション ユーザー空間 デスクリプタリング

    受信⽤ NIC レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail DMA 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス 244 DPDK API 新規パケットの到着 受信⽤パケットバッファは ユーザー空間にあり、 受信したデータは検知された段階で 既にアプリケーションから⾒えている なので、 読み込みのために追加の作業はなし 新しいパケットを受け取れるように 別のバッファを紐づけて、tail を進める
  185. DPDK の場合:受信リング tail の更新 送信⽤ NIC デバイスドライバ アプリケーション ユーザー空間 デスクリプタリング

    受信⽤ NIC レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail DMA 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス 245 DPDK API 新規パケットの到着 受信⽤パケットバッファは ユーザー空間にあり、 受信したデータは検知された段階で 既にアプリケーションから⾒えている なので、 読み込みのために追加の作業はなし 新しいパケットを受け取れるように 別のバッファを紐づけて、tail を進める
  186. DPDK の場合 送信⽤ NIC デバイスドライバ アプリケーション ユーザー空間 デスクリプタリング 受信⽤ NIC

    レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail DMA 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス 246 DPDK API 新規パケットの到着 受信⽤パケットバッファは ユーザー空間にあり、 受信したデータは検知された段階で 既にアプリケーションから⾒えている なので、 読み込みのために追加の作業はなし 新しいパケットを受け取れるように 別のバッファを紐づけて、tail を進める あとは、アプリが好きなように受信したデータを消費できる
  187. DPDK の場合:転送 送信⽤ NIC デバイスドライバ アプリケーション ユーザー空間 デスクリプタリング 受信⽤ NIC

    レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail DMA 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス 247 DPDK API
  188. DPDK の場合:転送 送信⽤ NIC デバイスドライバ アプリケーション ユーザー空間 デスクリプタリング 受信⽤ NIC

    レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail DMA 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス 248 DPDK API 送信⽤パケットバッファ DPDK は送信⽤パケットバッファを ユーザー空間に予め確保
  189. DPDK の場合:転送 送信⽤ NIC デバイスドライバ アプリケーション ユーザー空間 デスクリプタリング 受信⽤ NIC

    レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail DMA 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス 249 DPDK API 送信⽤パケットバッファ DPDK は送信⽤パケットバッファを ユーザー空間に予め確保 アプリケーションは確保された 送信⽤パケットバッファへ直接 データを書き込む
  190. DPDK の場合:転送 送信⽤ NIC デバイスドライバ アプリケーション ユーザー空間 デスクリプタリング 受信⽤ NIC

    レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail DMA 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス 250 DPDK API 送信⽤パケットバッファ DPDK は送信⽤パケットバッファを ユーザー空間に予め確保 アプリケーションは確保された 送信⽤パケットバッファへ直接 データを書き込む DPDK は NIC のデスクリプタリングに 送信⽤パケットバッファを紐付け
  191. DPDK の場合:転送 送信⽤ NIC デバイスドライバ アプリケーション ユーザー空間 デスクリプタリング 受信⽤ NIC

    レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail DMA 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス 251 DPDK API 送信⽤パケットバッファ DPDK は送信⽤パケットバッファを ユーザー空間に予め確保 アプリケーションは確保された 送信⽤パケットバッファへ直接 データを書き込む DPDK は NIC のデスクリプタリングに 送信⽤パケットバッファを紐付け その後、転送リングの tail を更新
  192. DPDK の場合:転送 送信⽤ NIC デバイスドライバ アプリケーション ユーザー空間 デスクリプタリング 受信⽤ NIC

    レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail DMA 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス 252 DPDK API 送信⽤パケットバッファ DPDK は送信⽤パケットバッファを ユーザー空間に予め確保 アプリケーションは確保された 送信⽤パケットバッファへ直接 データを書き込む DPDK は NIC のデスクリプタリングに 送信⽤パケットバッファを紐付け その後、転送リングの tail を更新 これをきっかけにパケットが NIC から 転送される パケットの転送
  193. パケット I/O フレームワークの⽤途 送信⽤ NIC デバイスドライバ アプリケーション ユーザー空間 デスクリプタリング 受信⽤

    NIC レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail DMA 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス 254 DPDK API Network Function Virtualization (NFV) 汎⽤的なサーバーでネットワーク機能を 動かす (e.g., Firewall, Router)
  194. パケット I/O フレームワークの⽤途 送信⽤ NIC デバイスドライバ NFV アプリケーション ユーザー空間 デスクリプタリング

    受信⽤ NIC レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail DMA 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス 255 DPDK API Network Function Virtualization (NFV) 汎⽤的なサーバーでネットワーク機能を 動かす (e.g., Firewall, Router)
  195. パケット I/O フレームワークの⽤途 送信⽤ NIC デバイスドライバ アプリケーション ユーザー空間 デスクリプタリング 受信⽤

    NIC レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail DMA 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス 256 DPDK API Network Function Virtualization (NFV) 汎⽤的なサーバーでネットワーク機能を 動かす (e.g., Firewall, Router) サーバープログラムの⾼速化 TCP/IP スタック ユーザー空間で動作する TCP/IP スタックと組み合わせる
  196. パケット I/O フレームワークの⽤途 送信⽤ NIC デバイスドライバ 仮想 NIC バックエンド ユーザー空間

    デスクリプタリング 受信⽤ NIC レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail DMA 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス 257 DPDK API Network Function Virtualization (NFV) 汎⽤的なサーバーでネットワーク機能を 動かす (e.g., Firewall, Router) サーバープログラムの⾼速化 ユーザー空間で動作する TCP/IP スタックと組み合わせる 仮想 NIC ホスト 仮想マシン 仮想マシン通信の⾼速化 仮想 I/O バックエンドに組み込む
  197. TCP/IP スタック設計の再考 • マルチコア環境で性能をスケールさせる • NIC のマルチキュー機能を使う 261 送信⽤ NIC

    デバイスドライバ アプリケーション ユーザー空間 カーネル デスクリプタリング 受信⽤ NIC レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail DMA 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス TCP/IP スタック
  198. TCP/IP スタック設計の再考 • マルチコア環境で性能をスケールさせる • NIC のマルチキュー機能を使う 262 送信⽤ NIC

    デバイスドライバ アプリケーション ユーザー空間 カーネル デスクリプタリング 受信⽤ NIC レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail DMA 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス TCP/IP スタック
  199. TCP/IP スタック設計の再考 • マルチコア環境で性能をスケールさせる • NIC のマルチキュー機能を使う 263 送信⽤ NIC

    デバイスドライバ アプリケーション ユーザー空間 カーネル デスクリプタリング 受信⽤ NIC レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail DMA 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス TCP/IP スタック NIC キュー
  200. TCP/IP スタック設計の再考 • マルチコア環境で性能をスケールさせる • NIC のマルチキュー機能を使う 264 送信⽤ NIC

    デバイスドライバ アプリケーション ユーザー空間 カーネル デスクリプタリング 受信⽤ NIC レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail DMA 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス TCP/IP スタック NIC キュー
  201. TCP/IP スタック設計の再考 • マルチコア環境で性能をスケールさせる • NIC のマルチキュー機能を使う 265 送信⽤ NIC

    デバイスドライバ アプリケーション ユーザー空間 カーネル デスクリプタリング 受信⽤ NIC レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail DMA 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス TCP/IP スタック NIC キュー キューへのアクセスごとに ロックの取得が必要 NIC のキューが競合ポイントになる 解決策:NIC のマルチキュー機能を使う
  202. TCP/IP スタック設計の再考 • マルチコア環境で性能をスケールさせる • NIC のマルチキュー機能を使う 266 送信⽤ NIC

    デバイスドライバ アプリケーション ユーザー空間 カーネル デスクリプタリング 受信⽤ NIC レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail DMA 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス TCP/IP スタック
  203. TCP/IP スタック設計の再考 • マルチコア環境で性能をスケールさせる • NIC のマルチキュー機能を使う 267 送信⽤ NIC

    デバイスドライバ アプリケーション ユーザー空間 カーネル デスクリプタリング 受信⽤ NIC レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス TCP/IP スタック 送信⽤ 受信⽤ NIC の機能を使って 複数のキューを⽤意 DMA
  204. TCP/IP スタック設計の再考 • マルチコア環境で性能をスケールさせる • NIC のマルチキュー機能を使う 268 送信⽤ NIC

    デバイスドライバ アプリケーション ユーザー空間 カーネル デスクリプタリング 受信⽤ NIC レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス TCP/IP スタック 送信⽤ 受信⽤ NIC の機能を使って 複数のキューを⽤意 DMA 各コアがキューを⼀つずつ専有
  205. TCP/IP スタック設計の再考 • マルチコア環境で性能をスケールさせる • NIC のマルチキュー機能を使う 269 送信⽤ NIC

    デバイスドライバ アプリケーション ユーザー空間 カーネル デスクリプタリング 受信⽤ NIC レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス TCP/IP スタック 送信⽤ 受信⽤ NIC の機能を使って 複数のキューを⽤意 DMA 各コアがキューを⼀つずつ専有 受信についての注意事項
  206. TCP/IP スタック設計の再考 • マルチコア環境で性能をスケールさせる • NIC のマルチキュー機能を使う 270 送信⽤ NIC

    デバイスドライバ アプリケーション ユーザー空間 カーネル デスクリプタリング 受信⽤ NIC レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス TCP/IP スタック 送信⽤ 受信⽤ NIC の機能を使って 複数のキューを⽤意 DMA 各コアがキューを⼀つずつ専有 TCP接続 A TCP接続 B 2つのコアがそれぞれ TCP 接続 A, B へ対応していたとして
  207. TCP/IP スタック設計の再考 • マルチコア環境で性能をスケールさせる • NIC のマルチキュー機能を使う 271 送信⽤ NIC

    デバイスドライバ アプリケーション ユーザー空間 カーネル デスクリプタリング 受信⽤ NIC レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス TCP/IP スタック 送信⽤ 受信⽤ NIC の機能を使って 複数のキューを⽤意 DMA 各コアがキューを⼀つずつ専有 TCP接続 A TCP接続 B 2つのコアがそれぞれ TCP 接続 A, B へ対応していたとして
  208. TCP/IP スタック設計の再考 • マルチコア環境で性能をスケールさせる • NIC のマルチキュー機能を使う 272 送信⽤ NIC

    デバイスドライバ アプリケーション ユーザー空間 カーネル デスクリプタリング 受信⽤ NIC レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス TCP/IP スタック 送信⽤ 受信⽤ NIC の機能を使って 複数のキューを⽤意 DMA 各コアがキューを⼀つずつ専有 TCP接続 A TCP接続 B 2つのコアがそれぞれ TCP 接続 A, B へ対応していたとして
  209. TCP/IP スタック設計の再考 • マルチコア環境で性能をスケールさせる • NIC のマルチキュー機能を使う 273 送信⽤ NIC

    デバイスドライバ アプリケーション ユーザー空間 カーネル デスクリプタリング 受信⽤ NIC レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス TCP/IP スタック 送信⽤ 受信⽤ NIC の機能を使って 複数のキューを⽤意 DMA 各コアがキューを⼀つずつ専有 TCP接続 A TCP接続 B 2つのコアがそれぞれ TCP 接続 A, B へ対応していたとして
  210. TCP/IP スタック設計の再考 • マルチコア環境で性能をスケールさせる • NIC のマルチキュー機能を使う 274 送信⽤ NIC

    デバイスドライバ アプリケーション ユーザー空間 カーネル デスクリプタリング 受信⽤ NIC レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス TCP/IP スタック 送信⽤ 受信⽤ NIC の機能を使って 複数のキューを⽤意 DMA 各コアがキューを⼀つずつ専有 TCP接続 A TCP接続 B 2つのコアがそれぞれ TCP 接続 A, B へ対応していたとして
  211. TCP/IP スタック設計の再考 • マルチコア環境で性能をスケールさせる • NIC のマルチキュー機能を使う 275 送信⽤ NIC

    デバイスドライバ アプリケーション ユーザー空間 カーネル デスクリプタリング 受信⽤ NIC レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス TCP/IP スタック 送信⽤ 受信⽤ NIC の機能を使って 複数のキューを⽤意 DMA 各コアがキューを⼀つずつ専有 TCP接続 A TCP接続 B 2つのコアがそれぞれ TCP 接続 A, B へ対応していたとして 受信についての注意事項 受信パケットがランダムにキューに割り振られると CPU コア間でデータのやりとりが必要になってしまう
  212. TCP/IP スタック設計の再考 • マルチコア環境で性能をスケールさせる • NIC のマルチキュー機能を使う 276 送信⽤ NIC

    デバイスドライバ アプリケーション ユーザー空間 カーネル デスクリプタリング 受信⽤ NIC レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス TCP/IP スタック 送信⽤ 受信⽤ NIC の機能を使って 複数のキューを⽤意 DMA 各コアがキューを⼀つずつ専有 TCP接続 A TCP接続 B 2つのコアがそれぞれ TCP 接続 A, B へ対応していたとして 受信についての注意事項 受信パケットがランダムにキューに割り振られると CPU コア間でデータのやりとりが必要になってしまう 解決策:NIC の Receive Side Scaling (RSS) 機能を使う
  213. TCP/IP スタック設計の再考 • マルチコア環境で性能をスケールさせる • NIC のマルチキュー機能を使う 277 送信⽤ NIC

    デバイスドライバ アプリケーション ユーザー空間 カーネル デスクリプタリング 受信⽤ NIC レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス TCP/IP スタック 送信⽤ 受信⽤ NIC の機能を使って 複数のキューを⽤意 DMA 各コアがキューを⼀つずつ専有 TCP接続 A TCP接続 B 2つのコアがそれぞれ TCP 接続 A, B へ対応していたとして
  214. TCP/IP スタック設計の再考 • マルチコア環境で性能をスケールさせる • NIC のマルチキュー機能を使う 278 送信⽤ NIC

    デバイスドライバ アプリケーション ユーザー空間 カーネル デスクリプタリング 受信⽤ NIC レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス TCP/IP スタック 送信⽤ 受信⽤ NIC の機能を使って 複数のキューを⽤意 DMA 各コアがキューを⼀つずつ専有 TCP接続 A TCP接続 B 2つのコアがそれぞれ TCP 接続 A, B へ対応していたとして Hash Table
  215. TCP/IP スタック設計の再考 • マルチコア環境で性能をスケールさせる • NIC のマルチキュー機能を使う 279 送信⽤ NIC

    デバイスドライバ アプリケーション ユーザー空間 カーネル デスクリプタリング 受信⽤ NIC レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス TCP/IP スタック 送信⽤ 受信⽤ NIC の機能を使って 複数のキューを⽤意 DMA 各コアがキューを⼀つずつ専有 TCP接続 A TCP接続 B 2つのコアがそれぞれ TCP 接続 A, B へ対応していたとして Hash Table
  216. TCP/IP スタック設計の再考 • マルチコア環境で性能をスケールさせる • NIC のマルチキュー機能を使う 280 送信⽤ NIC

    デバイスドライバ アプリケーション ユーザー空間 カーネル デスクリプタリング 受信⽤ NIC レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス TCP/IP スタック 送信⽤ 受信⽤ NIC の機能を使って 複数のキューを⽤意 DMA 各コアがキューを⼀つずつ専有 TCP接続 A TCP接続 B 2つのコアがそれぞれ TCP 接続 A, B へ対応していたとして Hash Table パケットのヘッダを⾒て ハッシュ値を計算
  217. TCP/IP スタック設計の再考 • マルチコア環境で性能をスケールさせる • NIC のマルチキュー機能を使う 281 送信⽤ NIC

    デバイスドライバ アプリケーション ユーザー空間 カーネル デスクリプタリング 受信⽤ NIC レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス TCP/IP スタック 送信⽤ 受信⽤ NIC の機能を使って 複数のキューを⽤意 DMA 各コアがキューを⼀つずつ専有 TCP接続 A TCP接続 B 2つのコアがそれぞれ TCP 接続 A, B へ対応していたとして ハッシュ値を元に hash table を参照して宛先キューを決める *RSS: Receive Side Scaling Hash Table パケットのヘッダを⾒て ハッシュ値を計算
  218. TCP/IP スタック設計の再考 • マルチコア環境で性能をスケールさせる • NIC のマルチキュー機能を使う 282 送信⽤ NIC

    デバイスドライバ アプリケーション ユーザー空間 カーネル デスクリプタリング 受信⽤ NIC レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス TCP/IP スタック 送信⽤ 受信⽤ NIC の機能を使って 複数のキューを⽤意 DMA 各コアがキューを⼀つずつ専有 TCP接続 A TCP接続 B 2つのコアがそれぞれ TCP 接続 A, B へ対応していたとして *RSS: Receive Side Scaling Hash Table
  219. TCP/IP スタック設計の再考 • マルチコア環境で性能をスケールさせる • NIC のマルチキュー機能を使う 283 送信⽤ NIC

    デバイスドライバ アプリケーション ユーザー空間 カーネル デスクリプタリング 受信⽤ NIC レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス TCP/IP スタック 送信⽤ 受信⽤ NIC の機能を使って 複数のキューを⽤意 DMA 各コアがキューを⼀つずつ専有 TCP接続 A TCP接続 B 2つのコアがそれぞれ TCP 接続 A, B へ対応していたとして *RSS: Receive Side Scaling Hash Table 受信についての注意事項 受信パケットがランダムにキューに割り振られると CPU コア間でデータのやりとりが必要になってしまう 解決策:NIC の Receive Side Scaling (RSS) 機能を使う RSS のおかげで、特定の TCP 接続のパケットは 特定のキューで受信されるようにできる
  220. TCP/IP スタック設計の再考 • マルチコア環境で性能をスケールさせる • NIC のマルチキュー機能を使う 287 送信⽤ NIC

    デバイスドライバ アプリケーション ユーザー空間 カーネル デスクリプタリング 受信⽤ NIC レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス TCP/IP スタック 送信⽤ 受信⽤ DMA
  221. TCP/IP スタック設計の再考 • マルチコア環境で性能をスケールさせる • NIC のマルチキュー機能を使う 288 送信⽤ NIC

    デバイスドライバ アプリケーション ユーザー空間 カーネル デスクリプタリング 受信⽤ NIC レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス TCP/IP スタック 送信⽤ 受信⽤ DMA TCP の接続確⽴時
  222. TCP/IP スタック設計の再考 • マルチコア環境で性能をスケールさせる • NIC のマルチキュー機能を使う 289 送信⽤ NIC

    デバイスドライバ アプリケーション ユーザー空間 カーネル デスクリプタリング 受信⽤ NIC レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス TCP/IP スタック 送信⽤ 受信⽤ DMA TCP の接続確⽴時 TCP SYN
  223. TCP/IP スタック設計の再考 • マルチコア環境で性能をスケールさせる • NIC のマルチキュー機能を使う 290 送信⽤ NIC

    デバイスドライバ アプリケーション ユーザー空間 カーネル デスクリプタリング 受信⽤ NIC レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス TCP/IP スタック 送信⽤ 受信⽤ DMA TCP の接続確⽴時 TCP SYN TCP SYN
  224. TCP/IP スタック設計の再考 • マルチコア環境で性能をスケールさせる • NIC のマルチキュー機能を使う 291 送信⽤ NIC

    デバイスドライバ アプリケーション ユーザー空間 カーネル デスクリプタリング 受信⽤ NIC レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス TCP/IP スタック 送信⽤ 受信⽤ DMA TCP SYN TCP SYN TCP接続 A TCP接続 B
  225. TCP/IP スタック設計の再考 • マルチコア環境で性能をスケールさせる • NIC のマルチキュー機能を使う 292 送信⽤ NIC

    デバイスドライバ アプリケーション ユーザー空間 カーネル デスクリプタリング 受信⽤ NIC レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス TCP/IP スタック 送信⽤ 受信⽤ DMA TCP SYN TCP SYN TCP接続 A TCP接続 B ソケット accept()
  226. TCP/IP スタック設計の再考 • マルチコア環境で性能をスケールさせる • NIC のマルチキュー機能を使う 293 送信⽤ NIC

    デバイスドライバ アプリケーション ユーザー空間 カーネル デスクリプタリング 受信⽤ NIC レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス TCP/IP スタック 送信⽤ 受信⽤ DMA TCP SYN TCP SYN TCP接続 A TCP接続 B ソケット accept キュー
  227. TCP/IP スタック設計の再考 • マルチコア環境で性能をスケールさせる • NIC のマルチキュー機能を使う 294 送信⽤ NIC

    デバイスドライバ アプリケーション ユーザー空間 カーネル デスクリプタリング 受信⽤ NIC レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス TCP/IP スタック 送信⽤ 受信⽤ DMA TCP SYN TCP SYN TCP接続 A TCP接続 B ソケット accept キュー TCP接続 B TCP接続 A
  228. TCP/IP スタック設計の再考 • マルチコア環境で性能をスケールさせる • NIC のマルチキュー機能を使う 295 送信⽤ NIC

    デバイスドライバ アプリケーション ユーザー空間 カーネル デスクリプタリング 受信⽤ NIC レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス TCP/IP スタック 送信⽤ 受信⽤ DMA TCP SYN TCP SYN TCP接続 A TCP接続 B ソケット accept キュー TCP接続 B TCP接続 A accept キューはソケットごとに1つずつしかないため、コア間での競合のポイントになる
  229. TCP/IP スタック設計の再考 • マルチコア環境で性能をスケールさせる • 基本的なアイデア:コア間で共有するオブジェクトを減らす • NIC のキューについて:NIC のマルチキュー機能を利⽤

    • Receive Side Scaling (RSS) も利⽤ • accept のスケーラビリティに関して • Affinity-Accept (EuroSys 2012) • MegaPipe (OSDI 2012) • mTCP (NSDI 2014) • Fastsocket (ASPLOS 2016) 296
  230. TCP/IP スタック設計の再考 • マルチコア環境で性能をスケールさせる • NIC のマルチキュー機能を使う 297 送信⽤ NIC

    デバイスドライバ アプリケーション ユーザー空間 カーネル デスクリプタリング 受信⽤ NIC レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス TCP/IP スタック 送信⽤ 受信⽤ DMA TCP SYN TCP SYN TCP接続 A TCP接続 B ソケット accept キュー TCP接続 B TCP接続 A accept キューはソケットごとに1つずつしかないため、コア間での競合のポイントになる
  231. TCP/IP スタック設計の再考 • マルチコア環境で性能をスケールさせる • NIC のマルチキュー機能を使う 298 送信⽤ NIC

    デバイスドライバ アプリケーション ユーザー空間 カーネル デスクリプタリング 受信⽤ NIC レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス TCP/IP スタック 送信⽤ 受信⽤ DMA TCP SYN TCP SYN TCP接続 A TCP接続 B ソケット accept キュー TCP接続 B TCP接続 A 解決策:コアごとに accept キューを⽤意する
  232. TCP/IP スタック設計の再考 • マルチコア環境で性能をスケールさせる • 基本的なアイデア:コア間で共有するオブジェクトを減らす • NIC のキューについて:NIC のマルチキュー機能を利⽤

    • Receive Side Scaling (RSS) も利⽤ • accept のスケーラビリティに関して • Affinity-Accept (EuroSys 2012) • MegaPipe (OSDI 2012) • mTCP (NSDI 2014) • Fastsocket (ASPLOS 2016) 299
  233. TCP/IP スタック設計の再考 • マルチコア環境で性能をスケールさせる • 基本的なアイデア:コア間で共有するオブジェクトを減らす • NIC のキューについて:NIC のマルチキュー機能を利⽤

    • Receive Side Scaling (RSS) も利⽤ • accept のスケーラビリティに関して • Affinity-Accept (EuroSys 2012) • MegaPipe (OSDI 2012) • mTCP (NSDI 2014) • Fastsocket (ASPLOS 2016) 300 ectly because it does not sufficiently stress the network ck: some requests involve performing SQL queries or ning PHP code, which stresses the disk and CPU more n the network stack. Applications that put less stress on network stack will see less pronounced improvements h Affinity-Accept. The files served range from 30 bytes to 70 bytes. The web server serves 30,000 distinct files, and ient chooses a file to request uniformly over all files. Unless otherwise stated, in all experiments a client re- ests a total of 6 files per connection with requests spaced by think time. First, a client requests one file and waits for Stock-Accept Fine-Accept Affinity-Accept 0 2000 4000 6000 8000 10000 12000 14000 16000 1 4 8 12 16 20 24 28 32 36 40 44 48 Throughput (requests / sec / core) Cores Apache HTTP server パフォーマンス ベンチマーククライアントは1回の TCP 接続で6ファイル取得 Aleksey Pesterev, Jacob Strauss, Nickolai Zeldovich, and Robert T. Morris. 2012. Improving Network Connection Locality on Multicore Systems. In Proceedings of the 7th ACM European Conference on Computer Systems (EuroSys ʼ12), 337-350.(https://doi.org/10.1145/2168836.2168870)
  234. TCP/IP スタック設計の再考 • マルチコア環境で性能をスケールさせる • 基本的なアイデア:コア間で共有するオブジェクトを減らす • NIC のキューについて:NIC のマルチキュー機能を利⽤

    • Receive Side Scaling (RSS) も利⽤ • accept のスケーラビリティに関して • Affinity-Accept (EuroSys 2012) • MegaPipe (OSDI 2012) • mTCP (NSDI 2014) • Fastsocket (ASPLOS 2016) 301 ectly because it does not sufficiently stress the network ck: some requests involve performing SQL queries or ning PHP code, which stresses the disk and CPU more n the network stack. Applications that put less stress on network stack will see less pronounced improvements h Affinity-Accept. The files served range from 30 bytes to 70 bytes. The web server serves 30,000 distinct files, and ient chooses a file to request uniformly over all files. Unless otherwise stated, in all experiments a client re- ests a total of 6 files per connection with requests spaced by think time. First, a client requests one file and waits for Stock-Accept Fine-Accept Affinity-Accept 0 2000 4000 6000 8000 10000 12000 14000 16000 1 4 8 12 16 20 24 28 32 36 40 44 48 Throughput (requests / sec / core) Cores Apache HTTP server パフォーマンス ベンチマーククライアントは1回の TCP 接続で6ファイル取得 TCP接続 B TCP接続 A TCP接続 C TCP接続 D TCP接続 E TCP接続 F アプリケーション Aleksey Pesterev, Jacob Strauss, Nickolai Zeldovich, and Robert T. Morris. 2012. Improving Network Connection Locality on Multicore Systems. In Proceedings of the 7th ACM European Conference on Computer Systems (EuroSys ʼ12), 337-350.(https://doi.org/10.1145/2168836.2168870)
  235. TCP/IP スタック設計の再考 • マルチコア環境で性能をスケールさせる • 基本的なアイデア:コア間で共有するオブジェクトを減らす • NIC のキューについて:NIC のマルチキュー機能を利⽤

    • Receive Side Scaling (RSS) も利⽤ • accept のスケーラビリティに関して • Affinity-Accept (EuroSys 2012) • MegaPipe (OSDI 2012) • mTCP (NSDI 2014) • Fastsocket (ASPLOS 2016) 302 ectly because it does not sufficiently stress the network ck: some requests involve performing SQL queries or ning PHP code, which stresses the disk and CPU more n the network stack. Applications that put less stress on network stack will see less pronounced improvements h Affinity-Accept. The files served range from 30 bytes to 70 bytes. The web server serves 30,000 distinct files, and ient chooses a file to request uniformly over all files. Unless otherwise stated, in all experiments a client re- ests a total of 6 files per connection with requests spaced by think time. First, a client requests one file and waits for Stock-Accept Fine-Accept Affinity-Accept 0 2000 4000 6000 8000 10000 12000 14000 16000 1 4 8 12 16 20 24 28 32 36 40 44 48 Throughput (requests / sec / core) Cores Apache HTTP server パフォーマンス ベンチマーククライアントは1回の TCP 接続で6ファイル取得 TCP接続 B TCP接続 A TCP接続 C TCP接続 D TCP接続 E TCP接続 F アプリケーション Fine-Accept: 全ての accept キューからラウンドロビンで accept Aleksey Pesterev, Jacob Strauss, Nickolai Zeldovich, and Robert T. Morris. 2012. Improving Network Connection Locality on Multicore Systems. In Proceedings of the 7th ACM European Conference on Computer Systems (EuroSys ʼ12), 337-350.(https://doi.org/10.1145/2168836.2168870)
  236. TCP/IP スタック設計の再考 • マルチコア環境で性能をスケールさせる • 基本的なアイデア:コア間で共有するオブジェクトを減らす • NIC のキューについて:NIC のマルチキュー機能を利⽤

    • Receive Side Scaling (RSS) も利⽤ • accept のスケーラビリティに関して • Affinity-Accept (EuroSys 2012) • MegaPipe (OSDI 2012) • mTCP (NSDI 2014) • Fastsocket (ASPLOS 2016) 303 ectly because it does not sufficiently stress the network ck: some requests involve performing SQL queries or ning PHP code, which stresses the disk and CPU more n the network stack. Applications that put less stress on network stack will see less pronounced improvements h Affinity-Accept. The files served range from 30 bytes to 70 bytes. The web server serves 30,000 distinct files, and ient chooses a file to request uniformly over all files. Unless otherwise stated, in all experiments a client re- ests a total of 6 files per connection with requests spaced by think time. First, a client requests one file and waits for Stock-Accept Fine-Accept Affinity-Accept 0 2000 4000 6000 8000 10000 12000 14000 16000 1 4 8 12 16 20 24 28 32 36 40 44 48 Throughput (requests / sec / core) Cores Apache HTTP server パフォーマンス ベンチマーククライアントは1回の TCP 接続で6ファイル取得 TCP接続 B TCP接続 A TCP接続 C TCP接続 D TCP接続 E TCP接続 F アプリケーション Fine-Accept: 全ての accept キューからラウンドロビンで accept accept() Aleksey Pesterev, Jacob Strauss, Nickolai Zeldovich, and Robert T. Morris. 2012. Improving Network Connection Locality on Multicore Systems. In Proceedings of the 7th ACM European Conference on Computer Systems (EuroSys ʼ12), 337-350.(https://doi.org/10.1145/2168836.2168870)
  237. TCP/IP スタック設計の再考 • マルチコア環境で性能をスケールさせる • 基本的なアイデア:コア間で共有するオブジェクトを減らす • NIC のキューについて:NIC のマルチキュー機能を利⽤

    • Receive Side Scaling (RSS) も利⽤ • accept のスケーラビリティに関して • Affinity-Accept (EuroSys 2012) • MegaPipe (OSDI 2012) • mTCP (NSDI 2014) • Fastsocket (ASPLOS 2016) 304 ectly because it does not sufficiently stress the network ck: some requests involve performing SQL queries or ning PHP code, which stresses the disk and CPU more n the network stack. Applications that put less stress on network stack will see less pronounced improvements h Affinity-Accept. The files served range from 30 bytes to 70 bytes. The web server serves 30,000 distinct files, and ient chooses a file to request uniformly over all files. Unless otherwise stated, in all experiments a client re- ests a total of 6 files per connection with requests spaced by think time. First, a client requests one file and waits for Stock-Accept Fine-Accept Affinity-Accept 0 2000 4000 6000 8000 10000 12000 14000 16000 1 4 8 12 16 20 24 28 32 36 40 44 48 Throughput (requests / sec / core) Cores Apache HTTP server パフォーマンス ベンチマーククライアントは1回の TCP 接続で6ファイル取得 TCP接続 B TCP接続 C TCP接続 D TCP接続 E TCP接続 F アプリケーション Fine-Accept: 全ての accept キューからラウンドロビンで accept accept() TCP接続 A Aleksey Pesterev, Jacob Strauss, Nickolai Zeldovich, and Robert T. Morris. 2012. Improving Network Connection Locality on Multicore Systems. In Proceedings of the 7th ACM European Conference on Computer Systems (EuroSys ʼ12), 337-350.(https://doi.org/10.1145/2168836.2168870)
  238. TCP/IP スタック設計の再考 • マルチコア環境で性能をスケールさせる • 基本的なアイデア:コア間で共有するオブジェクトを減らす • NIC のキューについて:NIC のマルチキュー機能を利⽤

    • Receive Side Scaling (RSS) も利⽤ • accept のスケーラビリティに関して • Affinity-Accept (EuroSys 2012) • MegaPipe (OSDI 2012) • mTCP (NSDI 2014) • Fastsocket (ASPLOS 2016) 305 ectly because it does not sufficiently stress the network ck: some requests involve performing SQL queries or ning PHP code, which stresses the disk and CPU more n the network stack. Applications that put less stress on network stack will see less pronounced improvements h Affinity-Accept. The files served range from 30 bytes to 70 bytes. The web server serves 30,000 distinct files, and ient chooses a file to request uniformly over all files. Unless otherwise stated, in all experiments a client re- ests a total of 6 files per connection with requests spaced by think time. First, a client requests one file and waits for Stock-Accept Fine-Accept Affinity-Accept 0 2000 4000 6000 8000 10000 12000 14000 16000 1 4 8 12 16 20 24 28 32 36 40 44 48 Throughput (requests / sec / core) Cores Apache HTTP server パフォーマンス ベンチマーククライアントは1回の TCP 接続で6ファイル取得 TCP接続 B TCP接続 C TCP接続 D TCP接続 E TCP接続 F アプリケーション Fine-Accept: 全ての accept キューからラウンドロビンで accept TCP接続 A Aleksey Pesterev, Jacob Strauss, Nickolai Zeldovich, and Robert T. Morris. 2012. Improving Network Connection Locality on Multicore Systems. In Proceedings of the 7th ACM European Conference on Computer Systems (EuroSys ʼ12), 337-350.(https://doi.org/10.1145/2168836.2168870)
  239. TCP/IP スタック設計の再考 • マルチコア環境で性能をスケールさせる • 基本的なアイデア:コア間で共有するオブジェクトを減らす • NIC のキューについて:NIC のマルチキュー機能を利⽤

    • Receive Side Scaling (RSS) も利⽤ • accept のスケーラビリティに関して • Affinity-Accept (EuroSys 2012) • MegaPipe (OSDI 2012) • mTCP (NSDI 2014) • Fastsocket (ASPLOS 2016) 306 ectly because it does not sufficiently stress the network ck: some requests involve performing SQL queries or ning PHP code, which stresses the disk and CPU more n the network stack. Applications that put less stress on network stack will see less pronounced improvements h Affinity-Accept. The files served range from 30 bytes to 70 bytes. The web server serves 30,000 distinct files, and ient chooses a file to request uniformly over all files. Unless otherwise stated, in all experiments a client re- ests a total of 6 files per connection with requests spaced by think time. First, a client requests one file and waits for Stock-Accept Fine-Accept Affinity-Accept 0 2000 4000 6000 8000 10000 12000 14000 16000 1 4 8 12 16 20 24 28 32 36 40 44 48 Throughput (requests / sec / core) Cores Apache HTTP server パフォーマンス ベンチマーククライアントは1回の TCP 接続で6ファイル取得 TCP接続 B TCP接続 C TCP接続 D TCP接続 E TCP接続 F アプリケーション Fine-Accept: 全ての accept キューからラウンドロビンで accept TCP接続 A accept() Aleksey Pesterev, Jacob Strauss, Nickolai Zeldovich, and Robert T. Morris. 2012. Improving Network Connection Locality on Multicore Systems. In Proceedings of the 7th ACM European Conference on Computer Systems (EuroSys ʼ12), 337-350.(https://doi.org/10.1145/2168836.2168870)
  240. TCP/IP スタック設計の再考 • マルチコア環境で性能をスケールさせる • 基本的なアイデア:コア間で共有するオブジェクトを減らす • NIC のキューについて:NIC のマルチキュー機能を利⽤

    • Receive Side Scaling (RSS) も利⽤ • accept のスケーラビリティに関して • Affinity-Accept (EuroSys 2012) • MegaPipe (OSDI 2012) • mTCP (NSDI 2014) • Fastsocket (ASPLOS 2016) 307 ectly because it does not sufficiently stress the network ck: some requests involve performing SQL queries or ning PHP code, which stresses the disk and CPU more n the network stack. Applications that put less stress on network stack will see less pronounced improvements h Affinity-Accept. The files served range from 30 bytes to 70 bytes. The web server serves 30,000 distinct files, and ient chooses a file to request uniformly over all files. Unless otherwise stated, in all experiments a client re- ests a total of 6 files per connection with requests spaced by think time. First, a client requests one file and waits for Stock-Accept Fine-Accept Affinity-Accept 0 2000 4000 6000 8000 10000 12000 14000 16000 1 4 8 12 16 20 24 28 32 36 40 44 48 Throughput (requests / sec / core) Cores Apache HTTP server パフォーマンス ベンチマーククライアントは1回の TCP 接続で6ファイル取得 TCP接続 C TCP接続 D TCP接続 E TCP接続 F アプリケーション Fine-Accept: 全ての accept キューからラウンドロビンで accept TCP接続 A accept() TCP接続 B Aleksey Pesterev, Jacob Strauss, Nickolai Zeldovich, and Robert T. Morris. 2012. Improving Network Connection Locality on Multicore Systems. In Proceedings of the 7th ACM European Conference on Computer Systems (EuroSys ʼ12), 337-350.(https://doi.org/10.1145/2168836.2168870)
  241. TCP/IP スタック設計の再考 • マルチコア環境で性能をスケールさせる • 基本的なアイデア:コア間で共有するオブジェクトを減らす • NIC のキューについて:NIC のマルチキュー機能を利⽤

    • Receive Side Scaling (RSS) も利⽤ • accept のスケーラビリティに関して • Affinity-Accept (EuroSys 2012) • MegaPipe (OSDI 2012) • mTCP (NSDI 2014) • Fastsocket (ASPLOS 2016) 308 ectly because it does not sufficiently stress the network ck: some requests involve performing SQL queries or ning PHP code, which stresses the disk and CPU more n the network stack. Applications that put less stress on network stack will see less pronounced improvements h Affinity-Accept. The files served range from 30 bytes to 70 bytes. The web server serves 30,000 distinct files, and ient chooses a file to request uniformly over all files. Unless otherwise stated, in all experiments a client re- ests a total of 6 files per connection with requests spaced by think time. First, a client requests one file and waits for Stock-Accept Fine-Accept Affinity-Accept 0 2000 4000 6000 8000 10000 12000 14000 16000 1 4 8 12 16 20 24 28 32 36 40 44 48 Throughput (requests / sec / core) Cores Apache HTTP server パフォーマンス ベンチマーククライアントは1回の TCP 接続で6ファイル取得 TCP接続 C TCP接続 D TCP接続 E TCP接続 F アプリケーション Fine-Accept: 全ての accept キューからラウンドロビンで accept TCP接続 A TCP接続 B Aleksey Pesterev, Jacob Strauss, Nickolai Zeldovich, and Robert T. Morris. 2012. Improving Network Connection Locality on Multicore Systems. In Proceedings of the 7th ACM European Conference on Computer Systems (EuroSys ʼ12), 337-350.(https://doi.org/10.1145/2168836.2168870)
  242. TCP/IP スタック設計の再考 • マルチコア環境で性能をスケールさせる • 基本的なアイデア:コア間で共有するオブジェクトを減らす • NIC のキューについて:NIC のマルチキュー機能を利⽤

    • Receive Side Scaling (RSS) も利⽤ • accept のスケーラビリティに関して • Affinity-Accept (EuroSys 2012) • MegaPipe (OSDI 2012) • mTCP (NSDI 2014) • Fastsocket (ASPLOS 2016) 309 ectly because it does not sufficiently stress the network ck: some requests involve performing SQL queries or ning PHP code, which stresses the disk and CPU more n the network stack. Applications that put less stress on network stack will see less pronounced improvements h Affinity-Accept. The files served range from 30 bytes to 70 bytes. The web server serves 30,000 distinct files, and ient chooses a file to request uniformly over all files. Unless otherwise stated, in all experiments a client re- ests a total of 6 files per connection with requests spaced by think time. First, a client requests one file and waits for Stock-Accept Fine-Accept Affinity-Accept 0 2000 4000 6000 8000 10000 12000 14000 16000 1 4 8 12 16 20 24 28 32 36 40 44 48 Throughput (requests / sec / core) Cores Apache HTTP server パフォーマンス ベンチマーククライアントは1回の TCP 接続で6ファイル取得 TCP接続 C TCP接続 D TCP接続 E TCP接続 F アプリケーション Fine-Accept: 全ての accept キューからラウンドロビンで accept TCP接続 A TCP接続 B accept() Aleksey Pesterev, Jacob Strauss, Nickolai Zeldovich, and Robert T. Morris. 2012. Improving Network Connection Locality on Multicore Systems. In Proceedings of the 7th ACM European Conference on Computer Systems (EuroSys ʼ12), 337-350.(https://doi.org/10.1145/2168836.2168870)
  243. TCP/IP スタック設計の再考 • マルチコア環境で性能をスケールさせる • 基本的なアイデア:コア間で共有するオブジェクトを減らす • NIC のキューについて:NIC のマルチキュー機能を利⽤

    • Receive Side Scaling (RSS) も利⽤ • accept のスケーラビリティに関して • Affinity-Accept (EuroSys 2012) • MegaPipe (OSDI 2012) • mTCP (NSDI 2014) • Fastsocket (ASPLOS 2016) 310 ectly because it does not sufficiently stress the network ck: some requests involve performing SQL queries or ning PHP code, which stresses the disk and CPU more n the network stack. Applications that put less stress on network stack will see less pronounced improvements h Affinity-Accept. The files served range from 30 bytes to 70 bytes. The web server serves 30,000 distinct files, and ient chooses a file to request uniformly over all files. Unless otherwise stated, in all experiments a client re- ests a total of 6 files per connection with requests spaced by think time. First, a client requests one file and waits for Stock-Accept Fine-Accept Affinity-Accept 0 2000 4000 6000 8000 10000 12000 14000 16000 1 4 8 12 16 20 24 28 32 36 40 44 48 Throughput (requests / sec / core) Cores Apache HTTP server パフォーマンス ベンチマーククライアントは1回の TCP 接続で6ファイル取得 TCP接続 D TCP接続 E TCP接続 F アプリケーション Fine-Accept: 全ての accept キューからラウンドロビンで accept TCP接続 A TCP接続 B accept() TCP接続 C Aleksey Pesterev, Jacob Strauss, Nickolai Zeldovich, and Robert T. Morris. 2012. Improving Network Connection Locality on Multicore Systems. In Proceedings of the 7th ACM European Conference on Computer Systems (EuroSys ʼ12), 337-350.(https://doi.org/10.1145/2168836.2168870)
  244. TCP/IP スタック設計の再考 • マルチコア環境で性能をスケールさせる • 基本的なアイデア:コア間で共有するオブジェクトを減らす • NIC のキューについて:NIC のマルチキュー機能を利⽤

    • Receive Side Scaling (RSS) も利⽤ • accept のスケーラビリティに関して • Affinity-Accept (EuroSys 2012) • MegaPipe (OSDI 2012) • mTCP (NSDI 2014) • Fastsocket (ASPLOS 2016) 311 ectly because it does not sufficiently stress the network ck: some requests involve performing SQL queries or ning PHP code, which stresses the disk and CPU more n the network stack. Applications that put less stress on network stack will see less pronounced improvements h Affinity-Accept. The files served range from 30 bytes to 70 bytes. The web server serves 30,000 distinct files, and ient chooses a file to request uniformly over all files. Unless otherwise stated, in all experiments a client re- ests a total of 6 files per connection with requests spaced by think time. First, a client requests one file and waits for Stock-Accept Fine-Accept Affinity-Accept 0 2000 4000 6000 8000 10000 12000 14000 16000 1 4 8 12 16 20 24 28 32 36 40 44 48 Throughput (requests / sec / core) Cores Apache HTTP server パフォーマンス ベンチマーククライアントは1回の TCP 接続で6ファイル取得 TCP接続 B TCP接続 A TCP接続 C TCP接続 D TCP接続 E TCP接続 F アプリケーション Affinity-Accept: 基本的に特定の accept キューからのみ accept accept() Aleksey Pesterev, Jacob Strauss, Nickolai Zeldovich, and Robert T. Morris. 2012. Improving Network Connection Locality on Multicore Systems. In Proceedings of the 7th ACM European Conference on Computer Systems (EuroSys ʼ12), 337-350.(https://doi.org/10.1145/2168836.2168870)
  245. TCP/IP スタック設計の再考 • マルチコア環境で性能をスケールさせる • 基本的なアイデア:コア間で共有するオブジェクトを減らす • NIC のキューについて:NIC のマルチキュー機能を利⽤

    • Receive Side Scaling (RSS) も利⽤ • accept のスケーラビリティに関して • Affinity-Accept (EuroSys 2012) • MegaPipe (OSDI 2012) • mTCP (NSDI 2014) • Fastsocket (ASPLOS 2016) 312 ectly because it does not sufficiently stress the network ck: some requests involve performing SQL queries or ning PHP code, which stresses the disk and CPU more n the network stack. Applications that put less stress on network stack will see less pronounced improvements h Affinity-Accept. The files served range from 30 bytes to 70 bytes. The web server serves 30,000 distinct files, and ient chooses a file to request uniformly over all files. Unless otherwise stated, in all experiments a client re- ests a total of 6 files per connection with requests spaced by think time. First, a client requests one file and waits for Stock-Accept Fine-Accept Affinity-Accept 0 2000 4000 6000 8000 10000 12000 14000 16000 1 4 8 12 16 20 24 28 32 36 40 44 48 Throughput (requests / sec / core) Cores Apache HTTP server パフォーマンス ベンチマーククライアントは1回の TCP 接続で6ファイル取得 TCP接続 B TCP接続 C TCP接続 D TCP接続 E TCP接続 F アプリケーション Affinity-Accept: 基本的に特定の accept キューからのみ accept TCP接続 A Aleksey Pesterev, Jacob Strauss, Nickolai Zeldovich, and Robert T. Morris. 2012. Improving Network Connection Locality on Multicore Systems. In Proceedings of the 7th ACM European Conference on Computer Systems (EuroSys ʼ12), 337-350.(https://doi.org/10.1145/2168836.2168870)
  246. TCP/IP スタック設計の再考 • マルチコア環境で性能をスケールさせる • 基本的なアイデア:コア間で共有するオブジェクトを減らす • NIC のキューについて:NIC のマルチキュー機能を利⽤

    • Receive Side Scaling (RSS) も利⽤ • accept のスケーラビリティに関して • Affinity-Accept (EuroSys 2012) • MegaPipe (OSDI 2012) • mTCP (NSDI 2014) • Fastsocket (ASPLOS 2016) 313 ectly because it does not sufficiently stress the network ck: some requests involve performing SQL queries or ning PHP code, which stresses the disk and CPU more n the network stack. Applications that put less stress on network stack will see less pronounced improvements h Affinity-Accept. The files served range from 30 bytes to 70 bytes. The web server serves 30,000 distinct files, and ient chooses a file to request uniformly over all files. Unless otherwise stated, in all experiments a client re- ests a total of 6 files per connection with requests spaced by think time. First, a client requests one file and waits for Stock-Accept Fine-Accept Affinity-Accept 0 2000 4000 6000 8000 10000 12000 14000 16000 1 4 8 12 16 20 24 28 32 36 40 44 48 Throughput (requests / sec / core) Cores Apache HTTP server パフォーマンス ベンチマーククライアントは1回の TCP 接続で6ファイル取得 TCP接続 B TCP接続 C TCP接続 D TCP接続 E TCP接続 F アプリケーション Affinity-Accept: 基本的に特定の accept キューからのみ accept TCP接続 A accept() Aleksey Pesterev, Jacob Strauss, Nickolai Zeldovich, and Robert T. Morris. 2012. Improving Network Connection Locality on Multicore Systems. In Proceedings of the 7th ACM European Conference on Computer Systems (EuroSys ʼ12), 337-350.(https://doi.org/10.1145/2168836.2168870)
  247. TCP/IP スタック設計の再考 • マルチコア環境で性能をスケールさせる • 基本的なアイデア:コア間で共有するオブジェクトを減らす • NIC のキューについて:NIC のマルチキュー機能を利⽤

    • Receive Side Scaling (RSS) も利⽤ • accept のスケーラビリティに関して • Affinity-Accept (EuroSys 2012) • MegaPipe (OSDI 2012) • mTCP (NSDI 2014) • Fastsocket (ASPLOS 2016) 314 ectly because it does not sufficiently stress the network ck: some requests involve performing SQL queries or ning PHP code, which stresses the disk and CPU more n the network stack. Applications that put less stress on network stack will see less pronounced improvements h Affinity-Accept. The files served range from 30 bytes to 70 bytes. The web server serves 30,000 distinct files, and ient chooses a file to request uniformly over all files. Unless otherwise stated, in all experiments a client re- ests a total of 6 files per connection with requests spaced by think time. First, a client requests one file and waits for Stock-Accept Fine-Accept Affinity-Accept 0 2000 4000 6000 8000 10000 12000 14000 16000 1 4 8 12 16 20 24 28 32 36 40 44 48 Throughput (requests / sec / core) Cores Apache HTTP server パフォーマンス ベンチマーククライアントは1回の TCP 接続で6ファイル取得 TCP接続 B TCP接続 D TCP接続 E TCP接続 F アプリケーション Affinity-Accept: 基本的に特定の accept キューからのみ accept TCP接続 A accept() TCP接続 C Aleksey Pesterev, Jacob Strauss, Nickolai Zeldovich, and Robert T. Morris. 2012. Improving Network Connection Locality on Multicore Systems. In Proceedings of the 7th ACM European Conference on Computer Systems (EuroSys ʼ12), 337-350.(https://doi.org/10.1145/2168836.2168870)
  248. TCP/IP スタック設計の再考 • マルチコア環境で性能をスケールさせる • 基本的なアイデア:コア間で共有するオブジェクトを減らす • NIC のキューについて:NIC のマルチキュー機能を利⽤

    • Receive Side Scaling (RSS) も利⽤ • accept のスケーラビリティに関して • Affinity-Accept (EuroSys 2012) • MegaPipe (OSDI 2012) • mTCP (NSDI 2014) • Fastsocket (ASPLOS 2016) 315 ectly because it does not sufficiently stress the network ck: some requests involve performing SQL queries or ning PHP code, which stresses the disk and CPU more n the network stack. Applications that put less stress on network stack will see less pronounced improvements h Affinity-Accept. The files served range from 30 bytes to 70 bytes. The web server serves 30,000 distinct files, and ient chooses a file to request uniformly over all files. Unless otherwise stated, in all experiments a client re- ests a total of 6 files per connection with requests spaced by think time. First, a client requests one file and waits for Stock-Accept Fine-Accept Affinity-Accept 0 2000 4000 6000 8000 10000 12000 14000 16000 1 4 8 12 16 20 24 28 32 36 40 44 48 Throughput (requests / sec / core) Cores Apache HTTP server パフォーマンス ベンチマーククライアントは1回の TCP 接続で6ファイル取得 Aleksey Pesterev, Jacob Strauss, Nickolai Zeldovich, and Robert T. Morris. 2012. Improving Network Connection Locality on Multicore Systems. In Proceedings of the 7th ACM European Conference on Computer Systems (EuroSys ʼ12), 337-350.(https://doi.org/10.1145/2168836.2168870)
  249. TCP/IP スタック設計の再考 • マルチコア環境で性能をスケールさせる • 基本的なアイデア:コア間で共有するオブジェクトを減らす • NIC のキューについて:NIC のマルチキュー機能を利⽤

    • Receive Side Scaling (RSS) も利⽤ • accept のスケーラビリティに関して • Affinity-Accept (EuroSys 2012) • MegaPipe (OSDI 2012) • mTCP (NSDI 2014) • Fastsocket (ASPLOS 2016) 316 ectly because it does not sufficiently stress the network ck: some requests involve performing SQL queries or ning PHP code, which stresses the disk and CPU more n the network stack. Applications that put less stress on network stack will see less pronounced improvements h Affinity-Accept. The files served range from 30 bytes to 70 bytes. The web server serves 30,000 distinct files, and ient chooses a file to request uniformly over all files. Unless otherwise stated, in all experiments a client re- ests a total of 6 files per connection with requests spaced by think time. First, a client requests one file and waits for Stock-Accept Fine-Accept Affinity-Accept 0 2000 4000 6000 8000 10000 12000 14000 16000 1 4 8 12 16 20 24 28 32 36 40 44 48 Throughput (requests / sec / core) Cores Apache HTTP server パフォーマンス ベンチマーククライアントは1回の TCP 接続で6ファイル取得 デフォルト実装はコアが増えるほど 1コアが処理するリクエストが減っている Aleksey Pesterev, Jacob Strauss, Nickolai Zeldovich, and Robert T. Morris. 2012. Improving Network Connection Locality on Multicore Systems. In Proceedings of the 7th ACM European Conference on Computer Systems (EuroSys ʼ12), 337-350.(https://doi.org/10.1145/2168836.2168870)
  250. TCP/IP スタック設計の再考 • マルチコア環境で性能をスケールさせる • 基本的なアイデア:コア間で共有するオブジェクトを減らす • NIC のキューについて:NIC のマルチキュー機能を利⽤

    • Receive Side Scaling (RSS) も利⽤ • accept のスケーラビリティに関して • Affinity-Accept (EuroSys 2012) • MegaPipe (OSDI 2012) • mTCP (NSDI 2014) • Fastsocket (ASPLOS 2016) 317 ectly because it does not sufficiently stress the network ck: some requests involve performing SQL queries or ning PHP code, which stresses the disk and CPU more n the network stack. Applications that put less stress on network stack will see less pronounced improvements h Affinity-Accept. The files served range from 30 bytes to 70 bytes. The web server serves 30,000 distinct files, and ient chooses a file to request uniformly over all files. Unless otherwise stated, in all experiments a client re- ests a total of 6 files per connection with requests spaced by think time. First, a client requests one file and waits for Stock-Accept Fine-Accept Affinity-Accept 0 2000 4000 6000 8000 10000 12000 14000 16000 1 4 8 12 16 20 24 28 32 36 40 44 48 Throughput (requests / sec / core) Cores Apache HTTP server パフォーマンス ベンチマーククライアントは1回の TCP 接続で6ファイル取得 Affinity/Fine-Accept は下降がゆるやか Aleksey Pesterev, Jacob Strauss, Nickolai Zeldovich, and Robert T. Morris. 2012. Improving Network Connection Locality on Multicore Systems. In Proceedings of the 7th ACM European Conference on Computer Systems (EuroSys ʼ12), 337-350.(https://doi.org/10.1145/2168836.2168870)
  251. TCP/IP スタック設計の再考 • マルチコア環境で性能をスケールさせる • 基本的なアイデア:コア間で共有するオブジェクトを減らす • NIC のキューについて:NIC のマルチキュー機能を利⽤

    • Receive Side Scaling (RSS) も利⽤ • accept のスケーラビリティに関して • Affinity-Accept (EuroSys 2012) • MegaPipe (OSDI 2012) • mTCP (NSDI 2014) • Fastsocket (ASPLOS 2016) 318 ectly because it does not sufficiently stress the network ck: some requests involve performing SQL queries or ning PHP code, which stresses the disk and CPU more n the network stack. Applications that put less stress on network stack will see less pronounced improvements h Affinity-Accept. The files served range from 30 bytes to 70 bytes. The web server serves 30,000 distinct files, and ient chooses a file to request uniformly over all files. Unless otherwise stated, in all experiments a client re- ests a total of 6 files per connection with requests spaced by think time. First, a client requests one file and waits for Stock-Accept Fine-Accept Affinity-Accept 0 2000 4000 6000 8000 10000 12000 14000 16000 1 4 8 12 16 20 24 28 32 36 40 44 48 Throughput (requests / sec / core) Cores Apache HTTP server パフォーマンス ベンチマーククライアントは1回の TCP 接続で6ファイル取得 Fine-Accept (ラウンドロビン)より Affinity-Accept の⽅が速い キャッシュ効率が原因との説明 Aleksey Pesterev, Jacob Strauss, Nickolai Zeldovich, and Robert T. Morris. 2012. Improving Network Connection Locality on Multicore Systems. In Proceedings of the 7th ACM European Conference on Computer Systems (EuroSys ʼ12), 337-350.(https://doi.org/10.1145/2168836.2168870)
  252. TCP/IP スタック設計の再考 • マルチコア環境で性能をスケールさせる • 基本的なアイデア:コア間で共有するオブジェクトを減らす • NIC のキューについて:NIC のマルチキュー機能を利⽤

    • Receive Side Scaling (RSS) も利⽤ • accept のスケーラビリティに関して • Affinity-Accept (EuroSys 2012) • MegaPipe (OSDI 2012) • mTCP (NSDI 2014) • Fastsocket (ASPLOS 2016) 319 POSIX socket に変わる API の提案 - accept のキューをコアごとに分ける
  253. TCP/IP スタック設計の再考 • マルチコア環境で性能をスケールさせる • 基本的なアイデア:コア間で共有するオブジェクトを減らす • NIC のキューについて:NIC のマルチキュー機能を利⽤

    • Receive Side Scaling (RSS) も利⽤ • accept のスケーラビリティに関して • Affinity-Accept (EuroSys 2012) • MegaPipe (OSDI 2012) • mTCP (NSDI 2014) • Fastsocket (ASPLOS 2016) 320 POSIX socket に変わる API の提案 - accept のキューをコアごとに分ける - ファイルデスクリプタのテーブルも分ける - 複数のリクエストをバッチ可能 (FlexSC と同様の効果を期待)
  254. TCP/IP スタック設計の再考 • マルチコア環境で性能をスケールさせる • 基本的なアイデア:コア間で共有するオブジェクトを減らす • NIC のキューについて:NIC のマルチキュー機能を利⽤

    • Receive Side Scaling (RSS) も利⽤ • accept のスケーラビリティに関して • Affinity-Accept (EuroSys 2012) • MegaPipe (OSDI 2012) • mTCP (NSDI 2014) • Fastsocket (ASPLOS 2016) 321 0 20 40 60 80 100 0 0.6 1.2 1.8 2.4 3 3.6 1 2 3 4 5 6 7 8 Throughput (Gbps) # of CPU Cores MegaPipe Baseline 0 20 40 60 80 100 0 20 40 60 80 100 0 4 8 12 16 20 1 2 3 4 5 6 7 8 0 20 40 60 80 100 0 4 8 12 16 20 1 2 3 4 5 6 7 8 Improvement (%) Improvement 0 20 40 60 80 100 0 0.6 1.2 1.8 2.4 3 3.6 1 2 3 4 5 6 7 8 Throughput (Gbps) # of CPU Cores MegaPipe Baseline 0 20 40 60 80 100 0 4 8 12 16 20 1 2 3 4 5 6 7 8 # of CPU Cores 0 20 40 60 80 100 0 4 8 12 16 20 1 2 3 4 5 6 7 8 Improvement (%) # of CPU Cores Improvement Figure 7: Evaluation of nginx throughput for the (a) SpecWeb, (b) Yahoo, and (c) Yahoo/2 workloads. and 200µs (tail) lower latency with low concurrency (thus 50% of the total traffic. nginx HTTP server パフォーマンス ベンチマーククライアントは1回の TCP 接続で6ファイル取得 Sangjin Han, Scott Marshall, Byung-Gon Chun, Sylvia Ratnasamy, "MegaPipe: A New Programming Interface for Scalable Network I/O", OSDI 2012 https://www.usenix.org/conference/osdi12/technical-sessions/presentation/han
  255. TCP/IP スタック設計の再考 • パケット I/O フレームワーク上で TCP/IP スタックを動かす • Sandstorm

    (SIGCOMM 2014) • mTCP (NSDI 2014) • Arrakis (OSDI 2014) • IX (OSDI 2014) • StackMap (USENIX ATC 2016) • Atlas (SIGCOMM 2017) • ZygOS (SOSP 2017) • Shenango (NSDI 2019) • Shinjuku (NSDI 2019) • TAS (EuroSys 2019) • Caladan (OSDI 2020) • zIO (OSDI 2021) • Demikernel (SOSP 2021) 323
  256. パケット I/O フレームワークの⽤途 送信⽤ NIC デバイスドライバ アプリケーション ユーザー空間 デスクリプタリング 受信⽤

    NIC レジスタ • デスクリプタリング位置 • 転送リング head • 転送リング tail • 受信リング head • 受信リング tail DMA 受信⽤パケットバッファ ソフトウェア(デバドラ)は メモリを通じてアクセス 324 DPDK API Network Function Virtualization (NFV) 汎⽤的なサーバーでネットワーク機能を 動かす (e.g., Firewall, Router) サーバープログラムの⾼速化 TCP/IP スタック ユーザー空間で動作する TCP/IP スタックと組み合わせる
  257. TCP/IP スタック設計の再考 • パケット I/O フレームワーク上で TCP/IP スタックを動かす • Sandstorm

    (SIGCOMM 2014) • mTCP (NSDI 2014) • Arrakis (OSDI 2014) • IX (OSDI 2014) • StackMap (USENIX ATC 2016) • Atlas (SIGCOMM 2017) • ZygOS (SOSP 2017) • Shenango (NSDI 2019) • Shinjuku (NSDI 2019) • TAS (EuroSys 2019) • Caladan (OSDI 2020) • Demikernel (SOSP 2021) 325
  258. TCP/IP スタック設計の再考 • パケット I/O フレームワーク上で TCP/IP スタックを動かす • Sandstorm

    (SIGCOMM 2014) • mTCP (NSDI 2014) • Arrakis (OSDI 2014) • IX (OSDI 2014) • StackMap (USENIX ATC 2016) • Atlas (SIGCOMM 2017) • ZygOS (SOSP 2017) • Shenango (NSDI 2019) • Shinjuku (NSDI 2019) • TAS (EuroSys 2019) • Caladan (OSDI 2020) • Demikernel (SOSP 2021) 326 Web サーバー netmap + ユーザー空間 TCP/IP スタック (コンテンツをパケットバッファ上に事前配置)
  259. TCP/IP スタック設計の再考 • パケット I/O フレームワーク上で TCP/IP スタックを動かす • Sandstorm

    (SIGCOMM 2014) • mTCP (NSDI 2014) • Arrakis (OSDI 2014) • IX (OSDI 2014) • StackMap (USENIX ATC 2016) • Atlas (SIGCOMM 2017) • ZygOS (SOSP 2017) • Shenango (NSDI 2019) • Shinjuku (NSDI 2019) • TAS (EuroSys 2019) • Caladan (OSDI 2020) • Demikernel (SOSP 2021) 327 Web サーバー netmap + ユーザー空間 TCP/IP スタック (コンテンツをパケットバッファ上に事前配置) コンテンツ配送速度(6つの 10Gbps NIC 合計) Ilias Marinos, Robert N. M. Watson, and Mark Handley. 2014. Network Stack Specialization for Performance. In Proceedings of the 2014 ACM Conference on SIGCOMM (SIGCOMM ʼ14), 175-186.(https://doi.org/10.1145/2619239.2626311)
  260. TCP/IP スタック設計の再考 • パケット I/O フレームワーク上で TCP/IP スタックを動かす • Sandstorm

    (SIGCOMM 2014) • mTCP (NSDI 2014) • Arrakis (OSDI 2014) • IX (OSDI 2014) • StackMap (USENIX ATC 2016) • Atlas (SIGCOMM 2017) • ZygOS (SOSP 2017) • Shenango (NSDI 2019) • Shinjuku (NSDI 2019) • TAS (EuroSys 2019) • Caladan (OSDI 2020) • Demikernel (SOSP 2021) 328 ユーザー空間 TCP/IP スタック - accept キュー等をコアごとに⽤意 - リクエストをバッチ
  261. TCP/IP スタック設計の再考 • パケット I/O フレームワーク上で TCP/IP スタックを動かす • Sandstorm

    (SIGCOMM 2014) • mTCP (NSDI 2014) • Arrakis (OSDI 2014) • IX (OSDI 2014) • StackMap (USENIX ATC 2016) • Atlas (SIGCOMM 2017) • ZygOS (SOSP 2017) • Shenango (NSDI 2019) • Shinjuku (NSDI 2019) • TAS (EuroSys 2019) • Caladan (OSDI 2020) • Demikernel (SOSP 2021) 329 ユーザー空間 TCP/IP スタック - accept キュー等をコアごとに⽤意 - リクエストをバッチ 0 2 4 6 8 10 Throughput (Gbps) - 10 20 30 40 50 1 2 8 32 64 128 Messages/sec (x 105) Number of Messages per Connection Link saturated 0 - 3 6 9 12 15 0 2 4 6 8 Messages/sec (x 105) Number of CPU Cores 1 0 - 10 20 30 40 50 Messages/sec (x 105) 0 0 2 4 6 8 10 Throughput (Gbps) - 10 20 30 40 50 1 2 8 32 64 128 Messages/sec (x 105) Number of Messages per Connection Link saturated 0 - 3 6 9 12 15 0 2 4 6 8 Messages/sec (x 105) Number of CPU Cores 1 0 - 10 20 30 40 50 Messages/sec (x 105) 0 0 2 4 6 8 10 Throughput (Gbps) - 10 20 30 40 50 1 2 8 32 64 128 Messages/sec (x 105) Number of Messages per Connection Link saturated 0 - 3 6 9 12 15 0 2 4 6 8 Messages/sec (x 105) Number of CPU Cores 1 0 - 10 20 30 40 50 1 Messages/sec (x 105) N 0 1 2 2 3 3 4 4 nections/sec (x 105) Linux REUSEPORT MegaPipe 1 2 4 Number of Message 0 2 4 6 8 10 64B 256B 1KiB 4KiB 8KiB Throughput (Gbps) Message Size 8 32 64 128 ssages per Connection Link saturated - 3 6 9 12 15 0 2 4 6 8 Messages/sec (x 105) Number of CPU Cores 1 0 4 6 8 of CPU Cores - 10 20 30 40 50 1 2 8 32 64 128 Messages/sec (x 105) Number of Messages per Connection Link saturated 0 0 2 4 6 8 10 64B 256B 1KiB 4KiB 8KiB Throughput (Gbps) Message Size Linux REUSEPORT MegaPipe mTCP 1 2 4 Number of Messages 0 2 4 6 8 10 64B 256B 1KiB 4KiB 8KiB Throughput (Gbps) Message Size 8 32 64 128 ssages per Connection Link saturated - 3 6 9 12 15 0 2 4 6 8 Messages/sec (x 105) Number of CPU Cores 1 0 4 6 8 f CPU Cores - 10 20 30 40 50 1 2 8 32 64 128 Messages/sec (x 105) Number of Messages per Connection Link saturated 0 0 2 4 6 8 10 64B 256B 1KiB 4KiB 8KiB Throughput (Gbps) Message Size Linux REUSEPORT MegaPipe mTCP 1 2 4 8 Number of Messages per 0 2 4 6 8 10 64B 256B 1KiB 4KiB 8KiB Throughput (Gbps) Message Size 32 64 128 es per Connection Link saturated - 3 6 9 12 15 0 2 4 6 8 Messages/sec (x 105) Number of CPU Cores 1 0 6 8 PU Cores - 10 20 30 40 50 1 2 8 32 64 128 Messages/sec (x 105) Number of Messages per Connection Link saturated 0 0 2 4 6 8 10 64B 256B 1KiB 4KiB 8KiB Throughput (Gbps) Message Size Linux REUSEPORT MegaPipe mTCP Linux REUSEPORT Multiprocess MegaPipe mTCP REUSEPORT MegaPipe EunYoung Jeong, Shinae Wood, Muhammad Jamshed, Haewon Jeong, Sunghwan Ihm, Dongsu Han, and KyoungSoo Park. 2014. mTCP: A Highly Scalable User-Level TCP Stack for Multicore Systems. In 11th USENIX Symposium on Networked Systems Design and Implementation (NSDI 14), 489- 502.(https://www.usenix.org/conference/nsdi14/technical-sessions/presentation/jeong)
  262. TCP/IP スタック設計の再考 • パケット I/O フレームワーク上で TCP/IP スタックを動かす • Sandstorm

    (SIGCOMM 2014) • mTCP (NSDI 2014) • Arrakis (OSDI 2014) • IX (OSDI 2014) • StackMap (USENIX ATC 2016) • Atlas (SIGCOMM 2017) • ZygOS (SOSP 2017) • Shenango (NSDI 2019) • Shinjuku (NSDI 2019) • TAS (EuroSys 2019) • Caladan (OSDI 2020) • Demikernel (SOSP 2021) 330 新しい OS - アプリ+lwIP が直接 NIC へアクセス - NIC の SR-IOV 機能で多重化
  263. TCP/IP スタック設計の再考 • パケット I/O フレームワーク上で TCP/IP スタックを動かす • Sandstorm

    (SIGCOMM 2014) • mTCP (NSDI 2014) • Arrakis (OSDI 2014) • IX (OSDI 2014) • StackMap (USENIX ATC 2016) • Atlas (SIGCOMM 2017) • ZygOS (SOSP 2017) • Shenango (NSDI 2019) • Shinjuku (NSDI 2019) • TAS (EuroSys 2019) • Caladan (OSDI 2020) • Demikernel (SOSP 2021) 331 新しい OS - アプリ+lwIP が直接 NIC へアクセス - NIC の SR-IOV 機能で多重化 TCP$Echo:$Mul3core$Scalability$ for$Short$Connec3ons$ 0 0.5 1 1.5 2 2.5 3 3.5 4 0 1 2 3 4 5 6 7 8 Messages/sec (x 106) Number of CPU cores IX 10GbE IX 4x10GbE Linux 10GbE Linux 4x10GbE mTCP 10GbE Saturates% 1x10GbE% Adam Belay, George Prekas, Ana Klimovic, Samuel Grossman, Christos Kozyrakis, and Edouard Bugnion. 2014. IX: A Protected Dataplane Operating System for High Throughput and Low Latency. In 11th USENIX Symposium on Operating Systems Design and Implementation (OSDI 14), 49- 65.(https://www.usenix.org/conference/osdi14/technical-sessions/presentation/belay)
  264. TCP/IP スタック設計の再考 • パケット I/O フレームワーク上で TCP/IP スタックを動かす • Sandstorm

    (SIGCOMM 2014) • mTCP (NSDI 2014) • Arrakis (OSDI 2014) • IX (OSDI 2014) • StackMap (USENIX ATC 2016) • Atlas (SIGCOMM 2017) • ZygOS (SOSP 2017) • Shenango (NSDI 2019) • Shinjuku (NSDI 2019) • TAS (EuroSys 2019) • Caladan (OSDI 2020) • Demikernel (SOSP 2021) 333 netmap + カーネル TCP/IP スタック - アプリの API とデータパスは(ほぼ) netmap - ヘッダの処理にカーネル TCP/IP スタックを利⽤ StackMap Architecture NIC Device3drivers Linux3packet3I/O Socket3API StackMap app Regular3app 1. user kernel NIC TCP/IP/Eth netmap framework Packet3buffers 4. 2. 3. 1. Socket)API)for)control)path ! socket(),)bind(),)listen() 2. Netmap API)for)data)path) (extended) ! Syscall and)packet)I/O) batching,)zero)copy,)run-to- completion 3. Persistent,)fixed-size) sk_buffs ! Efficiently)call)into)kernel)TCP/IP Kenichi Yasukata, Michio Honda, Douglas Santry, and Lars Eggert. 2016. StackMap: Low-Latency Networking with the OS Stack and Dedicated NICs. In 2016 USENIX Annual Technical Conference (USENIX ATC 16), 43-56.(https://www.usenix.org/conference/atc16/technical-sessions/presentation/yasukata)
  265. TCP/IP スタック設計の再考 • パケット I/O フレームワーク上で TCP/IP スタックを動かす • Sandstorm

    (SIGCOMM 2014) • mTCP (NSDI 2014) • Arrakis (OSDI 2014) • IX (OSDI 2014) • StackMap (USENIX ATC 2016) • Atlas (SIGCOMM 2017) • ZygOS (SOSP 2017) • Shenango (NSDI 2019) • Shinjuku (NSDI 2019) • TAS (EuroSys 2019) • Caladan (OSDI 2020) • Demikernel (SOSP 2021) 334 netmap + カーネル TCP/IP スタック - アプリの API とデータパスは(ほぼ) netmap - ヘッダの処理にカーネル TCP/IP スタックを利⽤ StackMap Architecture NIC Device3drivers Linux3packet3I/O Socket3API StackMap app Regular3app 1. user kernel NIC TCP/IP/Eth netmap framework Packet3buffers 4. 2. 3. 1. Socket)API)for)control)path ! socket(),)bind(),)listen() 2. Netmap API)for)data)path) (extended) ! Syscall and)packet)I/O) batching,)zero)copy,)run-to- completion 3. Persistent,)fixed-size) sk_buffs ! Efficiently)call)into)kernel)TCP/IP データパス Kenichi Yasukata, Michio Honda, Douglas Santry, and Lars Eggert. 2016. StackMap: Low-Latency Networking with the OS Stack and Dedicated NICs. In 2016 USENIX Annual Technical Conference (USENIX ATC 16), 43-56.(https://www.usenix.org/conference/atc16/technical-sessions/presentation/yasukata)
  266. TCP/IP スタック設計の再考 • パケット I/O フレームワーク上で TCP/IP スタックを動かす • Sandstorm

    (SIGCOMM 2014) • mTCP (NSDI 2014) • Arrakis (OSDI 2014) • IX (OSDI 2014) • StackMap (USENIX ATC 2016) • Atlas (SIGCOMM 2017) • ZygOS (SOSP 2017) • Shenango (NSDI 2019) • Shinjuku (NSDI 2019) • TAS (EuroSys 2019) • Caladan (OSDI 2020) • Demikernel (SOSP 2021) 335 netmap + カーネル TCP/IP スタック - アプリの API とデータパスは(ほぼ) netmap - ヘッダの処理にカーネル TCP/IP スタックを利⽤ StackMap Architecture NIC Device3drivers Linux3packet3I/O Socket3API StackMap app Regular3app 1. user kernel NIC TCP/IP/Eth netmap framework Packet3buffers 4. 2. 3. 1. Socket)API)for)control)path ! socket(),)bind(),)listen() 2. Netmap API)for)data)path) (extended) ! Syscall and)packet)I/O) batching,)zero)copy,)run-to- completion 3. Persistent,)fixed-size) sk_buffs ! Efficiently)call)into)kernel)TCP/IP パケットは Socket API と Linux の通常の I/O サブシステムをバイパス データパス Kenichi Yasukata, Michio Honda, Douglas Santry, and Lars Eggert. 2016. StackMap: Low-Latency Networking with the OS Stack and Dedicated NICs. In 2016 USENIX Annual Technical Conference (USENIX ATC 16), 43-56.(https://www.usenix.org/conference/atc16/technical-sessions/presentation/yasukata)
  267. TCP/IP スタック設計の再考 • パケット I/O フレームワーク上で TCP/IP スタックを動かす • Sandstorm

    (SIGCOMM 2014) • mTCP (NSDI 2014) • Arrakis (OSDI 2014) • IX (OSDI 2014) • StackMap (USENIX ATC 2016) • Atlas (SIGCOMM 2017) • ZygOS (SOSP 2017) • Shenango (NSDI 2019) • Shinjuku (NSDI 2019) • TAS (EuroSys 2019) • Caladan (OSDI 2020) • Demikernel (SOSP 2021) 336 netmap + カーネル TCP/IP スタック - アプリの API とデータパスは(ほぼ) netmap - ヘッダの処理にカーネル TCP/IP スタックを利⽤ StackMap Architecture NIC Device3drivers Linux3packet3I/O Socket3API StackMap app Regular3app 1. user kernel NIC TCP/IP/Eth netmap framework Packet3buffers 4. 2. 3. 1. Socket)API)for)control)path ! socket(),)bind(),)listen() 2. Netmap API)for)data)path) (extended) ! Syscall and)packet)I/O) batching,)zero)copy,)run-to- completion 3. Persistent,)fixed-size) sk_buffs ! Efficiently)call)into)kernel)TCP/IP パケットは Socket API と Linux の通常の I/O サブシステムをバイパス データパス 送受信に際してカーネルのTCP/IPスタックが ヘッダの処理を⾏う Kenichi Yasukata, Michio Honda, Douglas Santry, and Lars Eggert. 2016. StackMap: Low-Latency Networking with the OS Stack and Dedicated NICs. In 2016 USENIX Annual Technical Conference (USENIX ATC 16), 43-56.(https://www.usenix.org/conference/atc16/technical-sessions/presentation/yasukata)
  268. Performance e)HTTP)server ng)1KB)messages)(single)core) 0 2 4 6 8 0 20

    40 60 80 100 Throughput [Gb/s] Concurrent TCP Connections Linux StackMap 0 100 200 300 400 500 0 20 40 60 80 100 Latency [µs] Concurrent TCP Connections Linux (99th %ile) Linux (mean) StackMap (99th %ile) StackMap (mean) TCP/IP スタック設計の再考 • パケット I/O フレームワーク上で TCP/IP スタックを動かす • Sandstorm (SIGCOMM 2014) • mTCP (NSDI 2014) • Arrakis (OSDI 2014) • IX (OSDI 2014) • StackMap (USENIX ATC 2016) • Atlas (SIGCOMM 2017) • ZygOS (SOSP 2017) • Shenango (NSDI 2019) • Shinjuku (NSDI 2019) • TAS (EuroSys 2019) • Caladan (OSDI 2020) • Demikernel (SOSP 2021) 337 netmap + カーネル TCP/IP スタック - アプリの API とデータパスは(ほぼ) netmap - ヘッダの処理にカーネル TCP/IP スタックを利⽤ 1コアで 1 KB データを送信 Kenichi Yasukata, Michio Honda, Douglas Santry, and Lars Eggert. 2016. StackMap: Low-Latency Networking with the OS Stack and Dedicated NICs. In 2016 USENIX Annual Technical Conference (USENIX ATC 16), 43-56.(https://www.usenix.org/conference/atc16/technical-sessions/presentation/yasukata)
  269. TCP/IP スタック設計の再考 • パケット I/O フレームワーク上で TCP/IP スタックを動かす • Sandstorm

    (SIGCOMM 2014) • mTCP (NSDI 2014) • Arrakis (OSDI 2014) • IX (OSDI 2014) • StackMap (USENIX ATC 2016) • Atlas (SIGCOMM 2017) • ZygOS (SOSP 2017) • Shenango (NSDI 2019) • Shinjuku (NSDI 2019) • TAS (EuroSys 2019) • Caladan (OSDI 2020) • Demikernel (SOSP 2021) 339 ビデオストリーミング⽤サーバー(Sandstorm 拡張) - ディスクアクセス時にカーネルをバイパスする diskmap 機構を追加 - diskmap を netmap と統合して、ディスクからの 読み取ったデータの配送を効率化 The Atlas Execution Pipeline SQ CQ NVMe Disk NIC RX TX kernel user webserver TCP/IP libnmio libnvme 1 2 4 buffers 5 6 3 7 Ilias Marinos, Robert N.M. Watson, Mark Handley, and Randall R. Stewart. 2017. Disk|Crypt|Net: rethinking the stack for high-performance video streaming. In Proceedings of the Conference of the ACM Special Interest Group on Data Communication (SIGCOMM '17). Association for Computing Machinery, New York, NY, USA, 211‒224. https://doi.org/10.1145/3098822.3098844
  270. TCP/IP スタック設計の再考 • パケット I/O フレームワーク上で TCP/IP スタックを動かす • Sandstorm

    (SIGCOMM 2014) • mTCP (NSDI 2014) • Arrakis (OSDI 2014) • IX (OSDI 2014) • StackMap (USENIX ATC 2016) • Atlas (SIGCOMM 2017) • ZygOS (SOSP 2017) • Shenango (NSDI 2019) • Shinjuku (NSDI 2019) • TAS (EuroSys 2019) • Caladan (OSDI 2020) • Demikernel (SOSP 2021) 340 ビデオストリーミング⽤サーバー(Sandstorm 拡張) - ディスクアクセス時にカーネルをバイパスする diskmap 機構を追加 - diskmap を netmap と統合して、ディスクからの 読み取ったデータの配送を効率化 The Atlas Execution Pipeline SQ CQ NVMe Disk NIC RX TX kernel user webserver TCP/IP libnmio libnvme 1 2 4 buffers 5 6 3 7 netmap Ilias Marinos, Robert N.M. Watson, Mark Handley, and Randall R. Stewart. 2017. Disk|Crypt|Net: rethinking the stack for high-performance video streaming. In Proceedings of the Conference of the ACM Special Interest Group on Data Communication (SIGCOMM '17). Association for Computing Machinery, New York, NY, USA, 211‒224. https://doi.org/10.1145/3098822.3098844
  271. TCP/IP スタック設計の再考 • パケット I/O フレームワーク上で TCP/IP スタックを動かす • Sandstorm

    (SIGCOMM 2014) • mTCP (NSDI 2014) • Arrakis (OSDI 2014) • IX (OSDI 2014) • StackMap (USENIX ATC 2016) • Atlas (SIGCOMM 2017) • ZygOS (SOSP 2017) • Shenango (NSDI 2019) • Shinjuku (NSDI 2019) • TAS (EuroSys 2019) • Caladan (OSDI 2020) • Demikernel (SOSP 2021) 341 ビデオストリーミング⽤サーバー(Sandstorm 拡張) - ディスクアクセス時にカーネルをバイパスする diskmap 機構を追加 - diskmap を netmap と統合して、ディスクからの 読み取ったデータの配送を効率化 The Atlas Execution Pipeline SQ CQ NVMe Disk NIC RX TX kernel user webserver TCP/IP libnmio libnvme 1 2 4 buffers 5 6 3 7 netmap diskmap Ilias Marinos, Robert N.M. Watson, Mark Handley, and Randall R. Stewart. 2017. Disk|Crypt|Net: rethinking the stack for high-performance video streaming. In Proceedings of the Conference of the ACM Special Interest Group on Data Communication (SIGCOMM '17). Association for Computing Machinery, New York, NY, USA, 211‒224. https://doi.org/10.1145/3098822.3098844
  272. TCP/IP スタック設計の再考 • パケット I/O フレームワーク上で TCP/IP スタックを動かす • Sandstorm

    (SIGCOMM 2014) • mTCP (NSDI 2014) • Arrakis (OSDI 2014) • IX (OSDI 2014) • StackMap (USENIX ATC 2016) • Atlas (SIGCOMM 2017) • ZygOS (SOSP 2017) • Shenango (NSDI 2019) • Shinjuku (NSDI 2019) • TAS (EuroSys 2019) • Caladan (OSDI 2020) • Demikernel (SOSP 2021) 342 ビデオストリーミング⽤サーバー(Sandstorm 拡張) - ディスクアクセス時にカーネルをバイパスする diskmap 機構を追加 - diskmap を netmap と統合して、ディスクからの 読み取ったデータの配送を効率化 The Atlas Execution Pipeline SQ CQ NVMe Disk NIC RX TX kernel user webserver TCP/IP libnmio libnvme 1 2 4 buffers 5 6 3 7 netmap diskmap NIC I/O と Disk I/O に 同じバッファが使える Ilias Marinos, Robert N.M. Watson, Mark Handley, and Randall R. Stewart. 2017. Disk|Crypt|Net: rethinking the stack for high-performance video streaming. In Proceedings of the Conference of the ACM Special Interest Group on Data Communication (SIGCOMM '17). Association for Computing Machinery, New York, NY, USA, 211‒224. https://doi.org/10.1145/3098822.3098844
  273. TCP/IP スタック設計の再考 • パケット I/O フレームワーク上で TCP/IP スタックを動かす • Sandstorm

    (SIGCOMM 2014) • mTCP (NSDI 2014) • Arrakis (OSDI 2014) • IX (OSDI 2014) • StackMap (USENIX ATC 2016) • Atlas (SIGCOMM 2017) • ZygOS (SOSP 2017) • Shenango (NSDI 2019) • Shinjuku (NSDI 2019) • TAS (EuroSys 2019) • Caladan (OSDI 2020) • Demikernel (SOSP 2021) 343 ビデオストリーミング⽤サーバー(Sandstorm 拡張) - ディスクアクセス時にカーネルをバイパスする diskmap 機構を追加 - diskmap を netmap と統合して、ディスクからの 読み取ったデータの配送を効率化 The Atlas Execution Pipeline SQ CQ NVMe Disk NIC RX TX kernel user webserver TCP/IP libnmio libnvme 1 2 4 buffers 5 6 3 7 netmap diskmap NIC I/O と Disk I/O に 同じバッファが使える Disk から NIC への データの移動に コピーが不要 Ilias Marinos, Robert N.M. Watson, Mark Handley, and Randall R. Stewart. 2017. Disk|Crypt|Net: rethinking the stack for high-performance video streaming. In Proceedings of the Conference of the ACM Special Interest Group on Data Communication (SIGCOMM '17). Association for Computing Machinery, New York, NY, USA, 211‒224. https://doi.org/10.1145/3098822.3098844
  274. TCP/IP スタック設計の再考 • パケット I/O フレームワーク上で TCP/IP スタックを動かす • Sandstorm

    (SIGCOMM 2014) • mTCP (NSDI 2014) • Arrakis (OSDI 2014) • IX (OSDI 2014) • StackMap (USENIX ATC 2016) • Atlas (SIGCOMM 2017) • ZygOS (SOSP 2017) • Shenango (NSDI 2019) • Shinjuku (NSDI 2019) • TAS (EuroSys 2019) • Caladan (OSDI 2020) • Demikernel (SOSP 2021) 344 ビデオストリーミング⽤サーバー(Sandstorm 拡張) - ディスクアクセス時にカーネルをバイパスする diskmap 機構を追加 - diskmap を netmap と統合して、ディスクからの 読み取ったデータの配送を効率化 Disk|Crypt|Net: rethinking the stack for high-performance video streamin 2000 4000 6000 8000 10000 12000 14000 16000 0 20 40 60 80 # Concurrent HTTP persistent connections Net Throughput (Gb/s) Netflix 0% BC Netflix 100% BC Atlas (a) Network throughput (Error bars indicate the 95% CI) コンテンツ配送速度(2つの 40Gbps NIC 合計) Ilias Marinos, Robert N.M. Watson, Mark Handley, and Randall R. Stewart. 2017. Disk|Crypt|Net: rethinking the stack for high-performance video streaming. In Proceedings of the Conference of the ACM Special Interest Group on Data Communication (SIGCOMM '17). Association for Computing Machinery, New York, NY, USA, 211‒224. https://doi.org/10.1145/3098822.3098844
  275. TCP/IP スタック設計の再考 • パケット I/O フレームワーク上で TCP/IP スタックを動かす • Sandstorm

    (SIGCOMM 2014) • mTCP (NSDI 2014) • Arrakis (OSDI 2014) • IX (OSDI 2014) • StackMap (USENIX ATC 2016) • Atlas (SIGCOMM 2017) • ZygOS (SOSP 2017) • Shenango (NSDI 2019) • Shinjuku (NSDI 2019) • TAS (EuroSys 2019) • Caladan (OSDI 2020) • Demikernel (SOSP 2021) 345 ビデオストリーミング⽤サーバー(Sandstorm 拡張) - ディスクアクセス時にカーネルをバイパスする diskmap 機構を追加 - diskmap を netmap と統合して、ディスクからの 読み取ったデータの配送を効率化 Disk|Crypt|Net: rethinking the stack for high-performance video streamin 2000 4000 6000 8000 10000 12000 14000 16000 0 20 40 60 80 # Concurrent HTTP persistent connections Net Throughput (Gb/s) Netflix 0% BC Netflix 100% BC Atlas (a) Network throughput (Error bars indicate the 95% CI) コンテンツ配送速度(2つの 40Gbps NIC 合計) Netflix の最適化を含む FreeBSD との⽐較 BC: 配送コンテンツのバッファキャッシュヒット率 Ilias Marinos, Robert N.M. Watson, Mark Handley, and Randall R. Stewart. 2017. Disk|Crypt|Net: rethinking the stack for high-performance video streaming. In Proceedings of the Conference of the ACM Special Interest Group on Data Communication (SIGCOMM '17). Association for Computing Machinery, New York, NY, USA, 211‒224. https://doi.org/10.1145/3098822.3098844
  276. TCP/IP スタック設計の再考 • パケット I/O フレームワーク上で TCP/IP スタックを動かす • Sandstorm

    (SIGCOMM 2014) • mTCP (NSDI 2014) • Arrakis (OSDI 2014) • IX (OSDI 2014) • StackMap (USENIX ATC 2016) • Atlas (SIGCOMM 2017) • ZygOS (SOSP 2017) • Shenango (NSDI 2019) • Shinjuku (NSDI 2019) • TAS (EuroSys 2019) • Caladan (OSDI 2020) • Demikernel (SOSP 2021) 346 ビデオストリーミング⽤サーバー(Sandstorm 拡張) - ディスクアクセス時にカーネルをバイパスする diskmap 機構を追加 - diskmap を netmap と統合して、ディスクからの 読み取ったデータの配送を効率化 Disk|Crypt|Net: rethinking the stack for high-performance video streamin 2000 4000 6000 8000 10000 12000 14000 16000 0 20 40 60 80 # Concurrent HTTP persistent connections Net Throughput (Gb/s) Netflix 0% BC Netflix 100% BC Atlas (a) Network throughput (Error bars indicate the 95% CI) コンテンツ配送速度(2つの 40Gbps NIC 合計) Netflix の最適化を含む FreeBSD との⽐較 BC: 配送コンテンツのバッファキャッシュヒット率 実験時の CPU 使⽤率 少ない CPU 使⽤率で⾼い性能を達成 eo streaming SIGCOMM ’17, August 21-25, 2017, Los Angeles, CA, USA 16000 ns % BC % BC 2000 4000 6000 8000 10000 12000 14000 16000 0 200 400 600 800 # Concurrent HTTP persistent connections CPU utilization (%) Netflix 0% BC Netflix 100% BC Atlas (b) CPU utilization (Average) 100 150 ughput (Gb/s) ⾼い性能を低い CPU 使⽤率で達成できる Ilias Marinos, Robert N.M. Watson, Mark Handley, and Randall R. Stewart. 2017. Disk|Crypt|Net: rethinking the stack for high-performance video streaming. In Proceedings of the Conference of the ACM Special Interest Group on Data Communication (SIGCOMM '17). Association for Computing Machinery, New York, NY, USA, 211‒224. https://doi.org/10.1145/3098822.3098844
  277. TCP/IP スタック設計の再考 • パケット I/O フレームワーク上で TCP/IP スタックを動かす • Sandstorm

    (SIGCOMM 2014) • mTCP (NSDI 2014) • Arrakis (OSDI 2014) • IX (OSDI 2014) • StackMap (USENIX ATC 2016) • Atlas (SIGCOMM 2017) • ZygOS (SOSP 2017) • Shenango (NSDI 2019) • Shinjuku (NSDI 2019) • TAS (EuroSys 2019) • Caladan (OSDI 2020) • Demikernel (SOSP 2021) 348 拡張
  278. TCP/IP スタック設計の再考 • パケット I/O フレームワーク上で TCP/IP スタックを動かす • Sandstorm

    (SIGCOMM 2014) • mTCP (NSDI 2014) • Arrakis (OSDI 2014) • IX (OSDI 2014) • StackMap (USENIX ATC 2016) • Atlas (SIGCOMM 2017) • ZygOS (SOSP 2017) • Shenango (NSDI 2019) • Shinjuku (NSDI 2019) • TAS (EuroSys 2019) • Caladan (OSDI 2020) • Demikernel (SOSP 2021) 349 拡張 既存のシステムは アプリへ届くリクエストにかかる 処理時間のばらつきへの考慮が不⼗分 Head-of-Line Blocking 問題を引き起こす 着眼点
  279. TCP/IP スタック設計の再考 • パケット I/O フレームワーク上で TCP/IP スタックを動かす • Sandstorm

    (SIGCOMM 2014) • mTCP (NSDI 2014) • Arrakis (OSDI 2014) • IX (OSDI 2014) • StackMap (USENIX ATC 2016) • Atlas (SIGCOMM 2017) • ZygOS (SOSP 2017) • Shenango (NSDI 2019) • Shinjuku (NSDI 2019) • TAS (EuroSys 2019) • Caladan (OSDI 2020) • Demikernel (SOSP 2021) 350 アプリスレッド on CPU Core0 アプリスレッド on CPU Core1 拡張
  280. TCP/IP スタック設計の再考 • パケット I/O フレームワーク上で TCP/IP スタックを動かす • Sandstorm

    (SIGCOMM 2014) • mTCP (NSDI 2014) • Arrakis (OSDI 2014) • IX (OSDI 2014) • StackMap (USENIX ATC 2016) • Atlas (SIGCOMM 2017) • ZygOS (SOSP 2017) • Shenango (NSDI 2019) • Shinjuku (NSDI 2019) • TAS (EuroSys 2019) • Caladan (OSDI 2020) • Demikernel (SOSP 2021) 351 アプリの リクエストキュー CPU Core0 ⽤ CPU Core1 ⽤ アプリスレッド on CPU Core0 アプリスレッド on CPU Core1 拡張
  281. TCP/IP スタック設計の再考 • パケット I/O フレームワーク上で TCP/IP スタックを動かす • Sandstorm

    (SIGCOMM 2014) • mTCP (NSDI 2014) • Arrakis (OSDI 2014) • IX (OSDI 2014) • StackMap (USENIX ATC 2016) • Atlas (SIGCOMM 2017) • ZygOS (SOSP 2017) • Shenango (NSDI 2019) • Shinjuku (NSDI 2019) • TAS (EuroSys 2019) • Caladan (OSDI 2020) • Demikernel (SOSP 2021) 352 アプリの リクエストキュー CPU Core0 ⽤ CPU Core1 ⽤ アプリスレッド on CPU Core0 アプリスレッド on CPU Core1 RSSによる 振り分け TCP/IP処理 TCP/IP処理 拡張
  282. TCP/IP スタック設計の再考 • パケット I/O フレームワーク上で TCP/IP スタックを動かす • Sandstorm

    (SIGCOMM 2014) • mTCP (NSDI 2014) • Arrakis (OSDI 2014) • IX (OSDI 2014) • StackMap (USENIX ATC 2016) • Atlas (SIGCOMM 2017) • ZygOS (SOSP 2017) • Shenango (NSDI 2019) • Shinjuku (NSDI 2019) • TAS (EuroSys 2019) • Caladan (OSDI 2020) • Demikernel (SOSP 2021) 353 RSSによる 振り分け アプリの リクエストキュー CPU Core0 ⽤ CPU Core1 ⽤ TCP/IP処理 TCP/IP処理 アプリスレッド on CPU Core0 アプリスレッド on CPU Core1 拡張
  283. TCP/IP スタック設計の再考 • パケット I/O フレームワーク上で TCP/IP スタックを動かす • Sandstorm

    (SIGCOMM 2014) • mTCP (NSDI 2014) • Arrakis (OSDI 2014) • IX (OSDI 2014) • StackMap (USENIX ATC 2016) • Atlas (SIGCOMM 2017) • ZygOS (SOSP 2017) • Shenango (NSDI 2019) • Shinjuku (NSDI 2019) • TAS (EuroSys 2019) • Caladan (OSDI 2020) • Demikernel (SOSP 2021) 354 RSSによる 振り分け アプリの リクエストキュー CPU Core0 ⽤ CPU Core1 ⽤ TCP/IP処理 TCP/IP処理 アプリスレッド on CPU Core0 アプリスレッド on CPU Core1 処理完了まで 時間がかかる リクエスト 拡張
  284. TCP/IP スタック設計の再考 • パケット I/O フレームワーク上で TCP/IP スタックを動かす • Sandstorm

    (SIGCOMM 2014) • mTCP (NSDI 2014) • Arrakis (OSDI 2014) • IX (OSDI 2014) • StackMap (USENIX ATC 2016) • Atlas (SIGCOMM 2017) • ZygOS (SOSP 2017) • Shenango (NSDI 2019) • Shinjuku (NSDI 2019) • TAS (EuroSys 2019) • Caladan (OSDI 2020) • Demikernel (SOSP 2021) 355 RSSによる 振り分け アプリの リクエストキュー CPU Core0 ⽤ CPU Core1 ⽤ TCP/IP処理 TCP/IP処理 アプリスレッド on CPU Core0 アプリスレッド on CPU Core1 処理完了まで 時間がかかる リクエスト 短時間で処理が 完了できる リクエスト 拡張
  285. TCP/IP スタック設計の再考 • パケット I/O フレームワーク上で TCP/IP スタックを動かす • Sandstorm

    (SIGCOMM 2014) • mTCP (NSDI 2014) • Arrakis (OSDI 2014) • IX (OSDI 2014) • StackMap (USENIX ATC 2016) • Atlas (SIGCOMM 2017) • ZygOS (SOSP 2017) • Shenango (NSDI 2019) • Shinjuku (NSDI 2019) • TAS (EuroSys 2019) • Caladan (OSDI 2020) • Demikernel (SOSP 2021) 356 RSSによる 振り分け アプリの リクエストキュー CPU Core0 ⽤ CPU Core1 ⽤ TCP/IP処理 TCP/IP処理 アプリスレッド on CPU Core0 アプリスレッド on CPU Core1 処理完了まで 時間がかかる リクエスト 短時間で処理が 完了できる リクエスト 順番に処理していくと 拡張
  286. TCP/IP スタック設計の再考 • パケット I/O フレームワーク上で TCP/IP スタックを動かす • Sandstorm

    (SIGCOMM 2014) • mTCP (NSDI 2014) • Arrakis (OSDI 2014) • IX (OSDI 2014) • StackMap (USENIX ATC 2016) • Atlas (SIGCOMM 2017) • ZygOS (SOSP 2017) • Shenango (NSDI 2019) • Shinjuku (NSDI 2019) • TAS (EuroSys 2019) • Caladan (OSDI 2020) • Demikernel (SOSP 2021) 357 RSSによる 振り分け アプリの リクエストキュー CPU Core0 ⽤ CPU Core1 ⽤ TCP/IP処理 TCP/IP処理 アプリスレッド on CPU Core0 アプリスレッド on CPU Core1 処理完了まで 時間がかかる リクエスト 短時間で処理が 完了できる リクエスト 順番に処理していくと リクエストの 処理完了 拡張
  287. TCP/IP スタック設計の再考 • パケット I/O フレームワーク上で TCP/IP スタックを動かす • Sandstorm

    (SIGCOMM 2014) • mTCP (NSDI 2014) • Arrakis (OSDI 2014) • IX (OSDI 2014) • StackMap (USENIX ATC 2016) • Atlas (SIGCOMM 2017) • ZygOS (SOSP 2017) • Shenango (NSDI 2019) • Shinjuku (NSDI 2019) • TAS (EuroSys 2019) • Caladan (OSDI 2020) • Demikernel (SOSP 2021) 358 RSSによる 振り分け アプリの リクエストキュー CPU Core0 ⽤ CPU Core1 ⽤ TCP/IP処理 TCP/IP処理 アプリスレッド on CPU Core0 アプリスレッド on CPU Core1 処理完了まで 時間がかかる リクエスト 短時間で処理が 完了できる リクエスト 順番に処理していくと 次のリクエスト の処理を開始 リクエストの 処理完了 拡張
  288. TCP/IP スタック設計の再考 • パケット I/O フレームワーク上で TCP/IP スタックを動かす • Sandstorm

    (SIGCOMM 2014) • mTCP (NSDI 2014) • Arrakis (OSDI 2014) • IX (OSDI 2014) • StackMap (USENIX ATC 2016) • Atlas (SIGCOMM 2017) • ZygOS (SOSP 2017) • Shenango (NSDI 2019) • Shinjuku (NSDI 2019) • TAS (EuroSys 2019) • Caladan (OSDI 2020) • Demikernel (SOSP 2021) 359 RSSによる 振り分け アプリの リクエストキュー CPU Core0 ⽤ CPU Core1 ⽤ TCP/IP処理 TCP/IP処理 アプリスレッド on CPU Core0 アプリスレッド on CPU Core1 処理完了まで 時間がかかる リクエスト 短時間で処理が 完了できる リクエスト 順番に処理していくと 拡張
  289. TCP/IP スタック設計の再考 • パケット I/O フレームワーク上で TCP/IP スタックを動かす • Sandstorm

    (SIGCOMM 2014) • mTCP (NSDI 2014) • Arrakis (OSDI 2014) • IX (OSDI 2014) • StackMap (USENIX ATC 2016) • Atlas (SIGCOMM 2017) • ZygOS (SOSP 2017) • Shenango (NSDI 2019) • Shinjuku (NSDI 2019) • TAS (EuroSys 2019) • Caladan (OSDI 2020) • Demikernel (SOSP 2021) 360 RSSによる 振り分け アプリの リクエストキュー CPU Core0 ⽤ CPU Core1 ⽤ TCP/IP処理 TCP/IP処理 アプリスレッド on CPU Core0 アプリスレッド on CPU Core1 処理完了まで 時間がかかる リクエスト 短時間で処理が 完了できる リクエスト 順番に処理していくと 拡張
  290. TCP/IP スタック設計の再考 • パケット I/O フレームワーク上で TCP/IP スタックを動かす • Sandstorm

    (SIGCOMM 2014) • mTCP (NSDI 2014) • Arrakis (OSDI 2014) • IX (OSDI 2014) • StackMap (USENIX ATC 2016) • Atlas (SIGCOMM 2017) • ZygOS (SOSP 2017) • Shenango (NSDI 2019) • Shinjuku (NSDI 2019) • TAS (EuroSys 2019) • Caladan (OSDI 2020) • Demikernel (SOSP 2021) 361 RSSによる 振り分け アプリの リクエストキュー CPU Core0 ⽤ CPU Core1 ⽤ TCP/IP処理 TCP/IP処理 アプリスレッド on CPU Core0 アプリスレッド on CPU Core1 処理完了まで 時間がかかる リクエスト 短時間で処理が 完了できる リクエスト 順番に処理していくと 拡張
  291. TCP/IP スタック設計の再考 • パケット I/O フレームワーク上で TCP/IP スタックを動かす • Sandstorm

    (SIGCOMM 2014) • mTCP (NSDI 2014) • Arrakis (OSDI 2014) • IX (OSDI 2014) • StackMap (USENIX ATC 2016) • Atlas (SIGCOMM 2017) • ZygOS (SOSP 2017) • Shenango (NSDI 2019) • Shinjuku (NSDI 2019) • TAS (EuroSys 2019) • Caladan (OSDI 2020) • Demikernel (SOSP 2021) 362 RSSによる 振り分け アプリの リクエストキュー CPU Core0 ⽤ CPU Core1 ⽤ TCP/IP処理 TCP/IP処理 アプリスレッド on CPU Core0 アプリスレッド on CPU Core1 処理完了まで 時間がかかる リクエスト 短時間で処理が 完了できる リクエスト 順番に処理していくと 拡張
  292. TCP/IP スタック設計の再考 • パケット I/O フレームワーク上で TCP/IP スタックを動かす • Sandstorm

    (SIGCOMM 2014) • mTCP (NSDI 2014) • Arrakis (OSDI 2014) • IX (OSDI 2014) • StackMap (USENIX ATC 2016) • Atlas (SIGCOMM 2017) • ZygOS (SOSP 2017) • Shenango (NSDI 2019) • Shinjuku (NSDI 2019) • TAS (EuroSys 2019) • Caladan (OSDI 2020) • Demikernel (SOSP 2021) 363 RSSによる 振り分け アプリの リクエストキュー CPU Core0 ⽤ CPU Core1 ⽤ TCP/IP処理 TCP/IP処理 アプリスレッド on CPU Core0 アプリスレッド on CPU Core1 処理完了まで 時間がかかる リクエスト 短時間で処理が 完了できる リクエスト 順番に処理していくと 拡張
  293. TCP/IP スタック設計の再考 • パケット I/O フレームワーク上で TCP/IP スタックを動かす • Sandstorm

    (SIGCOMM 2014) • mTCP (NSDI 2014) • Arrakis (OSDI 2014) • IX (OSDI 2014) • StackMap (USENIX ATC 2016) • Atlas (SIGCOMM 2017) • ZygOS (SOSP 2017) • Shenango (NSDI 2019) • Shinjuku (NSDI 2019) • TAS (EuroSys 2019) • Caladan (OSDI 2020) • Demikernel (SOSP 2021) 364 RSSによる 振り分け アプリの リクエストキュー CPU Core0 ⽤ CPU Core1 ⽤ TCP/IP処理 TCP/IP処理 アプリスレッド on CPU Core0 アプリスレッド on CPU Core1 処理完了まで 時間がかかる リクエスト 短時間で処理が 完了できる リクエスト 順番に処理していくと 拡張
  294. TCP/IP スタック設計の再考 • パケット I/O フレームワーク上で TCP/IP スタックを動かす • Sandstorm

    (SIGCOMM 2014) • mTCP (NSDI 2014) • Arrakis (OSDI 2014) • IX (OSDI 2014) • StackMap (USENIX ATC 2016) • Atlas (SIGCOMM 2017) • ZygOS (SOSP 2017) • Shenango (NSDI 2019) • Shinjuku (NSDI 2019) • TAS (EuroSys 2019) • Caladan (OSDI 2020) • Demikernel (SOSP 2021) 365 RSSによる 振り分け アプリの リクエストキュー CPU Core0 ⽤ CPU Core1 ⽤ TCP/IP処理 TCP/IP処理 アプリスレッド on CPU Core0 アプリスレッド on CPU Core1 順番に処理していくと 処理完了まで時間がかかるリクエストに 処理の開始がブロックされている クライアントの体感する 遅延の増加に繋がる 拡張
  295. TCP/IP スタック設計の再考 • パケット I/O フレームワーク上で TCP/IP スタックを動かす • Sandstorm

    (SIGCOMM 2014) • mTCP (NSDI 2014) • Arrakis (OSDI 2014) • IX (OSDI 2014) • StackMap (USENIX ATC 2016) • Atlas (SIGCOMM 2017) • ZygOS (SOSP 2017) • Shenango (NSDI 2019) • Shinjuku (NSDI 2019) • TAS (EuroSys 2019) • Caladan (OSDI 2020) • Demikernel (SOSP 2021) 366 RSSによる 振り分け アプリの リクエストキュー CPU Core0 ⽤ CPU Core1 ⽤ TCP/IP処理 TCP/IP処理 アプリスレッド on CPU Core0 アプリスレッド on CPU Core1 順番に処理していくと 処理完了まで時間がかかるリクエストに 処理の開始がブロックされている クライアントの体感する 遅延の増加に繋がる CPU Core1 は idle 状態 拡張
  296. TCP/IP スタック設計の再考 • パケット I/O フレームワーク上で TCP/IP スタックを動かす • Sandstorm

    (SIGCOMM 2014) • mTCP (NSDI 2014) • Arrakis (OSDI 2014) • IX (OSDI 2014) • StackMap (USENIX ATC 2016) • Atlas (SIGCOMM 2017) • ZygOS (SOSP 2017) • Shenango (NSDI 2019) • Shinjuku (NSDI 2019) • TAS (EuroSys 2019) • Caladan (OSDI 2020) • Demikernel (SOSP 2021) 367 RSSによる 振り分け アプリの リクエストキュー CPU Core0 ⽤ CPU Core1 ⽤ TCP/IP処理 TCP/IP処理 アプリスレッド on CPU Core0 アプリスレッド on CPU Core1 提案⼿法: Shuffle 層を追加 拡張
  297. TCP/IP スタック設計の再考 • パケット I/O フレームワーク上で TCP/IP スタックを動かす • Sandstorm

    (SIGCOMM 2014) • mTCP (NSDI 2014) • Arrakis (OSDI 2014) • IX (OSDI 2014) • StackMap (USENIX ATC 2016) • Atlas (SIGCOMM 2017) • ZygOS (SOSP 2017) • Shenango (NSDI 2019) • Shinjuku (NSDI 2019) • TAS (EuroSys 2019) • Caladan (OSDI 2020) • Demikernel (SOSP 2021) 368 RSSによる 振り分け アプリの リクエストキュー CPU Core0 ⽤ CPU Core1 ⽤ TCP/IP処理 TCP/IP処理 アプリスレッド on CPU Core0 アプリスレッド on CPU Core1 提案⼿法: Shuffle 層を追加 shuffle 拡張
  298. TCP/IP スタック設計の再考 • パケット I/O フレームワーク上で TCP/IP スタックを動かす • Sandstorm

    (SIGCOMM 2014) • mTCP (NSDI 2014) • Arrakis (OSDI 2014) • IX (OSDI 2014) • StackMap (USENIX ATC 2016) • Atlas (SIGCOMM 2017) • ZygOS (SOSP 2017) • Shenango (NSDI 2019) • Shinjuku (NSDI 2019) • TAS (EuroSys 2019) • Caladan (OSDI 2020) • Demikernel (SOSP 2021) 369 RSSによる 振り分け アプリの リクエストキュー CPU Core0 ⽤ CPU Core1 ⽤ TCP/IP処理 TCP/IP処理 アプリスレッド on CPU Core0 アプリスレッド on CPU Core1 提案⼿法: Shuffle 層を追加 shuffle 拡張
  299. TCP/IP スタック設計の再考 • パケット I/O フレームワーク上で TCP/IP スタックを動かす • Sandstorm

    (SIGCOMM 2014) • mTCP (NSDI 2014) • Arrakis (OSDI 2014) • IX (OSDI 2014) • StackMap (USENIX ATC 2016) • Atlas (SIGCOMM 2017) • ZygOS (SOSP 2017) • Shenango (NSDI 2019) • Shinjuku (NSDI 2019) • TAS (EuroSys 2019) • Caladan (OSDI 2020) • Demikernel (SOSP 2021) 370 RSSによる 振り分け アプリの リクエストキュー CPU Core0 ⽤ CPU Core1 ⽤ TCP/IP処理 TCP/IP処理 アプリスレッド on CPU Core0 アプリスレッド on CPU Core1 提案⼿法: Shuffle 層を追加 shuffle 拡張
  300. TCP/IP スタック設計の再考 • パケット I/O フレームワーク上で TCP/IP スタックを動かす • Sandstorm

    (SIGCOMM 2014) • mTCP (NSDI 2014) • Arrakis (OSDI 2014) • IX (OSDI 2014) • StackMap (USENIX ATC 2016) • Atlas (SIGCOMM 2017) • ZygOS (SOSP 2017) • Shenango (NSDI 2019) • Shinjuku (NSDI 2019) • TAS (EuroSys 2019) • Caladan (OSDI 2020) • Demikernel (SOSP 2021) 371 RSSによる 振り分け アプリの リクエストキュー CPU Core0 ⽤ CPU Core1 ⽤ TCP/IP処理 TCP/IP処理 アプリスレッド on CPU Core0 アプリスレッド on CPU Core1 提案⼿法: Shuffle 層を追加 shuffle Core1が idle に 拡張
  301. TCP/IP スタック設計の再考 • パケット I/O フレームワーク上で TCP/IP スタックを動かす • Sandstorm

    (SIGCOMM 2014) • mTCP (NSDI 2014) • Arrakis (OSDI 2014) • IX (OSDI 2014) • StackMap (USENIX ATC 2016) • Atlas (SIGCOMM 2017) • ZygOS (SOSP 2017) • Shenango (NSDI 2019) • Shinjuku (NSDI 2019) • TAS (EuroSys 2019) • Caladan (OSDI 2020) • Demikernel (SOSP 2021) 372 RSSによる 振り分け アプリの リクエストキュー CPU Core0 ⽤ CPU Core1 ⽤ TCP/IP処理 TCP/IP処理 アプリスレッド on CPU Core0 アプリスレッド on CPU Core1 提案⼿法: Shuffle 層を追加 shuffle Core1が idle に Shuffle 層を通じた work-stealing 拡張
  302. TCP/IP スタック設計の再考 • パケット I/O フレームワーク上で TCP/IP スタックを動かす • Sandstorm

    (SIGCOMM 2014) • mTCP (NSDI 2014) • Arrakis (OSDI 2014) • IX (OSDI 2014) • StackMap (USENIX ATC 2016) • Atlas (SIGCOMM 2017) • ZygOS (SOSP 2017) • Shenango (NSDI 2019) • Shinjuku (NSDI 2019) • TAS (EuroSys 2019) • Caladan (OSDI 2020) • Demikernel (SOSP 2021) 373 SLO Linux (partitioned connections) IX Bimodal 0.0 0.5 1.0 1 Throughput (MRPS) 0 25 50 75 100 125 150 SLO Linux (partitioned connections) IX Linux (floating connections) ZygOS 0.0 0.5 1.0 1.5 Throughput (MRPS) 0 25 50 75 100 125 150 リクエストの分布 9割:短時間で完了するリクエスト 1割:時間を要するリクエスト Latency (us) 拡張 George Prekas, Marios Kogias, and Edouard Bugnion. 2017. ZygOS: Achieving Low Tail Latency for Microsecond-Scale Networked Tasks. In Proceedings of the 26th Symposium on Operating Systems Principles (SOSP ʼ17), 325-341.(https://doi.org/10.1145/3132747.3132780)
  303. TCP/IP スタック設計の再考 • パケット I/O フレームワーク上で TCP/IP スタックを動かす • Sandstorm

    (SIGCOMM 2014) • mTCP (NSDI 2014) • Arrakis (OSDI 2014) • IX (OSDI 2014) • StackMap (USENIX ATC 2016) • Atlas (SIGCOMM 2017) • ZygOS (SOSP 2017) • Shenango (NSDI 2019) • Shinjuku (NSDI 2019) • TAS (EuroSys 2019) • Caladan (OSDI 2020) • Demikernel (SOSP 2021) 374 SLO Linux (partitioned connections) IX Bimodal 0.0 0.5 1.0 1 Throughput (MRPS) 0 25 50 75 100 125 150 SLO Linux (partitioned connections) IX Linux (floating connections) ZygOS 0.0 0.5 1.0 1.5 Throughput (MRPS) 0 25 50 75 100 125 150 リクエストの分布 9割:短時間で完了するリクエスト 1割:時間を要するリクエスト Latency (us) IX と⽐較して ⾼いスループット 拡張 George Prekas, Marios Kogias, and Edouard Bugnion. 2017. ZygOS: Achieving Low Tail Latency for Microsecond-Scale Networked Tasks. In Proceedings of the 26th Symposium on Operating Systems Principles (SOSP ʼ17), 325-341.(https://doi.org/10.1145/3132747.3132780)
  304. TCP/IP スタック設計の再考 • パケット I/O フレームワーク上で TCP/IP スタックを動かす • Sandstorm

    (SIGCOMM 2014) • mTCP (NSDI 2014) • Arrakis (OSDI 2014) • IX (OSDI 2014) • StackMap (USENIX ATC 2016) • Atlas (SIGCOMM 2017) • ZygOS (SOSP 2017) • Shenango (NSDI 2019) • Shinjuku (NSDI 2019) • TAS (EuroSys 2019) • Caladan (OSDI 2020) • Demikernel (SOSP 2021) 375 SLO Linux (partitioned connections) IX Bimodal 0.0 0.5 1.0 1 Throughput (MRPS) 0 25 50 75 100 125 150 SLO Linux (partitioned connections) IX Linux (floating connections) ZygOS 0.0 0.5 1.0 1.5 Throughput (MRPS) 0 25 50 75 100 125 150 リクエストの分布 9割:短時間で完了するリクエスト 1割:時間を要するリクエスト Latency (us) IX と⽐較して ⾼いスループット 低い遅延を達成 拡張 George Prekas, Marios Kogias, and Edouard Bugnion. 2017. ZygOS: Achieving Low Tail Latency for Microsecond-Scale Networked Tasks. In Proceedings of the 26th Symposium on Operating Systems Principles (SOSP ʼ17), 325-341.(https://doi.org/10.1145/3132747.3132780)
  305. TCP/IP スタック設計の再考 • パケット I/O フレームワーク上で TCP/IP スタックを動かす • Sandstorm

    (SIGCOMM 2014) • mTCP (NSDI 2014) • Arrakis (OSDI 2014) • IX (OSDI 2014) • StackMap (USENIX ATC 2016) • Atlas (SIGCOMM 2017) • ZygOS (SOSP 2017) • Shenango (NSDI 2019) • Shinjuku (NSDI 2019) • TAS (EuroSys 2019) • Caladan (OSDI 2020) • Demikernel (SOSP 2021) 376 拡張
  306. TCP/IP スタック設計の再考 • パケット I/O フレームワーク上で TCP/IP スタックを動かす • Sandstorm

    (SIGCOMM 2014) • mTCP (NSDI 2014) • Arrakis (OSDI 2014) • IX (OSDI 2014) • StackMap (USENIX ATC 2016) • Atlas (SIGCOMM 2017) • ZygOS (SOSP 2017) • Shenango (NSDI 2019) • Shinjuku (NSDI 2019) • TAS (EuroSys 2019) • Caladan (OSDI 2020) • Demikernel (SOSP 2021) 377 RSSによる 振り分け アプリの リクエストキュー CPU Core0 ⽤ CPU Core1 ⽤ TCP/IP処理 TCP/IP処理 アプリスレッド on CPU Core0 アプリスレッド on CPU Core1 提案⼿法: Shuffle 層を追加 shuffle Core1が idle に Shuffle 層を通じた work-stealing 拡張
  307. TCP/IP スタック設計の再考 • パケット I/O フレームワーク上で TCP/IP スタックを動かす • Sandstorm

    (SIGCOMM 2014) • mTCP (NSDI 2014) • Arrakis (OSDI 2014) • IX (OSDI 2014) • StackMap (USENIX ATC 2016) • Atlas (SIGCOMM 2017) • ZygOS (SOSP 2017) • Shenango (NSDI 2019) • Shinjuku (NSDI 2019) • TAS (EuroSys 2019) • Caladan (OSDI 2020) • Demikernel (SOSP 2021) 378 拡張 RSSによる 振り分け アプリの リクエストキュー CPU Core0 ⽤ CPU Core1 ⽤ TCP/IP処理 TCP/IP処理 アプリスレッド on CPU Core0 アプリスレッド on CPU Core1 問題: 全部のコアに時間のかかる リクエストが来ると shuffle Work-stealing できない
  308. TCP/IP スタック設計の再考 • パケット I/O フレームワーク上で TCP/IP スタックを動かす • Sandstorm

    (SIGCOMM 2014) • mTCP (NSDI 2014) • Arrakis (OSDI 2014) • IX (OSDI 2014) • StackMap (USENIX ATC 2016) • Atlas (SIGCOMM 2017) • ZygOS (SOSP 2017) • Shenango (NSDI 2019) • Shinjuku (NSDI 2019) • TAS (EuroSys 2019) • Caladan (OSDI 2020) • Demikernel (SOSP 2021) 379 アプリの リクエスト キュー CPU Core0 ⽤ CPU Core1 ⽤ アプリスレッド on CPU Core0 アプリスレッド on CPU Core1 ディスパッチャ スレッド on CPU Core2 通信処理実⾏ スレッド on CPU Core3 TCP/IP処理 ディスパッチャスレッドが リクエストを振り分ける 拡張 提案⼿法
  309. TCP/IP スタック設計の再考 • パケット I/O フレームワーク上で TCP/IP スタックを動かす • Sandstorm

    (SIGCOMM 2014) • mTCP (NSDI 2014) • Arrakis (OSDI 2014) • IX (OSDI 2014) • StackMap (USENIX ATC 2016) • Atlas (SIGCOMM 2017) • ZygOS (SOSP 2017) • Shenango (NSDI 2019) • Shinjuku (NSDI 2019) • TAS (EuroSys 2019) • Caladan (OSDI 2020) • Demikernel (SOSP 2021) 380 アプリの リクエスト キュー CPU Core0 ⽤ CPU Core1 ⽤ アプリスレッド on CPU Core0 アプリスレッド on CPU Core1 ディスパッチャ スレッド on CPU Core2 通信処理実⾏ スレッド on CPU Core3 TCP/IP処理 ディスパッチャスレッドが リクエストを振り分ける 拡張 提案⼿法
  310. TCP/IP スタック設計の再考 • パケット I/O フレームワーク上で TCP/IP スタックを動かす • Sandstorm

    (SIGCOMM 2014) • mTCP (NSDI 2014) • Arrakis (OSDI 2014) • IX (OSDI 2014) • StackMap (USENIX ATC 2016) • Atlas (SIGCOMM 2017) • ZygOS (SOSP 2017) • Shenango (NSDI 2019) • Shinjuku (NSDI 2019) • TAS (EuroSys 2019) • Caladan (OSDI 2020) • Demikernel (SOSP 2021) 381 アプリの リクエスト キュー CPU Core0 ⽤ CPU Core1 ⽤ アプリスレッド on CPU Core0 アプリスレッド on CPU Core1 ディスパッチャ スレッド on CPU Core2 通信処理実⾏ スレッド on CPU Core3 TCP/IP処理 割り込み ディスパッチャはアプリスレッドが ⻑時間同じリクエストを処理し続けていと 割り込みを送って、そのコアで別の リクエストの処理に切り替えるよう指⽰する 拡張 提案⼿法
  311. TCP/IP スタック設計の再考 • パケット I/O フレームワーク上で TCP/IP スタックを動かす • Sandstorm

    (SIGCOMM 2014) • mTCP (NSDI 2014) • Arrakis (OSDI 2014) • IX (OSDI 2014) • StackMap (USENIX ATC 2016) • Atlas (SIGCOMM 2017) • ZygOS (SOSP 2017) • Shenango (NSDI 2019) • Shinjuku (NSDI 2019) • TAS (EuroSys 2019) • Caladan (OSDI 2020) • Demikernel (SOSP 2021) 382 アプリの リクエスト キュー CPU Core0 ⽤ CPU Core1 ⽤ アプリスレッド on CPU Core0 アプリスレッド on CPU Core1 ディスパッチャ スレッド on CPU Core2 通信処理実⾏ スレッド on CPU Core3 TCP/IP処理 割り込み ディスパッチャはアプリスレッドが ⻑時間同じリクエストを処理し続けていと 割り込みを送って、そのコアで別の リクエストの処理に切り替えるよう指⽰する 拡張 提案⼿法
  312. TCP/IP スタック設計の再考 • パケット I/O フレームワーク上で TCP/IP スタックを動かす • Sandstorm

    (SIGCOMM 2014) • mTCP (NSDI 2014) • Arrakis (OSDI 2014) • IX (OSDI 2014) • StackMap (USENIX ATC 2016) • Atlas (SIGCOMM 2017) • ZygOS (SOSP 2017) • Shenango (NSDI 2019) • Shinjuku (NSDI 2019) • TAS (EuroSys 2019) • Caladan (OSDI 2020) • Demikernel (SOSP 2021) 383 アプリの リクエスト キュー CPU Core0 ⽤ CPU Core1 ⽤ アプリスレッド on CPU Core0 アプリスレッド on CPU Core1 ディスパッチャ スレッド on CPU Core2 通信処理実⾏ スレッド on CPU Core3 TCP/IP処理 割り込み ディスパッチャはアプリスレッドが ⻑時間同じリクエストを処理し続けていと 割り込みを送って、そのコアで別の リクエストの処理に切り替えるよう指⽰する 切り替え判断は 5us おきに⾏われる 拡張 提案⼿法
  313. TCP/IP スタック設計の再考 • パケット I/O フレームワーク上で TCP/IP スタックを動かす • Sandstorm

    (SIGCOMM 2014) • mTCP (NSDI 2014) • Arrakis (OSDI 2014) • IX (OSDI 2014) • StackMap (USENIX ATC 2016) • Atlas (SIGCOMM 2017) • ZygOS (SOSP 2017) • Shenango (NSDI 2019) • Shinjuku (NSDI 2019) • TAS (EuroSys 2019) • Caladan (OSDI 2020) • Demikernel (SOSP 2021) 384 6.6x 88% lower 26 Shinjuku under high variability Better Better IX and ZygOS: Tail latency determined by SCAN requests RocksDB 99.5% GET - 5us 0.5% SCAN - 250us 拡張 Kostis Kaffes, Timothy Chong, Jack Tigar Humphries, Adam Belay, David Mazières, and Christos Kozyrakis. 2019. Shinjuku: Preemptive Scheduling for μsecond-scale Tail Latency. In 16th USENIX Symposium on Networked Systems Design and Implementation (NSDI 19), 345- 360.(https://www.usenix.org/conference/nsdi19/presentation/kaffes)
  314. TCP/IP スタック設計の再考 • パケット I/O フレームワーク上で TCP/IP スタックを動かす • Sandstorm

    (SIGCOMM 2014) • mTCP (NSDI 2014) • Arrakis (OSDI 2014) • IX (OSDI 2014) • StackMap (USENIX ATC 2016) • Atlas (SIGCOMM 2017) • ZygOS (SOSP 2017) • Shenango (NSDI 2019) • Shinjuku (NSDI 2019) • TAS (EuroSys 2019) • Caladan (OSDI 2020) • Demikernel (SOSP 2021) 386 要件 ⾊々なワークロードを⼀つのサーバーで動かしたい - 低遅延が重要なワークロード (Key-Value Store 等) - CPU を消費するワークロード (Hadoop, Spark 等)
  315. TCP/IP スタック設計の再考 • パケット I/O フレームワーク上で TCP/IP スタックを動かす • Sandstorm

    (SIGCOMM 2014) • mTCP (NSDI 2014) • Arrakis (OSDI 2014) • IX (OSDI 2014) • StackMap (USENIX ATC 2016) • Atlas (SIGCOMM 2017) • ZygOS (SOSP 2017) • Shenango (NSDI 2019) • Shinjuku (NSDI 2019) • TAS (EuroSys 2019) • Caladan (OSDI 2020) • Demikernel (SOSP 2021) 387 要件 ⾊々なワークロードを⼀つのサーバーで動かしたい - 低遅延が重要なワークロード (Key-Value Store 等) - CPU を消費するワークロード (Hadoop, Spark 等) Key-Value Store Key-Value Store Key-Value Store Hadoop Spark Spark
  316. TCP/IP スタック設計の再考 • パケット I/O フレームワーク上で TCP/IP スタックを動かす • Sandstorm

    (SIGCOMM 2014) • mTCP (NSDI 2014) • Arrakis (OSDI 2014) • IX (OSDI 2014) • StackMap (USENIX ATC 2016) • Atlas (SIGCOMM 2017) • ZygOS (SOSP 2017) • Shenango (NSDI 2019) • Shinjuku (NSDI 2019) • TAS (EuroSys 2019) • Caladan (OSDI 2020) • Demikernel (SOSP 2021) 388 要件 ⾊々なワークロードを⼀つのサーバーで動かしたい - 低遅延が重要なワークロード (Key-Value Store 等) - CPU を消費するワークロード (Hadoop, Spark 等) Key-Value Store Key-Value Store Key-Value Store Hadoop Spark Spark CPU の専有を想定した DPDK のようなシステムとの 組み合わせが広まる
  317. TCP/IP スタック設計の再考 • パケット I/O フレームワーク上で TCP/IP スタックを動かす • Sandstorm

    (SIGCOMM 2014) • mTCP (NSDI 2014) • Arrakis (OSDI 2014) • IX (OSDI 2014) • StackMap (USENIX ATC 2016) • Atlas (SIGCOMM 2017) • ZygOS (SOSP 2017) • Shenango (NSDI 2019) • Shinjuku (NSDI 2019) • TAS (EuroSys 2019) • Caladan (OSDI 2020) • Demikernel (SOSP 2021) 389 要件 ⾊々なワークロードを⼀つのサーバーで動かしたい - 低遅延が重要なワークロード (Key-Value Store 等) - CPU を消費するワークロード (Hadoop, Spark 等) CPU の専有を想定した DPDK のようなシステムとの 組み合わせが広まる Key-Value Store + DPDK Key-Value Store + DPDK Key-Value Store + DPDK
  318. TCP/IP スタック設計の再考 • パケット I/O フレームワーク上で TCP/IP スタックを動かす • Sandstorm

    (SIGCOMM 2014) • mTCP (NSDI 2014) • Arrakis (OSDI 2014) • IX (OSDI 2014) • StackMap (USENIX ATC 2016) • Atlas (SIGCOMM 2017) • ZygOS (SOSP 2017) • Shenango (NSDI 2019) • Shinjuku (NSDI 2019) • TAS (EuroSys 2019) • Caladan (OSDI 2020) • Demikernel (SOSP 2021) 390 要件 ⾊々なワークロードを⼀つのサーバーで動かしたい - 低遅延が重要なワークロード (Key-Value Store 等) - CPU を消費するワークロード (Hadoop, Spark 等) CPU の専有を想定した DPDK のようなシステムとの 組み合わせが広まる Key-Value Store + DPDK Key-Value Store + DPDK Key-Value Store + DPDK 問題:DPDK 等に CPU を占有させるとHadoop, Spark 等の ワークロードへ割り当てるCPU サイクルがなくなる
  319. TCP/IP スタック設計の再考 • パケット I/O フレームワーク上で TCP/IP スタックを動かす • Sandstorm

    (SIGCOMM 2014) • mTCP (NSDI 2014) • Arrakis (OSDI 2014) • IX (OSDI 2014) • StackMap (USENIX ATC 2016) • Atlas (SIGCOMM 2017) • ZygOS (SOSP 2017) • Shenango (NSDI 2019) • Shinjuku (NSDI 2019) • TAS (EuroSys 2019) • Caladan (OSDI 2020) • Demikernel (SOSP 2021) 391 要件 ⾊々なワークロードを⼀つのサーバーで動かしたい - 低遅延が重要なワークロード (Key-Value Store 等) - CPU を消費するワークロード (Hadoop, Spark 等) CPU の専有を想定した DPDK のようなシステムとの 組み合わせが広まる 問題:DPDK 等に CPU を占有させるとHadoop, Spark 等の ワークロードへ割り当てるCPU サイクルがなくなる ⽬的 低遅延が重要なワークロードに適切な数の CPU コアを 割り当てられるようにしたい Key-Value Store + DPDK Key-Value Store + DPDK Key-Value Store + DPDK
  320. TCP/IP スタック設計の再考 • パケット I/O フレームワーク上で TCP/IP スタックを動かす • Sandstorm

    (SIGCOMM 2014) • mTCP (NSDI 2014) • Arrakis (OSDI 2014) • IX (OSDI 2014) • StackMap (USENIX ATC 2016) • Atlas (SIGCOMM 2017) • ZygOS (SOSP 2017) • Shenango (NSDI 2019) • Shinjuku (NSDI 2019) • TAS (EuroSys 2019) • Caladan (OSDI 2020) • Demikernel (SOSP 2021) 392 要件 ⾊々なワークロードを⼀つのサーバーで動かしたい - 低遅延が重要なワークロード (Key-Value Store 等) - CPU を消費するワークロード (Hadoop, Spark 等) Hadoop Spark Spark CPU の専有を想定した DPDK のようなシステムとの 組み合わせが広まる 問題:DPDK 等に CPU を占有させるとHadoop, Spark 等の ワークロードへ割り当てるCPU サイクルがなくなる Key-Value Store + DPDK ⽬的 低遅延が重要なワークロードに適切な数の CPU コアを 割り当てられるようにしたい Key-Value Store へのリクエストが少ない時
  321. TCP/IP スタック設計の再考 • パケット I/O フレームワーク上で TCP/IP スタックを動かす • Sandstorm

    (SIGCOMM 2014) • mTCP (NSDI 2014) • Arrakis (OSDI 2014) • IX (OSDI 2014) • StackMap (USENIX ATC 2016) • Atlas (SIGCOMM 2017) • ZygOS (SOSP 2017) • Shenango (NSDI 2019) • Shinjuku (NSDI 2019) • TAS (EuroSys 2019) • Caladan (OSDI 2020) • Demikernel (SOSP 2021) 393 要件 ⾊々なワークロードを⼀つのサーバーで動かしたい - 低遅延が重要なワークロード (Key-Value Store 等) - CPU を消費するワークロード (Hadoop, Spark 等) Hadoop Spark CPU の専有を想定した DPDK のようなシステムとの 組み合わせが広まる 問題:DPDK 等に CPU を占有させるとHadoop, Spark 等の ワークロードへ割り当てるCPU サイクルがなくなる Key-Value Store + DPDK ⽬的 低遅延が重要なワークロードに適切な数の CPU コアを 割り当てられるようにしたい Spark Key-Value Store + DPDK Key-Value Store へのリクエストが多い時
  322. TCP/IP スタック設計の再考 • パケット I/O フレームワーク上で TCP/IP スタックを動かす • Sandstorm

    (SIGCOMM 2014) • mTCP (NSDI 2014) • Arrakis (OSDI 2014) • IX (OSDI 2014) • StackMap (USENIX ATC 2016) • Atlas (SIGCOMM 2017) • ZygOS (SOSP 2017) • Shenango (NSDI 2019) • Shinjuku (NSDI 2019) • TAS (EuroSys 2019) • Caladan (OSDI 2020) • Demikernel (SOSP 2021) 394 IOKernel thread thread パケット キュー アプリプロセス RUNNABLE RUNNABLE
  323. TCP/IP スタック設計の再考 • パケット I/O フレームワーク上で TCP/IP スタックを動かす • Sandstorm

    (SIGCOMM 2014) • mTCP (NSDI 2014) • Arrakis (OSDI 2014) • IX (OSDI 2014) • StackMap (USENIX ATC 2016) • Atlas (SIGCOMM 2017) • ZygOS (SOSP 2017) • Shenango (NSDI 2019) • Shinjuku (NSDI 2019) • TAS (EuroSys 2019) • Caladan (OSDI 2020) • Demikernel (SOSP 2021) 395 IOKernel thread thread パケット キュー アプリプロセス RUNNABLE RUNNABLE アプリプロセスに属する 実⾏可能なスレッドと パケットキューを監視
  324. TCP/IP スタック設計の再考 • パケット I/O フレームワーク上で TCP/IP スタックを動かす • Sandstorm

    (SIGCOMM 2014) • mTCP (NSDI 2014) • Arrakis (OSDI 2014) • IX (OSDI 2014) • StackMap (USENIX ATC 2016) • Atlas (SIGCOMM 2017) • ZygOS (SOSP 2017) • Shenango (NSDI 2019) • Shinjuku (NSDI 2019) • TAS (EuroSys 2019) • Caladan (OSDI 2020) • Demikernel (SOSP 2021) 396 IOKernel thread thread パケット キュー アプリプロセス RUNNABLE RUNNABLE アプリプロセスに属する 実⾏可能なスレッドと パケットキューを監視 実⾏可能なスレッドや 処理されていないパケットが あれば、アプリが利⽤可能な CPU コアを追加
  325. TCP/IP スタック設計の再考 • パケット I/O フレームワーク上で TCP/IP スタックを動かす • Sandstorm

    (SIGCOMM 2014) • mTCP (NSDI 2014) • Arrakis (OSDI 2014) • IX (OSDI 2014) • StackMap (USENIX ATC 2016) • Atlas (SIGCOMM 2017) • ZygOS (SOSP 2017) • Shenango (NSDI 2019) • Shinjuku (NSDI 2019) • TAS (EuroSys 2019) • Caladan (OSDI 2020) • Demikernel (SOSP 2021) 397 IOKernel thread thread パケット キュー アプリプロセス RUNNABLE RUNNABLE アプリプロセスに属する 実⾏可能なスレッドと パケットキューを監視 実⾏可能なスレッドや 処理されていないパケットが あれば、アプリが利⽤可能な CPU コアを追加 5us ごとにコア数の調整
  326. TCP/IP スタック設計の再考 • パケット I/O フレームワーク上で TCP/IP スタックを動かす • Sandstorm

    (SIGCOMM 2014) • mTCP (NSDI 2014) • Arrakis (OSDI 2014) • IX (OSDI 2014) • StackMap (USENIX ATC 2016) • Atlas (SIGCOMM 2017) • ZygOS (SOSP 2017) • Shenango (NSDI 2019) • Shinjuku (NSDI 2019) • TAS (EuroSys 2019) • Caladan (OSDI 2020) • Demikernel (SOSP 2021) 398 IOKernel thread thread パケット キュー アプリプロセス RUNNABLE RUNNABLE アプリプロセスに属する 実⾏可能なスレッドと パケットキューを監視 5us ごとにコア数の調整
  327. TCP/IP スタック設計の再考 • パケット I/O フレームワーク上で TCP/IP スタックを動かす • Sandstorm

    (SIGCOMM 2014) • mTCP (NSDI 2014) • Arrakis (OSDI 2014) • IX (OSDI 2014) • StackMap (USENIX ATC 2016) • Atlas (SIGCOMM 2017) • ZygOS (SOSP 2017) • Shenango (NSDI 2019) • Shinjuku (NSDI 2019) • TAS (EuroSys 2019) • Caladan (OSDI 2020) • Demikernel (SOSP 2021) 399 0 100 200 300 400 0 2 4 6 99.9% Latency (μs) Linux Arachne Shenango ZygOS 0 20 40 60 0 2 4 6 Median Latency (μs) 0 25 50 75 100 0 2 4 6 Memcached Offered Load (million requests/s) Batch Ops/s Memcached と PARSEC swaptions を実⾏ Amy Ousterhout, Joshua Fried, Jonathan Behrens, Adam Belay, and Hari Balakrishnan. 2019. Shenango: Achieving High CPU Efficiency for Latency-Sensitive Datacenter Workloads. In 16th USENIX Symposium on Networked Systems Design and Implementation (NSDI 19), 361- 378.(https://www.usenix.org/conference/nsdi19/presentation/ousterhout)
  328. TCP/IP スタック設計の再考 • パケット I/O フレームワーク上で TCP/IP スタックを動かす • Sandstorm

    (SIGCOMM 2014) • mTCP (NSDI 2014) • Arrakis (OSDI 2014) • IX (OSDI 2014) • StackMap (USENIX ATC 2016) • Atlas (SIGCOMM 2017) • ZygOS (SOSP 2017) • Shenango (NSDI 2019) • Shinjuku (NSDI 2019) • TAS (EuroSys 2019) • Caladan (OSDI 2020) • Demikernel (SOSP 2021) 400 0 100 200 300 400 0 2 4 6 99.9% Latency (μs) Linux Arachne Shenango ZygOS 0 20 40 60 0 2 4 6 Median Latency (μs) 0 25 50 75 100 0 2 4 6 Memcached Offered Load (million requests/s) Batch Ops/s Memcached と PARSEC swaptions を実⾏ ZygOS と近い スループットと低遅延 Amy Ousterhout, Joshua Fried, Jonathan Behrens, Adam Belay, and Hari Balakrishnan. 2019. Shenango: Achieving High CPU Efficiency for Latency-Sensitive Datacenter Workloads. In 16th USENIX Symposium on Networked Systems Design and Implementation (NSDI 19), 361- 378.(https://www.usenix.org/conference/nsdi19/presentation/ousterhout)
  329. TCP/IP スタック設計の再考 • パケット I/O フレームワーク上で TCP/IP スタックを動かす • Sandstorm

    (SIGCOMM 2014) • mTCP (NSDI 2014) • Arrakis (OSDI 2014) • IX (OSDI 2014) • StackMap (USENIX ATC 2016) • Atlas (SIGCOMM 2017) • ZygOS (SOSP 2017) • Shenango (NSDI 2019) • Shinjuku (NSDI 2019) • TAS (EuroSys 2019) • Caladan (OSDI 2020) • Demikernel (SOSP 2021) 401 0 100 200 300 400 0 2 4 6 99.9% Latency (μs) Linux Arachne Shenango ZygOS 0 20 40 60 0 2 4 6 Median Latency (μs) 0 25 50 75 100 0 2 4 6 Memcached Offered Load (million requests/s) Batch Ops/s Memcached と PARSEC swaptions を実⾏ ZygOS はバッチ処理 (PARSEC swaptions) に 費やせる CPU サイクルはない Amy Ousterhout, Joshua Fried, Jonathan Behrens, Adam Belay, and Hari Balakrishnan. 2019. Shenango: Achieving High CPU Efficiency for Latency-Sensitive Datacenter Workloads. In 16th USENIX Symposium on Networked Systems Design and Implementation (NSDI 19), 361- 378.(https://www.usenix.org/conference/nsdi19/presentation/ousterhout)
  330. TCP/IP スタック設計の再考 • パケット I/O フレームワーク上で TCP/IP スタックを動かす • Sandstorm

    (SIGCOMM 2014) • mTCP (NSDI 2014) • Arrakis (OSDI 2014) • IX (OSDI 2014) • StackMap (USENIX ATC 2016) • Atlas (SIGCOMM 2017) • ZygOS (SOSP 2017) • Shenango (NSDI 2019) • Shinjuku (NSDI 2019) • TAS (EuroSys 2019) • Caladan (OSDI 2020) • Demikernel (SOSP 2021) 402 0 100 200 300 400 0 2 4 6 99.9% Latency (μs) Linux Arachne Shenango ZygOS 0 20 40 60 0 2 4 6 Median Latency (μs) 0 25 50 75 100 0 2 4 6 Memcached Offered Load (million requests/s) Batch Ops/s Memcached と PARSEC swaptions を実⾏ Shenango は Memcached ロードが低い時に バッチ処理 (PARSEC swaptions) を実⾏できる Amy Ousterhout, Joshua Fried, Jonathan Behrens, Adam Belay, and Hari Balakrishnan. 2019. Shenango: Achieving High CPU Efficiency for Latency-Sensitive Datacenter Workloads. In 16th USENIX Symposium on Networked Systems Design and Implementation (NSDI 19), 361- 378.(https://www.usenix.org/conference/nsdi19/presentation/ousterhout)
  331. TCP/IP スタック設計の再考 • パケット I/O フレームワーク上で TCP/IP スタックを動かす • Sandstorm

    (SIGCOMM 2014) • mTCP (NSDI 2014) • Arrakis (OSDI 2014) • IX (OSDI 2014) • StackMap (USENIX ATC 2016) • Atlas (SIGCOMM 2017) • ZygOS (SOSP 2017) • Shenango (NSDI 2019) • Shinjuku (NSDI 2019) • TAS (EuroSys 2019) • Caladan (OSDI 2020) • Demikernel (SOSP 2021) 403 Hyper Thread Hyper Thread キャッシュ アプリ1 アプリ2 Hyper Thread Hyper Thread キャッシュ アプリ3 アプリ4 拡張
  332. TCP/IP スタック設計の再考 • パケット I/O フレームワーク上で TCP/IP スタックを動かす • Sandstorm

    (SIGCOMM 2014) • mTCP (NSDI 2014) • Arrakis (OSDI 2014) • IX (OSDI 2014) • StackMap (USENIX ATC 2016) • Atlas (SIGCOMM 2017) • ZygOS (SOSP 2017) • Shenango (NSDI 2019) • Shinjuku (NSDI 2019) • TAS (EuroSys 2019) • Caladan (OSDI 2020) • Demikernel (SOSP 2021) 404 Hyper Thread Hyper Thread キャッシュ アプリ1 アプリ2 Hyper Thread Hyper Thread キャッシュ アプリ3 アプリ4 アプリのワークロード によって⼲渉が発⽣する 拡張
  333. TCP/IP スタック設計の再考 • パケット I/O フレームワーク上で TCP/IP スタックを動かす • Sandstorm

    (SIGCOMM 2014) • mTCP (NSDI 2014) • Arrakis (OSDI 2014) • IX (OSDI 2014) • StackMap (USENIX ATC 2016) • Atlas (SIGCOMM 2017) • ZygOS (SOSP 2017) • Shenango (NSDI 2019) • Shinjuku (NSDI 2019) • TAS (EuroSys 2019) • Caladan (OSDI 2020) • zIO (OSDI 2021) • Demikernel (SOSP 2021) 405 拡張 Hyper Thread Hyper Thread キャッシュ アプリ1 アプリ2 Hyper Thread Hyper Thread キャッシュ アプリ3 アプリ4 アプリのワークロード によって⼲渉が発⽣する Interference Example 6 0 1 2 3 4 5 6 Time (s) 0 50 100 0em. %/W (%) 0 1 2 3 4 5 6 TLme (s) 102 103 104 105 99.9% Lat. (μs) Garbage Collection 1000 x latency increase Memcached 2 cores Better GC Task 20 cores Garbage Collection が動くとメモリ帯域が⼲渉して Memcached の応答遅延が増加する Garbage Collection を⾏うタスクと、Memcached を同じマシンで動かす場合 Joshua Fried, Zhenyuan Ruan, Amy Ousterhout, and Adam Belay. 2020. Caladan: Mitigating Interference at Microsecond Timescales. In 14th USENIX Symposium on Operating Systems Design and Implementation (OSDI 20), 281-297.(https://www.usenix.org/conference/osdi20/presentation/fried)
  334. TCP/IP スタック設計の再考 • パケット I/O フレームワーク上で TCP/IP スタックを動かす • Sandstorm

    (SIGCOMM 2014) • mTCP (NSDI 2014) • Arrakis (OSDI 2014) • IX (OSDI 2014) • StackMap (USENIX ATC 2016) • Atlas (SIGCOMM 2017) • ZygOS (SOSP 2017) • Shenango (NSDI 2019) • Shinjuku (NSDI 2019) • TAS (EuroSys 2019) • Caladan (OSDI 2020) • zIO (OSDI 2021) • Demikernel (SOSP 2021) 406 拡張 Hyper Thread Hyper Thread キャッシュ アプリ1 アプリ2 Hyper Thread Hyper Thread キャッシュ アプリ3 アプリ4 アプリのワークロード によって⼲渉が発⽣する Interference Example 6 0 1 2 3 4 5 6 Time (s) 0 50 100 0em. %/W (%) 0 1 2 3 4 5 6 TLme (s) 102 103 104 105 99.9% Lat. (μs) Garbage Collection 1000 x latency increase Memcached 2 cores Better GC Task 20 cores Garbage Collection が動くとメモリ帯域が⼲渉して Memcached の応答遅延が増加する Garbage Collection を⾏うタスクと、Memcached を同じマシンで動かす場合 ⽬的:このような⼲渉を避けて、 遅延が重要なシステムの遅延が ⼀定以上を越えないようにしたい Joshua Fried, Zhenyuan Ruan, Amy Ousterhout, and Adam Belay. 2020. Caladan: Mitigating Interference at Microsecond Timescales. In 14th USENIX Symposium on Operating Systems Design and Implementation (OSDI 20), 281-297.(https://www.usenix.org/conference/osdi20/presentation/fried)
  335. Scheduler Core 1 Core 2 Core 3 Core 5 Core

    6 Core 4 {Work Stealing} {Core Allocation} Unallocated ksched Runtime ksched ksched ksched ksched Runtime ksched Task 1 Task 2 Shared Memory DRAM Controller (PCIe) Core 0 ksched ioctl() Figure 2: Caladan’s system architecture. Caladan relies on a sched- uler core to gather control signals from shared memory regions TCP/IP スタック設計の再考 • パケット I/O フレームワーク上で TCP/IP スタックを動かす • Sandstorm (SIGCOMM 2014) • mTCP (NSDI 2014) • Arrakis (OSDI 2014) • IX (OSDI 2014) • StackMap (USENIX ATC 2016) • Atlas (SIGCOMM 2017) • ZygOS (SOSP 2017) • Shenango (NSDI 2019) • Shinjuku (NSDI 2019) • TAS (EuroSys 2019) • Caladan (OSDI 2020) • Demikernel (SOSP 2021) 407 拡張 Joshua Fried, Zhenyuan Ruan, Amy Ousterhout, and Adam Belay. 2020. Caladan: Mitigating Interference at Microsecond Timescales. In 14th USENIX Symposium on Operating Systems Design and Implementation (OSDI 20), 281-297.(https://www.usenix.org/conference/osdi20/presentation/fried)
  336. Scheduler Core 1 Core 2 Core 3 Core 5 Core

    6 Core 4 {Work Stealing} {Core Allocation} Unallocated ksched Runtime ksched ksched ksched ksched Runtime ksched Task 1 Task 2 Shared Memory DRAM Controller (PCIe) Core 0 ksched ioctl() Figure 2: Caladan’s system architecture. Caladan relies on a sched- uler core to gather control signals from shared memory regions TCP/IP スタック設計の再考 • パケット I/O フレームワーク上で TCP/IP スタックを動かす • Sandstorm (SIGCOMM 2014) • mTCP (NSDI 2014) • Arrakis (OSDI 2014) • IX (OSDI 2014) • StackMap (USENIX ATC 2016) • Atlas (SIGCOMM 2017) • ZygOS (SOSP 2017) • Shenango (NSDI 2019) • Shinjuku (NSDI 2019) • TAS (EuroSys 2019) • Caladan (OSDI 2020) • Demikernel (SOSP 2021) 408 Caladan scheduler が Caladan ランタイム環境と DRAM コントローラーのカウンタを通して⼲渉を検知 拡張 Joshua Fried, Zhenyuan Ruan, Amy Ousterhout, and Adam Belay. 2020. Caladan: Mitigating Interference at Microsecond Timescales. In 14th USENIX Symposium on Operating Systems Design and Implementation (OSDI 20), 281-297.(https://www.usenix.org/conference/osdi20/presentation/fried)
  337. Scheduler Core 1 Core 2 Core 3 Core 5 Core

    6 Core 4 {Work Stealing} {Core Allocation} Unallocated ksched Runtime ksched ksched ksched ksched Runtime ksched Task 1 Task 2 Shared Memory DRAM Controller (PCIe) Core 0 ksched ioctl() Figure 2: Caladan’s system architecture. Caladan relies on a sched- uler core to gather control signals from shared memory regions TCP/IP スタック設計の再考 • パケット I/O フレームワーク上で TCP/IP スタックを動かす • Sandstorm (SIGCOMM 2014) • mTCP (NSDI 2014) • Arrakis (OSDI 2014) • IX (OSDI 2014) • StackMap (USENIX ATC 2016) • Atlas (SIGCOMM 2017) • ZygOS (SOSP 2017) • Shenango (NSDI 2019) • Shinjuku (NSDI 2019) • TAS (EuroSys 2019) • Caladan (OSDI 2020) • Demikernel (SOSP 2021) 409 Caladan scheduler と Caladan ランタイム環境は 共有メモリを通じて情報をやりとりする 拡張 Joshua Fried, Zhenyuan Ruan, Amy Ousterhout, and Adam Belay. 2020. Caladan: Mitigating Interference at Microsecond Timescales. In 14th USENIX Symposium on Operating Systems Design and Implementation (OSDI 20), 281-297.(https://www.usenix.org/conference/osdi20/presentation/fried)
  338. Scheduler Core 1 Core 2 Core 3 Core 5 Core

    6 Core 4 {Work Stealing} {Core Allocation} Unallocated ksched Runtime ksched ksched ksched ksched Runtime ksched Task 1 Task 2 Shared Memory DRAM Controller (PCIe) Core 0 ksched ioctl() Figure 2: Caladan’s system architecture. Caladan relies on a sched- uler core to gather control signals from shared memory regions TCP/IP スタック設計の再考 • パケット I/O フレームワーク上で TCP/IP スタックを動かす • Sandstorm (SIGCOMM 2014) • mTCP (NSDI 2014) • Arrakis (OSDI 2014) • IX (OSDI 2014) • StackMap (USENIX ATC 2016) • Atlas (SIGCOMM 2017) • ZygOS (SOSP 2017) • Shenango (NSDI 2019) • Shinjuku (NSDI 2019) • TAS (EuroSys 2019) • Caladan (OSDI 2020) • zIO (OSDI 2021) • Demikernel (SOSP 2021) 410 拡張 Caladan scheduler と Caladan ランタイム環境は 共有メモリを通じて情報をやりとりする Mitigating Interference 17 DRAM Bandwidth LLC Misses Request Processing Times Queueing Delay Signals DRAM Bandwidth Interference Hyperthread Interference LLC and other interference, load changes Revoke cores from antagonist task Remove task on sibling core Add core to victim Actions + Direct Indirect Joshua Fried, Zhenyuan Ruan, Amy Ousterhout, and Adam Belay. 2020. Caladan: Mitigating Interference at Microsecond Timescales. In 14th USENIX Symposium on Operating Systems Design and Implementation (OSDI 20), 281-297.(https://www.usenix.org/conference/osdi20/presentation/fried)
  339. Scheduler Core 1 Core 2 Core 3 Core 5 Core

    6 Core 4 {Work Stealing} {Core Allocation} Unallocated ksched Runtime ksched ksched ksched ksched Runtime ksched Task 1 Task 2 Shared Memory DRAM Controller (PCIe) Core 0 ksched ioctl() Figure 2: Caladan’s system architecture. Caladan relies on a sched- uler core to gather control signals from shared memory regions TCP/IP スタック設計の再考 • パケット I/O フレームワーク上で TCP/IP スタックを動かす • Sandstorm (SIGCOMM 2014) • mTCP (NSDI 2014) • Arrakis (OSDI 2014) • IX (OSDI 2014) • StackMap (USENIX ATC 2016) • Atlas (SIGCOMM 2017) • ZygOS (SOSP 2017) • Shenango (NSDI 2019) • Shinjuku (NSDI 2019) • TAS (EuroSys 2019) • Caladan (OSDI 2020) • zIO (OSDI 2021) • Demikernel (SOSP 2021) 411 拡張 Caladan scheduler と Caladan ランタイム環境は 共有メモリを通じて情報をやりとりする Mitigating Interference 17 DRAM Bandwidth LLC Misses Request Processing Times Queueing Delay Signals DRAM Bandwidth Interference Hyperthread Interference LLC and other interference, load changes Revoke cores from antagonist task Remove task on sibling core Add core to victim Actions + Direct Indirect メモリ帯域の⼲渉は DRAM コントローラーの カウンタとキャッシュミスから検知 Joshua Fried, Zhenyuan Ruan, Amy Ousterhout, and Adam Belay. 2020. Caladan: Mitigating Interference at Microsecond Timescales. In 14th USENIX Symposium on Operating Systems Design and Implementation (OSDI 20), 281-297.(https://www.usenix.org/conference/osdi20/presentation/fried)
  340. Scheduler Core 1 Core 2 Core 3 Core 5 Core

    6 Core 4 {Work Stealing} {Core Allocation} Unallocated ksched Runtime ksched ksched ksched ksched Runtime ksched Task 1 Task 2 Shared Memory DRAM Controller (PCIe) Core 0 ksched ioctl() Figure 2: Caladan’s system architecture. Caladan relies on a sched- uler core to gather control signals from shared memory regions TCP/IP スタック設計の再考 • パケット I/O フレームワーク上で TCP/IP スタックを動かす • Sandstorm (SIGCOMM 2014) • mTCP (NSDI 2014) • Arrakis (OSDI 2014) • IX (OSDI 2014) • StackMap (USENIX ATC 2016) • Atlas (SIGCOMM 2017) • ZygOS (SOSP 2017) • Shenango (NSDI 2019) • Shinjuku (NSDI 2019) • TAS (EuroSys 2019) • Caladan (OSDI 2020) • zIO (OSDI 2021) • Demikernel (SOSP 2021) 412 拡張 Caladan scheduler と Caladan ランタイム環境は 共有メモリを通じて情報をやりとりする Mitigating Interference 17 DRAM Bandwidth LLC Misses Request Processing Times Queueing Delay Signals DRAM Bandwidth Interference Hyperthread Interference LLC and other interference, load changes Revoke cores from antagonist task Remove task on sibling core Add core to victim Actions + Direct Indirect メモリ帯域の⼲渉は DRAM コントローラーの カウンタとキャッシュミスから検知 この場合、⼲渉の原因となる ワークロードを実⾏している コアを、ワークロードが所属 するタスクから奪う Joshua Fried, Zhenyuan Ruan, Amy Ousterhout, and Adam Belay. 2020. Caladan: Mitigating Interference at Microsecond Timescales. In 14th USENIX Symposium on Operating Systems Design and Implementation (OSDI 20), 281-297.(https://www.usenix.org/conference/osdi20/presentation/fried)
  341. Scheduler Core 1 Core 2 Core 3 Core 5 Core

    6 Core 4 {Work Stealing} {Core Allocation} Unallocated ksched Runtime ksched ksched ksched ksched Runtime ksched Task 1 Task 2 Shared Memory DRAM Controller (PCIe) Core 0 ksched ioctl() Figure 2: Caladan’s system architecture. Caladan relies on a sched- uler core to gather control signals from shared memory regions TCP/IP スタック設計の再考 • パケット I/O フレームワーク上で TCP/IP スタックを動かす • Sandstorm (SIGCOMM 2014) • mTCP (NSDI 2014) • Arrakis (OSDI 2014) • IX (OSDI 2014) • StackMap (USENIX ATC 2016) • Atlas (SIGCOMM 2017) • ZygOS (SOSP 2017) • Shenango (NSDI 2019) • Shinjuku (NSDI 2019) • TAS (EuroSys 2019) • Caladan (OSDI 2020) • zIO (OSDI 2021) • Demikernel (SOSP 2021) 413 拡張 Caladan scheduler と Caladan ランタイム環境は 共有メモリを通じて情報をやりとりする Mitigating Interference 17 DRAM Bandwidth LLC Misses Request Processing Times Queueing Delay Signals DRAM Bandwidth Interference Hyperthread Interference LLC and other interference, load changes Revoke cores from antagonist task Remove task on sibling core Add core to victim Actions + Direct Indirect ハイパースレッドの⼲渉は リクエスト処理時間の増加を元に検知 Joshua Fried, Zhenyuan Ruan, Amy Ousterhout, and Adam Belay. 2020. Caladan: Mitigating Interference at Microsecond Timescales. In 14th USENIX Symposium on Operating Systems Design and Implementation (OSDI 20), 281-297.(https://www.usenix.org/conference/osdi20/presentation/fried)
  342. Scheduler Core 1 Core 2 Core 3 Core 5 Core

    6 Core 4 {Work Stealing} {Core Allocation} Unallocated ksched Runtime ksched ksched ksched ksched Runtime ksched Task 1 Task 2 Shared Memory DRAM Controller (PCIe) Core 0 ksched ioctl() Figure 2: Caladan’s system architecture. Caladan relies on a sched- uler core to gather control signals from shared memory regions TCP/IP スタック設計の再考 • パケット I/O フレームワーク上で TCP/IP スタックを動かす • Sandstorm (SIGCOMM 2014) • mTCP (NSDI 2014) • Arrakis (OSDI 2014) • IX (OSDI 2014) • StackMap (USENIX ATC 2016) • Atlas (SIGCOMM 2017) • ZygOS (SOSP 2017) • Shenango (NSDI 2019) • Shinjuku (NSDI 2019) • TAS (EuroSys 2019) • Caladan (OSDI 2020) • zIO (OSDI 2021) • Demikernel (SOSP 2021) 414 拡張 Caladan scheduler と Caladan ランタイム環境は 共有メモリを通じて情報をやりとりする Mitigating Interference 17 DRAM Bandwidth LLC Misses Request Processing Times Queueing Delay Signals DRAM Bandwidth Interference Hyperthread Interference LLC and other interference, load changes Revoke cores from antagonist task Remove task on sibling core Add core to victim Actions + Direct Indirect ハイパースレッドの⼲渉は リクエスト処理時間の増加を元に検知 この場合、隣接するハイパースレッドで動作する タスクを取り除く Joshua Fried, Zhenyuan Ruan, Amy Ousterhout, and Adam Belay. 2020. Caladan: Mitigating Interference at Microsecond Timescales. In 14th USENIX Symposium on Operating Systems Design and Implementation (OSDI 20), 281-297.(https://www.usenix.org/conference/osdi20/presentation/fried)
  343. Scheduler Core 1 Core 2 Core 3 Core 5 Core

    6 Core 4 {Work Stealing} {Core Allocation} Unallocated ksched Runtime ksched ksched ksched ksched Runtime ksched Task 1 Task 2 Shared Memory DRAM Controller (PCIe) Core 0 ksched ioctl() Figure 2: Caladan’s system architecture. Caladan relies on a sched- uler core to gather control signals from shared memory regions TCP/IP スタック設計の再考 • パケット I/O フレームワーク上で TCP/IP スタックを動かす • Sandstorm (SIGCOMM 2014) • mTCP (NSDI 2014) • Arrakis (OSDI 2014) • IX (OSDI 2014) • StackMap (USENIX ATC 2016) • Atlas (SIGCOMM 2017) • ZygOS (SOSP 2017) • Shenango (NSDI 2019) • Shinjuku (NSDI 2019) • TAS (EuroSys 2019) • Caladan (OSDI 2020) • zIO (OSDI 2021) • Demikernel (SOSP 2021) 415 拡張 Caladan scheduler と Caladan ランタイム環境は 共有メモリを通じて情報をやりとりする Mitigating Interference 17 DRAM Bandwidth LLC Misses Request Processing Times Queueing Delay Signals DRAM Bandwidth Interference Hyperthread Interference LLC and other interference, load changes Revoke cores from antagonist task Remove task on sibling core Add core to victim Actions + Direct Indirect スレッドのランキューやパケットキューが いっぱいになってきた場合に Joshua Fried, Zhenyuan Ruan, Amy Ousterhout, and Adam Belay. 2020. Caladan: Mitigating Interference at Microsecond Timescales. In 14th USENIX Symposium on Operating Systems Design and Implementation (OSDI 20), 281-297.(https://www.usenix.org/conference/osdi20/presentation/fried)
  344. Scheduler Core 1 Core 2 Core 3 Core 5 Core

    6 Core 4 {Work Stealing} {Core Allocation} Unallocated ksched Runtime ksched ksched ksched ksched Runtime ksched Task 1 Task 2 Shared Memory DRAM Controller (PCIe) Core 0 ksched ioctl() Figure 2: Caladan’s system architecture. Caladan relies on a sched- uler core to gather control signals from shared memory regions TCP/IP スタック設計の再考 • パケット I/O フレームワーク上で TCP/IP スタックを動かす • Sandstorm (SIGCOMM 2014) • mTCP (NSDI 2014) • Arrakis (OSDI 2014) • IX (OSDI 2014) • StackMap (USENIX ATC 2016) • Atlas (SIGCOMM 2017) • ZygOS (SOSP 2017) • Shenango (NSDI 2019) • Shinjuku (NSDI 2019) • TAS (EuroSys 2019) • Caladan (OSDI 2020) • zIO (OSDI 2021) • Demikernel (SOSP 2021) 416 拡張 Caladan scheduler と Caladan ランタイム環境は 共有メモリを通じて情報をやりとりする Mitigating Interference 17 DRAM Bandwidth LLC Misses Request Processing Times Queueing Delay Signals DRAM Bandwidth Interference Hyperthread Interference LLC and other interference, load changes Revoke cores from antagonist task Remove task on sibling core Add core to victim Actions + Direct Indirect スレッドのランキューやパケットキューが いっぱいになってきた場合に それらが所属するタスクへ コアを新しくアサインする Joshua Fried, Zhenyuan Ruan, Amy Ousterhout, and Adam Belay. 2020. Caladan: Mitigating Interference at Microsecond Timescales. In 14th USENIX Symposium on Operating Systems Design and Implementation (OSDI 20), 281-297.(https://www.usenix.org/conference/osdi20/presentation/fried)
  345. TCP/IP スタック設計の再考 • パケット I/O フレームワーク上で TCP/IP スタックを動かす • Sandstorm

    (SIGCOMM 2014) • mTCP (NSDI 2014) • Arrakis (OSDI 2014) • IX (OSDI 2014) • StackMap (USENIX ATC 2016) • Atlas (SIGCOMM 2017) • ZygOS (SOSP 2017) • Shenango (NSDI 2019) • Shinjuku (NSDI 2019) • TAS (EuroSys 2019) • Caladan (OSDI 2020) • Demikernel (SOSP 2021) 417 Memcached and GC Memcached GC Task Latency reaches 580 ms Better Better Low tail latency (50 μs) GC task able to utilize all available resources Throttles BE after GC has completed Garbage Collection Cycle Key Memcached and GC Memcached GC Task Latency reaches 580 ms Better Better Throttles BE after GC has completed Key Memcached Garbage Collection タスク 拡張 Joshua Fried, Zhenyuan Ruan, Amy Ousterhout, and Adam Belay. 2020. Caladan: Mitigating Interference at Microsecond Timescales. In 14th USENIX Symposium on Operating Systems Design and Implementation (OSDI 20), 281-297.(https://www.usenix.org/conference/osdi20/presentation/fried)
  346. TCP/IP スタック設計の再考 • パケット I/O フレームワーク上で TCP/IP スタックを動かす • Sandstorm

    (SIGCOMM 2014) • mTCP (NSDI 2014) • Arrakis (OSDI 2014) • IX (OSDI 2014) • StackMap (USENIX ATC 2016) • Atlas (SIGCOMM 2017) • ZygOS (SOSP 2017) • Shenango (NSDI 2019) • Shinjuku (NSDI 2019) • TAS (EuroSys 2019) • Caladan (OSDI 2020) • Demikernel (SOSP 2021) 418 Memcached and GC Memcached GC Task Latency reaches 580 ms Better Better Low tail latency (50 μs) GC task able to utilize all available resources Throttles BE after GC has completed Garbage Collection Cycle Key Memcached and GC Memcached GC Task Latency reaches 580 ms Better Better Throttles BE after GC has completed Key Memcached Garbage Collection タスク 灰⾊の箇所がGarbage Collection が実⾏されている時間 拡張 Joshua Fried, Zhenyuan Ruan, Amy Ousterhout, and Adam Belay. 2020. Caladan: Mitigating Interference at Microsecond Timescales. In 14th USENIX Symposium on Operating Systems Design and Implementation (OSDI 20), 281-297.(https://www.usenix.org/conference/osdi20/presentation/fried)
  347. TCP/IP スタック設計の再考 • パケット I/O フレームワーク上で TCP/IP スタックを動かす • Sandstorm

    (SIGCOMM 2014) • mTCP (NSDI 2014) • Arrakis (OSDI 2014) • IX (OSDI 2014) • StackMap (USENIX ATC 2016) • Atlas (SIGCOMM 2017) • ZygOS (SOSP 2017) • Shenango (NSDI 2019) • Shinjuku (NSDI 2019) • TAS (EuroSys 2019) • Caladan (OSDI 2020) • Demikernel (SOSP 2021) 419 Memcached and GC Memcached GC Task Latency reaches 580 ms Better Better Low tail latency (50 μs) GC task able to utilize all available resources Throttles BE after GC has completed Garbage Collection Cycle Key Memcached and GC Memcached GC Task Latency reaches 580 ms Better Better Throttles BE after GC has completed Key Memcached Garbage Collection タスク Garbage Collection にかかわらず低い遅延を達成 拡張 Joshua Fried, Zhenyuan Ruan, Amy Ousterhout, and Adam Belay. 2020. Caladan: Mitigating Interference at Microsecond Timescales. In 14th USENIX Symposium on Operating Systems Design and Implementation (OSDI 20), 281-297.(https://www.usenix.org/conference/osdi20/presentation/fried)
  348. TCP/IP スタック設計の再考 • パケット I/O フレームワーク上で TCP/IP スタックを動かす • Sandstorm

    (SIGCOMM 2014) • mTCP (NSDI 2014) • Arrakis (OSDI 2014) • IX (OSDI 2014) • StackMap (USENIX ATC 2016) • Atlas (SIGCOMM 2017) • ZygOS (SOSP 2017) • Shenango (NSDI 2019) • Shinjuku (NSDI 2019) • TAS (EuroSys 2019) • Caladan (OSDI 2020) • Demikernel (SOSP 2021) 421 s devices. Demikernel datapath OSes run with trolplane kernel (e.g., Linux or Windows) and erchangeable library OSes with the same API, ent features and architecture. Each library OS is fic: it offloads to the kernel-bypass device when implements remaining OS management in a user- These libOSes aim to simplify the development atacenter systems across heterogenous kernel- es with while minimizing OS overheads. el follows a trend away from kernel-oriented ary-oriented datapath OSes, motivated by the User-space Software Kernel-space Software I/O Hardware D N Con Pa NIC - SR-IOV User I/O Arrakis libOS DPDK App User I/O Buf. Mgmt Caladan library Kernel-Bypass Architectures eRPC Lib. RDMA App User I/O Buf. Mgmt Net. Trans. OS Kernel Control Path Ad-hoc Datapaths App OS Kern Figure 1. Example kernel-bypass architectures. U ernel architecture (right), Arrakis [73], Caladan [23 Irene Zhang, Amanda Raybuck, Pratyush Patel, Kirk Olynyk, Jacob Nelson, Omar S. Navarro Leija, Ashlie Martinez, Jing Liu, Anna Kornfeld Simpson, Sujay Jayakar, Pedro Henrique Penna, Max Demoulin, Piali Choudhury, and Anirudh Badam. 2021. The Demikernel Datapath OS Architecture for Microsecond-Scale Datacenter Systems. In Proceedings of the ACM Sigops 28th Symposium on Operating Systems Principles (SOSP ʼ21), 195-211.(https://doi.org/10.1145/3477132.3483569)
  349. TCP/IP スタック設計の再考 • パケット I/O フレームワーク上で TCP/IP スタックを動かす • Sandstorm

    (SIGCOMM 2014) • mTCP (NSDI 2014) • Arrakis (OSDI 2014) • IX (OSDI 2014) • StackMap (USENIX ATC 2016) • Atlas (SIGCOMM 2017) • ZygOS (SOSP 2017) • Shenango (NSDI 2019) • Shinjuku (NSDI 2019) • TAS (EuroSys 2019) • Caladan (OSDI 2020) • Demikernel (SOSP 2021) 422 s devices. Demikernel datapath OSes run with trolplane kernel (e.g., Linux or Windows) and erchangeable library OSes with the same API, ent features and architecture. Each library OS is fic: it offloads to the kernel-bypass device when implements remaining OS management in a user- These libOSes aim to simplify the development atacenter systems across heterogenous kernel- es with while minimizing OS overheads. el follows a trend away from kernel-oriented ary-oriented datapath OSes, motivated by the User-space Software Kernel-space Software I/O Hardware D N Con Pa NIC - SR-IOV User I/O Arrakis libOS DPDK App User I/O Buf. Mgmt Caladan library Kernel-Bypass Architectures eRPC Lib. RDMA App User I/O Buf. Mgmt Net. Trans. OS Kernel Control Path Ad-hoc Datapaths App OS Kern Figure 1. Example kernel-bypass architectures. U ernel architecture (right), Arrakis [73], Caladan [23 様々なカーネルをバイパスする システムが提案された Irene Zhang, Amanda Raybuck, Pratyush Patel, Kirk Olynyk, Jacob Nelson, Omar S. Navarro Leija, Ashlie Martinez, Jing Liu, Anna Kornfeld Simpson, Sujay Jayakar, Pedro Henrique Penna, Max Demoulin, Piali Choudhury, and Anirudh Badam. 2021. The Demikernel Datapath OS Architecture for Microsecond-Scale Datacenter Systems. In Proceedings of the ACM Sigops 28th Symposium on Operating Systems Principles (SOSP ʼ21), 195-211.(https://doi.org/10.1145/3477132.3483569)
  350. TCP/IP スタック設計の再考 • パケット I/O フレームワーク上で TCP/IP スタックを動かす • Sandstorm

    (SIGCOMM 2014) • mTCP (NSDI 2014) • Arrakis (OSDI 2014) • IX (OSDI 2014) • StackMap (USENIX ATC 2016) • Atlas (SIGCOMM 2017) • ZygOS (SOSP 2017) • Shenango (NSDI 2019) • Shinjuku (NSDI 2019) • TAS (EuroSys 2019) • Caladan (OSDI 2020) • Demikernel (SOSP 2021) 423 s devices. Demikernel datapath OSes run with trolplane kernel (e.g., Linux or Windows) and erchangeable library OSes with the same API, ent features and architecture. Each library OS is fic: it offloads to the kernel-bypass device when implements remaining OS management in a user- These libOSes aim to simplify the development atacenter systems across heterogenous kernel- es with while minimizing OS overheads. el follows a trend away from kernel-oriented ary-oriented datapath OSes, motivated by the User-space Software Kernel-space Software I/O Hardware D N Con Pa NIC - SR-IOV User I/O Arrakis libOS DPDK App User I/O Buf. Mgmt Caladan library Kernel-Bypass Architectures eRPC Lib. RDMA App User I/O Buf. Mgmt Net. Trans. OS Kernel Control Path Ad-hoc Datapaths App OS Kern Figure 1. Example kernel-bypass architectures. U ernel architecture (right), Arrakis [73], Caladan [23 様々なカーネルをバイパスする システムが提案された Irene Zhang, Amanda Raybuck, Pratyush Patel, Kirk Olynyk, Jacob Nelson, Omar S. Navarro Leija, Ashlie Martinez, Jing Liu, Anna Kornfeld Simpson, Sujay Jayakar, Pedro Henrique Penna, Max Demoulin, Piali Choudhury, and Anirudh Badam. 2021. The Demikernel Datapath OS Architecture for Microsecond-Scale Datacenter Systems. In Proceedings of the ACM Sigops 28th Symposium on Operating Systems Principles (SOSP ʼ21), 195-211.(https://doi.org/10.1145/3477132.3483569)
  351. TCP/IP スタック設計の再考 • パケット I/O フレームワーク上で TCP/IP スタックを動かす • Sandstorm

    (SIGCOMM 2014) • mTCP (NSDI 2014) • Arrakis (OSDI 2014) • IX (OSDI 2014) • StackMap (USENIX ATC 2016) • Atlas (SIGCOMM 2017) • ZygOS (SOSP 2017) • Shenango (NSDI 2019) • Shinjuku (NSDI 2019) • TAS (EuroSys 2019) • Caladan (OSDI 2020) • Demikernel (SOSP 2021) 424 s devices. Demikernel datapath OSes run with trolplane kernel (e.g., Linux or Windows) and erchangeable library OSes with the same API, ent features and architecture. Each library OS is fic: it offloads to the kernel-bypass device when implements remaining OS management in a user- These libOSes aim to simplify the development atacenter systems across heterogenous kernel- es with while minimizing OS overheads. el follows a trend away from kernel-oriented ary-oriented datapath OSes, motivated by the User-space Software Kernel-space Software I/O Hardware D N Con Pa NIC - SR-IOV User I/O Arrakis libOS DPDK App User I/O Buf. Mgmt Caladan library Kernel-Bypass Architectures eRPC Lib. RDMA App User I/O Buf. Mgmt Net. Trans. OS Kernel Control Path Ad-hoc Datapaths App OS Kern Figure 1. Example kernel-bypass architectures. U ernel architecture (right), Arrakis [73], Caladan [23 様々なカーネルをバイパスする システムが提案された 問題:アプリが利⽤を想定するデバイスに依存 Irene Zhang, Amanda Raybuck, Pratyush Patel, Kirk Olynyk, Jacob Nelson, Omar S. Navarro Leija, Ashlie Martinez, Jing Liu, Anna Kornfeld Simpson, Sujay Jayakar, Pedro Henrique Penna, Max Demoulin, Piali Choudhury, and Anirudh Badam. 2021. The Demikernel Datapath OS Architecture for Microsecond-Scale Datacenter Systems. In Proceedings of the ACM Sigops 28th Symposium on Operating Systems Principles (SOSP ʼ21), 195-211.(https://doi.org/10.1145/3477132.3483569)
  352. TCP/IP スタック設計の再考 • パケット I/O フレームワーク上で TCP/IP スタックを動かす • Sandstorm

    (SIGCOMM 2014) • mTCP (NSDI 2014) • Arrakis (OSDI 2014) • IX (OSDI 2014) • StackMap (USENIX ATC 2016) • Atlas (SIGCOMM 2017) • ZygOS (SOSP 2017) • Shenango (NSDI 2019) • Shinjuku (NSDI 2019) • TAS (EuroSys 2019) • Caladan (OSDI 2020) • Demikernel (SOSP 2021) 425 s devices. Demikernel datapath OSes run with trolplane kernel (e.g., Linux or Windows) and erchangeable library OSes with the same API, ent features and architecture. Each library OS is fic: it offloads to the kernel-bypass device when implements remaining OS management in a user- These libOSes aim to simplify the development atacenter systems across heterogenous kernel- es with while minimizing OS overheads. el follows a trend away from kernel-oriented ary-oriented datapath OSes, motivated by the User-space Software Kernel-space Software I/O Hardware D N Con Pa NIC - SR-IOV User I/O Arrakis libOS DPDK App User I/O Buf. Mgmt Caladan library Kernel-Bypass Architectures eRPC Lib. RDMA App User I/O Buf. Mgmt Net. Trans. OS Kernel Control Path Ad-hoc Datapaths App OS Kern Figure 1. Example kernel-bypass architectures. U ernel architecture (right), Arrakis [73], Caladan [23 様々なカーネルをバイパスする システムが提案された 問題:アプリが利⽤を想定するデバイスに依存 モチベーション:汎⽤的なインターフェースがあった⽅が良い Irene Zhang, Amanda Raybuck, Pratyush Patel, Kirk Olynyk, Jacob Nelson, Omar S. Navarro Leija, Ashlie Martinez, Jing Liu, Anna Kornfeld Simpson, Sujay Jayakar, Pedro Henrique Penna, Max Demoulin, Piali Choudhury, and Anirudh Badam. 2021. The Demikernel Datapath OS Architecture for Microsecond-Scale Datacenter Systems. In Proceedings of the ACM Sigops 28th Symposium on Operating Systems Principles (SOSP ʼ21), 195-211.(https://doi.org/10.1145/3477132.3483569)
  353. TCP/IP スタック設計の再考 • パケット I/O フレームワーク上で TCP/IP スタックを動かす • Sandstorm

    (SIGCOMM 2014) • mTCP (NSDI 2014) • Arrakis (OSDI 2014) • IX (OSDI 2014) • StackMap (USENIX ATC 2016) • Atlas (SIGCOMM 2017) • ZygOS (SOSP 2017) • Shenango (NSDI 2019) • Shinjuku (NSDI 2019) • TAS (EuroSys 2019) • Caladan (OSDI 2020) • Demikernel (SOSP 2021) 426 into a single library for both devices (e.g., RDMAxSPDK). We implemented the bulk of our library OS code in Rust. We initially prototyped several libOSes in C++; however, we found that Rust performs competitively with C++ and achieves ns-scale latencies while offering additional benefits. First, Rust enforces memory safety through language fea- tures and its compiler. Though our libOSes use unsafe code to bind to C/C++ kernel-bypass libraries and applications, User-space Software Kernel-space Software I/O Hardware I/O Device ??? libFuture ??? DPDK User I/O Buf. Mgmt libRDMA RDMA User I/O Buf. Mgmt Net. Trans. OS Kernel Control Path Demikernel Datapath Architecture App libPOSIX libDPDK SPDK User I/O Buf. Mgmt libSPDK Future Demikernel PDPIX Datapath API Figure 3. Demikernel kernel-bypass architecture. Demikernel ac- commodates heterogenous kernel-bypass devices, including poten- tial future hardware, with a flexible library OS-based datapath ar- chitecture.We include a libOS that goes through the OS kernel for Irene Zhang, Amanda Raybuck, Pratyush Patel, Kirk Olynyk, Jacob Nelson, Omar S. Navarro Leija, Ashlie Martinez, Jing Liu, Anna Kornfeld Simpson, Sujay Jayakar, Pedro Henrique Penna, Max Demoulin, Piali Choudhury, and Anirudh Badam. 2021. The Demikernel Datapath OS Architecture for Microsecond-Scale Datacenter Systems. In Proceedings of the ACM Sigops 28th Symposium on Operating Systems Principles (SOSP ʼ21), 195-211.(https://doi.org/10.1145/3477132.3483569)
  354. TCP/IP スタック設計の再考 • パケット I/O フレームワーク上で TCP/IP スタックを動かす • Sandstorm

    (SIGCOMM 2014) • mTCP (NSDI 2014) • Arrakis (OSDI 2014) • IX (OSDI 2014) • StackMap (USENIX ATC 2016) • Atlas (SIGCOMM 2017) • ZygOS (SOSP 2017) • Shenango (NSDI 2019) • Shinjuku (NSDI 2019) • TAS (EuroSys 2019) • Caladan (OSDI 2020) • Demikernel (SOSP 2021) 427 into a single library for both devices (e.g., RDMAxSPDK). We implemented the bulk of our library OS code in Rust. We initially prototyped several libOSes in C++; however, we found that Rust performs competitively with C++ and achieves ns-scale latencies while offering additional benefits. First, Rust enforces memory safety through language fea- tures and its compiler. Though our libOSes use unsafe code to bind to C/C++ kernel-bypass libraries and applications, User-space Software Kernel-space Software I/O Hardware I/O Device ??? libFuture ??? DPDK User I/O Buf. Mgmt libRDMA RDMA User I/O Buf. Mgmt Net. Trans. OS Kernel Control Path Demikernel Datapath Architecture App libPOSIX libDPDK SPDK User I/O Buf. Mgmt libSPDK Future Demikernel PDPIX Datapath API Figure 3. Demikernel kernel-bypass architecture. Demikernel ac- commodates heterogenous kernel-bypass devices, including poten- tial future hardware, with a flexible library OS-based datapath ar- chitecture.We include a libOS that goes through the OS kernel for 提案:異なるタイプのデバイスへ 共通のインターフェースからアクセス可能にする Irene Zhang, Amanda Raybuck, Pratyush Patel, Kirk Olynyk, Jacob Nelson, Omar S. Navarro Leija, Ashlie Martinez, Jing Liu, Anna Kornfeld Simpson, Sujay Jayakar, Pedro Henrique Penna, Max Demoulin, Piali Choudhury, and Anirudh Badam. 2021. The Demikernel Datapath OS Architecture for Microsecond-Scale Datacenter Systems. In Proceedings of the ACM Sigops 28th Symposium on Operating Systems Principles (SOSP ʼ21), 195-211.(https://doi.org/10.1145/3477132.3483569)
  355. 通信関連のシステムソフトウェア データセンター サービス利⽤者の端末 サービス提供側 インターネット ⼤量のリクエストが集まってくる サービス提供側はなるべく短い応答時間でサービスを提供したい データセンター内のサーバー NIC 10

    ~ Gbps 通信関連ソフトウェア NIC デバイスドライバ TCP/IP スタック アプリケーション NIC デバイスドライバ 仮想スイッチ 仮想 NIC バックエンド ユーザー空間 カーネル ホスト 仮想マシン ハードウェア ( NIC ) は速くなったので ソフトウェアの効率が重要になる 429
  356. 仮想マシン環境 433 NIC デバイスドライバ TCP/IP スタック アプリケーション NIC デバイスドライバ 仮想スイッチ

    仮想 NIC バックエンド ユーザー空間 カーネル ホスト 仮想マシン 仮想マシン環境ではバックエンドも 速くないと性能が制限されてしまう
  357. 仮想マシン環境 434 NIC デバイスドライバ TCP/IP スタック アプリケーション NIC デバイスドライバ 仮想スイッチ

    仮想 NIC バックエンド ユーザー空間 カーネル ホスト 仮想マシン 仮想マシン環境ではバックエンドも 速くないと性能が制限されてしまう ⾼速化ポイント
  358. 仮想スイッチ 435 NIC デバイスドライバ TCP/IP スタック アプリケーション NIC デバイスドライバ 仮想スイッチ

    仮想 NIC バックエンド ユーザー空間 カーネル ホスト 仮想マシン NIC デバイスドライバ TCP/IP スタック アプリケーション ユーザー空間 カーネル 仮想マシン 仮想 NIC バックエンド なぜ必要? 物理 NIC を複数の仮想マシンで分離を維持しつつ共有するため
  359. 仮想スイッチ 436 NIC デバイスドライバ TCP/IP スタック アプリケーション NIC デバイスドライバ 仮想スイッチ

    仮想 NIC バックエンド ユーザー空間 カーネル ホスト 仮想マシン NIC デバイスドライバ TCP/IP スタック アプリケーション ユーザー空間 カーネル 仮想マシン 仮想 NIC バックエンド なぜ必要? 物理 NIC を複数の仮想マシンで分離を維持しつつ共有するため 共有
  360. 仮想スイッチ 437 NIC デバイスドライバ TCP/IP スタック アプリケーション NIC デバイスドライバ 仮想スイッチ

    仮想 NIC バックエンド ユーザー空間 カーネル ホスト 仮想マシン NIC デバイスドライバ TCP/IP スタック アプリケーション ユーザー空間 カーネル 仮想マシン 仮想 NIC バックエンド なぜ必要? 物理 NIC を複数の仮想マシンで分離を維持しつつ共有するため 共有
  361. 仮想スイッチ 438 NIC デバイスドライバ TCP/IP スタック アプリケーション NIC デバイスドライバ 仮想スイッチ

    仮想 NIC バックエンド ユーザー空間 カーネル ホスト 仮想マシン NIC デバイスドライバ TCP/IP スタック アプリケーション ユーザー空間 カーネル 仮想マシン 仮想 NIC バックエンド なぜ必要? 物理 NIC を複数の仮想マシンで分離を維持しつつ共有するため A 共有
  362. 仮想スイッチ 439 NIC デバイスドライバ TCP/IP スタック アプリケーション NIC デバイスドライバ 仮想スイッチ

    仮想 NIC バックエンド ユーザー空間 カーネル ホスト 仮想マシン NIC デバイスドライバ TCP/IP スタック アプリケーション ユーザー空間 カーネル 仮想マシン 仮想 NIC バックエンド なぜ必要? 物理 NIC を複数の仮想マシンで分離を維持しつつ共有するため A B 共有
  363. 仮想スイッチ 440 NIC デバイスドライバ TCP/IP スタック アプリケーション NIC デバイスドライバ 仮想スイッチ

    仮想 NIC バックエンド ユーザー空間 カーネル ホスト 仮想マシン NIC デバイスドライバ TCP/IP スタック アプリケーション ユーザー空間 カーネル 仮想マシン 仮想 NIC バックエンド なぜ必要? 物理 NIC を複数の仮想マシンで分離を維持しつつ共有するため A B 宛先: 仮想マシンA 新規パケットの到着 宛先: 仮想マシンB 共有
  364. 仮想スイッチ 441 NIC デバイスドライバ TCP/IP スタック アプリケーション NIC デバイスドライバ 仮想スイッチ

    仮想 NIC バックエンド ユーザー空間 カーネル ホスト 仮想マシン NIC デバイスドライバ TCP/IP スタック アプリケーション ユーザー空間 カーネル 仮想マシン 仮想 NIC バックエンド なぜ必要? 物理 NIC を複数の仮想マシンで分離を維持しつつ共有するため A B 宛先: 仮想マシンA 新規パケットの到着 宛先: 仮想マシンB 共有 仮想マシンが共有する NIC には 異なる仮想マシンを宛先とする パケットが送られてくる
  365. 仮想スイッチ 442 NIC デバイスドライバ TCP/IP スタック アプリケーション NIC デバイスドライバ 仮想スイッチ

    仮想 NIC バックエンド ユーザー空間 カーネル ホスト 仮想マシン NIC デバイスドライバ TCP/IP スタック アプリケーション ユーザー空間 カーネル 仮想マシン 仮想 NIC バックエンド なぜ必要? 物理 NIC を複数の仮想マシンで分離を維持しつつ共有するため A B 宛先: 仮想マシンA 新規パケットの到着 宛先: 仮想マシンB 各仮想マシンは 別の仮想マシンを 宛先とするパケットへ アクセスできるべきでない
  366. 仮想スイッチ 443 NIC デバイスドライバ TCP/IP スタック アプリケーション NIC デバイスドライバ 仮想スイッチ

    仮想 NIC バックエンド ユーザー空間 カーネル ホスト 仮想マシン NIC デバイスドライバ TCP/IP スタック アプリケーション ユーザー空間 カーネル 仮想マシン 仮想 NIC バックエンド なぜ必要? 物理 NIC を複数の仮想マシンで分離を維持しつつ共有するため A B 宛先: 仮想マシンA 新規パケットの到着 宛先: 仮想マシンB 各仮想マシンは 別の仮想マシンを 宛先とするパケットへ アクセスできるべきでない
  367. 仮想スイッチ 444 NIC デバイスドライバ TCP/IP スタック アプリケーション NIC デバイスドライバ 仮想スイッチ

    仮想 NIC バックエンド ユーザー空間 カーネル ホスト 仮想マシン NIC デバイスドライバ TCP/IP スタック アプリケーション ユーザー空間 カーネル 仮想マシン 仮想 NIC バックエンド なぜ必要? 物理 NIC を複数の仮想マシンで分離を維持しつつ共有するため A B 宛先: 仮想マシンA 宛先: 仮想マシンB 仮想スイッチがパケットの宛先(MAC アドレス) を元に仮想マシンへパケットをフォワードするようにすることで 各仮想マシンは⾃分へ宛てられたパケット以外⾒えなくできる 各仮想マシンは 別の仮想マシンを 宛先とするパケットへ アクセスできるべきでない
  368. 仮想スイッチ 445 NIC デバイスドライバ TCP/IP スタック アプリケーション NIC デバイスドライバ 仮想スイッチ

    仮想 NIC バックエンド ユーザー空間 カーネル ホスト 仮想マシン NIC デバイスドライバ TCP/IP スタック アプリケーション ユーザー空間 カーネル 仮想マシン 仮想 NIC バックエンド なぜ必要? 物理 NIC を複数の仮想マシンで分離を維持しつつ共有するため A B 仮想スイッチの処理は仮想マシン通信において頻繁に 実⾏されるため、⾼い性能を発揮するためには効率が重要
  369. (⽐較的⼀般的な)仮想スイッチ利⽤法 • ユーザー空間プロセスは tap デバイスを通じてパケットを送受 信する 446 仮想スイッチ(e.g., Linux bridge)

    ユーザー空間 カーネル 物理マシン プロセス アプリケーション tap device プロセス アプリケーション tap device
  370. (⽐較的⼀般的な)仮想スイッチ利⽤法 • 問題:既存の tap デバイスと仮想スイッチが⾼速にパケットを フォワードできない 448 仮想スイッチ(e.g., Linux bridge)

    ユーザー空間 カーネル 物理マシン プロセス アプリケーション tap device プロセス アプリケーション tap device
  371. 他の仮想 I/O 機構:SR-IOV 449 NIC デバイスドライバ TCP/IP スタック アプリケーション スイッチ

    仮想 NIC ユーザー空間 カーネル NIC 仮想マシン NIC デバイスドライバ TCP/IP スタック アプリケーション ユーザー空間 カーネル 仮想マシン 仮想 NIC ホスト * Single Root I/O Virtualization
  372. 他の仮想 I/O 機構:SR-IOV 450 NIC デバイスドライバ TCP/IP スタック アプリケーション スイッチ

    仮想 NIC ユーザー空間 カーネル NIC 仮想マシン NIC デバイスドライバ TCP/IP スタック アプリケーション ユーザー空間 カーネル 仮想マシン 仮想 NIC ホスト - NIC が仮想インターフェースを提供 - ホストを介さなくても複数仮想マシンが 1 つの物理 NIC を共有できる * Single Root I/O Virtualization
  373. 他の仮想 I/O 機構:SR-IOV 451 NIC デバイスドライバ TCP/IP スタック アプリケーション スイッチ

    仮想 NIC ユーザー空間 カーネル NIC 仮想マシン NIC デバイスドライバ TCP/IP スタック アプリケーション ユーザー空間 カーネル 仮想マシン 仮想 NIC ホスト - NIC が仮想インターフェースを提供 - ホストを介さなくても複数仮想マシンが 1 つの物理 NIC を共有できる 利点:⾼速 ⽋点:ソフトウェアで細部の制御ができない * Single Root I/O Virtualization
  374. 仮想マシン通信の⾼速化 • 仮想スイッチへパケット I/O フレームワークを適⽤ • VALE (CoNEXT 2012) •

    CuckooSwitch (CoNEXT 2013) • mSwitch (SOSR 2015) 453 仮想スイッチ(e.g., Linux bridge) ユーザー空間 カーネル 物理マシン プロセス アプリケーション tap device プロセス アプリケーション tap device
  375. 仮想マシン通信の⾼速化 • 仮想スイッチへパケット I/O フレームワークを適⽤ • VALE (CoNEXT 2012) •

    CuckooSwitch (CoNEXT 2013) • mSwitch (SOSR 2015) 454 VALE ( netmap モジュールの⼀部 ):仮想スイッチとして機能 ユーザー空間 カーネル 物理マシン プロセス アプリケーション Virtual Port (netmap API) プロセス アプリケーション Virtual Port (netmap API) tap デバイスの代わりに netmap API 準拠の仮想ポート
  376. 仮想マシン通信の⾼速化 • 仮想スイッチへパケット I/O フレームワークを適⽤ • VALE (CoNEXT 2012) •

    CuckooSwitch (CoNEXT 2013) • mSwitch (SOSR 2015) 455 VALE ( netmap モジュールの⼀部 ):仮想スイッチとして機能 ユーザー空間 カーネル 物理マシン プロセス アプリケーション Virtual Port (netmap API) プロセス アプリケーション Virtual Port (netmap API) tap デバイスの代わりに netmap API 準拠の仮想ポート netmap API 準拠の仮想ポート間で MAC アドレスを元にパケットを転送
  377. 仮想マシン通信の⾼速化 • 仮想スイッチへパケット I/O フレームワークを適⽤ • VALE (CoNEXT 2012) •

    CuckooSwitch (CoNEXT 2013) • mSwitch (SOSR 2015) 456 responding pps rates are between 1/6 and 1/150 of tho shown here. The traffic received by a bridge should normally go to single destination, but there are cases (multicast or unknow destinations) where the bridge needs to replicate packets t multiple ports. Hence the number of active ports impac the throughput of the system. 2 4 6 8 10 12 14 16 18 1 2 3 4 5 6 7 8 Forwarding rate (Mpps) Destinations VALE, 60 bytes NIC, 60 bytes VALE, 1514 bytes NIC, 1514 bytes TAP, 60 bytes Luigi Rizzo and Giuseppe Lettieri. 2012. VALE, a Switched Ethernet for Virtual Machines. In Proceedings of the 8th International Conference on Emerging Networking Experiments and Technologies (CoNEXT ʼ12), 61-72.(https://doi.org/10.1145/2413176.2413185)
  378. 仮想マシン通信の⾼速化 • 仮想スイッチへパケット I/O フレームワークを適⽤ • VALE (CoNEXT 2012) •

    CuckooSwitch (CoNEXT 2013) • mSwitch (SOSR 2015) 457 responding pps rates are between 1/6 and 1/150 of tho shown here. The traffic received by a bridge should normally go to single destination, but there are cases (multicast or unknow destinations) where the bridge needs to replicate packets t multiple ports. Hence the number of active ports impac the throughput of the system. 2 4 6 8 10 12 14 16 18 1 2 3 4 5 6 7 8 Forwarding rate (Mpps) Destinations VALE, 60 bytes NIC, 60 bytes VALE, 1514 bytes NIC, 1514 bytes TAP, 60 bytes • パケットサイズが60バイトで 宛先が1つの場合 • VALE: 17.6 Mpps • tap デバイス: 1 Mpps 以下 Luigi Rizzo and Giuseppe Lettieri. 2012. VALE, a Switched Ethernet for Virtual Machines. In Proceedings of the 8th International Conference on Emerging Networking Experiments and Technologies (CoNEXT ʼ12), 61-72.(https://doi.org/10.1145/2413176.2413185)
  379. 仮想マシン通信の⾼速化 • 仮想スイッチへパケット I/O フレームワークを適⽤ • VALE (CoNEXT 2012) •

    CuckooSwitch (CoNEXT 2013) • mSwitch (SOSR 2015) 458 responding pps rates are between 1/6 and 1/150 of tho shown here. The traffic received by a bridge should normally go to single destination, but there are cases (multicast or unknow destinations) where the bridge needs to replicate packets t multiple ports. Hence the number of active ports impac the throughput of the system. 2 4 6 8 10 12 14 16 18 1 2 3 4 5 6 7 8 Forwarding rate (Mpps) Destinations VALE, 60 bytes NIC, 60 bytes VALE, 1514 bytes NIC, 1514 bytes TAP, 60 bytes • パケットサイズが60バイトで 宛先が1つの場合 • VALE: 17.6 Mpps • tap デバイス: 1 Mpps 以下 Luigi Rizzo and Giuseppe Lettieri. 2012. VALE, a Switched Ethernet for Virtual Machines. In Proceedings of the 8th International Conference on Emerging Networking Experiments and Technologies (CoNEXT ʼ12), 61-72.(https://doi.org/10.1145/2413176.2413185)
  380. 仮想マシン通信の⾼速化 • 仮想スイッチへパケット I/O フレームワークを適⽤ • VALE (CoNEXT 2012) •

    CuckooSwitch (CoNEXT 2013) • mSwitch (SOSR 2015) 459 responding pps rates are between 1/6 and 1/150 of tho shown here. The traffic received by a bridge should normally go to single destination, but there are cases (multicast or unknow destinations) where the bridge needs to replicate packets t multiple ports. Hence the number of active ports impac the throughput of the system. 2 4 6 8 10 12 14 16 18 1 2 3 4 5 6 7 8 Forwarding rate (Mpps) Destinations VALE, 60 bytes NIC, 60 bytes VALE, 1514 bytes NIC, 1514 bytes TAP, 60 bytes • パケットサイズが60バイトで 宛先が1つの場合 • VALE: 17.6 Mpps • tap デバイス: 1 Mpps 以下 SR-IOV はデータが PCI バスを経由するため 仮想ポート間の通信は VALE より遅くなる Luigi Rizzo and Giuseppe Lettieri. 2012. VALE, a Switched Ethernet for Virtual Machines. In Proceedings of the 8th International Conference on Emerging Networking Experiments and Technologies (CoNEXT ʼ12), 61-72.(https://doi.org/10.1145/2413176.2413185)
  381. 仮想マシン通信の⾼速化 • 仮想スイッチへパケット I/O フレームワークを適⽤ • VALE (CoNEXT 2012) •

    CuckooSwitch (CoNEXT 2013) • mSwitch (SOSR 2015) 460 responding pps rates are between 1/6 and 1/150 of tho shown here. The traffic received by a bridge should normally go to single destination, but there are cases (multicast or unknow destinations) where the bridge needs to replicate packets t multiple ports. Hence the number of active ports impac the throughput of the system. 2 4 6 8 10 12 14 16 18 1 2 3 4 5 6 7 8 Forwarding rate (Mpps) Destinations VALE, 60 bytes NIC, 60 bytes VALE, 1514 bytes NIC, 1514 bytes TAP, 60 bytes • パケットサイズが60バイトで 宛先が1つの場合 • VALE: 17.6 Mpps • tap デバイス: 1 Mpps 以下 ⼤幅な改善 Luigi Rizzo and Giuseppe Lettieri. 2012. VALE, a Switched Ethernet for Virtual Machines. In Proceedings of the 8th International Conference on Emerging Networking Experiments and Technologies (CoNEXT ʼ12), 61-72.(https://doi.org/10.1145/2413176.2413185)
  382. 仮想マシン通信の⾼速化 • 仮想スイッチへパケット I/O フレームワークを適⽤ • VALE (CoNEXT 2012) •

    CuckooSwitch (CoNEXT 2013) • mSwitch (SOSR 2015) 461 NIC デバイスドライバ TCP/IP スタック アプリケーション NIC デバイスドライバ 仮想スイッチ 仮想 NIC バックエンド ユーザー空間 カーネル ホスト 仮想マシン NIC デバイスドライバ TCP/IP スタック アプリケーション ユーザー空間 カーネル 仮想マシン 仮想 NIC バックエンド
  383. 仮想マシン通信の⾼速化 • 仮想スイッチへパケット I/O フレームワークを適⽤ • VALE (CoNEXT 2012) •

    CuckooSwitch (CoNEXT 2013) • mSwitch (SOSR 2015) 462 e1000 デバイスドライバ netmap pkt-gen NIC デバイスドライバ VALE QEMU e1000 emulation ユーザー空間 カーネル ホスト 仮想マシン e1000 デバイスドライバ netmap pkt-gen ユーザー空間 カーネル 仮想マシン QEMU e1000 emulation Virtual Port (netmap API) Virtual Port (netmap API) VALE を QEMU/KVM へ適⽤して実験
  384. 仮想マシン通信の⾼速化 • 仮想スイッチへパケット I/O フレームワークを適⽤ • VALE (CoNEXT 2012) •

    CuckooSwitch (CoNEXT 2013) • mSwitch (SOSR 2015) 463 e1000 デバイスドライバ netmap pkt-gen NIC デバイスドライバ VALE QEMU e1000 emulation ユーザー空間 カーネル ホスト 仮想マシン e1000 デバイスドライバ netmap pkt-gen ユーザー空間 カーネル 仮想マシン QEMU e1000 emulation Virtual Port (netmap API) Virtual Port (netmap API) VALE を QEMU/KVM へ適⽤して実験 仮想マシン内では netmap ベースの pkt-gen アプリを実⾏
  385. 仮想マシン通信の⾼速化 • 仮想スイッチへパケット I/O フレームワークを適⽤ • VALE (CoNEXT 2012) •

    CuckooSwitch (CoNEXT 2013) • mSwitch (SOSR 2015) 464 e1000 デバイスドライバ netmap pkt-gen NIC デバイスドライバ VALE QEMU e1000 emulation ユーザー空間 カーネル ホスト 仮想マシン e1000 デバイスドライバ netmap pkt-gen ユーザー空間 カーネル 仮想マシン QEMU e1000 emulation Virtual Port (netmap API) Virtual Port (netmap API) VALE を QEMU/KVM へ適⽤して実験 Throughput TX (Mpps) RX (Mpps) tap device 0.550 0.550 VALE 3.470 2.550
  386. 仮想マシン通信の⾼速化 • 仮想スイッチへパケット I/O フレームワークを適⽤ • VALE (CoNEXT 2012) •

    CuckooSwitch (CoNEXT 2013) • mSwitch (SOSR 2015) 465 改善 - 利⽤可能ポート数がスケールできるようにする - パケット転送ロジックをカーネルモジュールで実装できるようにする
  387. 仮想マシン通信の⾼速化 • パケット I/O フレームワークを使った仮想スイッチを仮想マシ ン通信基盤へ適⽤ • ClickOS (NSDI 2014)

    • NetVM (NSDI 2014) • ptnetmap (ANCS 2015, LANMAN 2016) • HyperNF (SoCC 2017) • ELISA (ASPLOS 2023) 468
  388. 仮想マシン通信の⾼速化 • パケット I/O フレームワークを使った仮想スイッチを仮想マシ ン通信基盤へ適⽤ • ClickOS (NSDI 2014)

    • NetVM (NSDI 2014) • ptnetmap (ANCS 2015, LANMAN 2016) • HyperNF (SoCC 2017) • ELISA (ASPLOS 2023) 469
  389. 仮想マシン通信の⾼速化 • 仮想スイッチへパケット I/O フレームワークを適⽤ • VALE (CoNEXT 2012) •

    CuckooSwitch (CoNEXT 2013) • mSwitch (SOSR 2015) 470 e1000 デバイスドライバ netmap pkt-gen NIC デバイスドライバ VALE QEMU e1000 emulation ユーザー空間 カーネル ホスト 仮想マシン e1000 デバイスドライバ netmap pkt-gen ユーザー空間 カーネル 仮想マシン QEMU e1000 emulation Virtual Port (netmap API) Virtual Port (netmap API)
  390. 仮想マシン通信の⾼速化 • 仮想スイッチへパケット I/O フレームワークを適⽤ • VALE (CoNEXT 2012) •

    CuckooSwitch (CoNEXT 2013) • mSwitch (SOSR 2015) 471 e1000 デバイスドライバ netmap pkt-gen NIC デバイスドライバ VALE QEMU e1000 emulation ユーザー空間 カーネル ホスト 仮想マシン e1000 デバイスドライバ netmap pkt-gen ユーザー空間 カーネル 仮想マシン QEMU e1000 emulation Virtual Port (netmap API) Virtual Port (netmap API) 改善の余地あり
  391. 仮想マシン通信の⾼速化 • 仮想スイッチへパケット I/O フレームワークを適⽤ • VALE (CoNEXT 2012) •

    CuckooSwitch (CoNEXT 2013) • mSwitch (SOSR 2015) 472 netmap pkt-gen NIC デバイスドライバ VALE ユーザー空間 カーネル ホスト 仮想マシン netmap pkt-gen ユーザー空間 カーネル 仮想マシン Virtual Port (netmap API) Virtual Port (netmap API)
  392. 仮想マシン通信の⾼速化 • 仮想スイッチへパケット I/O フレームワークを適⽤ • VALE (CoNEXT 2012) •

    CuckooSwitch (CoNEXT 2013) • mSwitch (SOSR 2015) 473 pkt-gen NIC デバイスドライバ VALE ユーザー空間 カーネル ホスト 仮想マシン pkt-gen ユーザー空間 カーネル 仮想マシン Virtual Port (netmap API) Virtual Port (netmap API) ptnetmap (pt: passthrough): ホストが作成した仮想 (netmap) ポートへ、仮想マシン内のアプリが直接アクセスできるようにする netmap ptnetmap バックエンド ptnetmap バックエンド netmap
  393. 仮想マシン通信の⾼速化 • パケット I/O フレームワークを使った仮想スイッチを仮想マシ ン通信基盤へ適⽤ • ClickOS (NSDI 2014)

    • NetVM (NSDI 2014) • ptnetmap (ANCS 2015, LANMAN 2016) • HyperNF (SoCC 2017) • ELISA (ASPLOS 2023) 474 0 4 8 12 16 20 24 1 2 4 8 16 32 64 128 256 512 1024 Throughput [Mpps] TX Batch [pkts] Guest to Host Host to Guest Guest to Guest Host to Host Stefano Garzarella, Giuseppe Lettieri, and Luigi Rizzo. 2015. Virtual Device Passthrough for High Speed Vm Networking. In 2015 ACM/IEEE Symposium on Architectures for Networking and Communications Systems (ANCS), 99-110.(https://doi.org/10.1109/ANCS.2015.7110124)
  394. 仮想マシン通信の⾼速化 • パケット I/O フレームワークを使った仮想スイッチを仮想マシ ン通信基盤へ適⽤ • ClickOS (NSDI 2014)

    • NetVM (NSDI 2014) • ptnetmap (ANCS 2015, LANMAN 2016) • HyperNF (SoCC 2017) • ELISA (ASPLOS 2023) 475 0 4 8 12 16 20 24 1 2 4 8 16 32 64 128 256 512 1024 Throughput [Mpps] TX Batch [pkts] Guest to Host Host to Guest Guest to Guest Host to Host 24 Mpps Stefano Garzarella, Giuseppe Lettieri, and Luigi Rizzo. 2015. Virtual Device Passthrough for High Speed Vm Networking. In 2015 ACM/IEEE Symposium on Architectures for Networking and Communications Systems (ANCS), 99-110.(https://doi.org/10.1109/ANCS.2015.7110124)
  395. 仮想マシン通信の⾼速化 • パケット I/O フレームワークを使った仮想スイッチを仮想マシ ン通信基盤へ適⽤ • ClickOS (NSDI 2014)

    • NetVM (NSDI 2014) • ptnetmap (ANCS 2015, LANMAN 2016) • HyperNF (SoCC 2017) • ELISA (ASPLOS 2023) 476 0 4 8 12 16 20 24 1 2 4 8 16 32 64 128 256 512 1024 Throughput [Mpps] TX Batch [pkts] Guest to Host Host to Guest Guest to Guest Host to Host Guest が送信側の時が速い Stefano Garzarella, Giuseppe Lettieri, and Luigi Rizzo. 2015. Virtual Device Passthrough for High Speed Vm Networking. In 2015 ACM/IEEE Symposium on Architectures for Networking and Communications Systems (ANCS), 99-110.(https://doi.org/10.1109/ANCS.2015.7110124)
  396. 仮想マシン通信の⾼速化 • 仮想スイッチへパケット I/O フレームワークを適⽤ • VALE (CoNEXT 2012) •

    CuckooSwitch (CoNEXT 2013) • mSwitch (SOSR 2015) 477 pkt-gen NIC デバイスドライバ VALE ユーザー空間 カーネル ホスト 仮想マシン pkt-gen ユーザー空間 カーネル 仮想マシン Virtual Port (netmap API) Virtual Port (netmap API) Guest to Guest netmap netmap ptnetmap バックエンド ptnetmap バックエンド
  397. • 仮想スイッチへパケット I/O フレームワークを適⽤ • VALE (CoNEXT 2012) • CuckooSwitch

    (CoNEXT 2013) • mSwitch (SOSR 2015) 仮想マシン通信の⾼速化 478 pkt-gen NIC デバイスドライバ VALE ユーザー空間 カーネル ホスト 仮想マシン pkt-gen ホスト・ユーザー空間 プロセス Virtual Port (netmap API) Virtual Port (netmap API) Guest to Host netmap ptnetmap バックエンド
  398. • 仮想スイッチへパケット I/O フレームワークを適⽤ • VALE (CoNEXT 2012) • CuckooSwitch

    (CoNEXT 2013) • mSwitch (SOSR 2015) 仮想マシン通信の⾼速化 479 pkt-gen NIC デバイスドライバ VALE ユーザー空間 カーネル ホスト 仮想マシン pkt-gen ホスト・ユーザー空間 プロセス Virtual Port (netmap API) Virtual Port (netmap API) Guest to Host netmap ptnetmap バックエンド
  399. • 仮想スイッチへパケット I/O フレームワークを適⽤ • VALE (CoNEXT 2012) • CuckooSwitch

    (CoNEXT 2013) • mSwitch (SOSR 2015) 仮想マシン通信の⾼速化 480 pkt-gen NIC デバイスドライバ VALE ユーザー空間 カーネル ホスト 仮想マシン pkt-gen ホスト・ユーザー空間 プロセス Virtual Port (netmap API) Virtual Port (netmap API) Guest to Host netmap ptnetmap バックエンド QEMU/KVM では vCPU は pthread として実装される
  400. • 仮想スイッチへパケット I/O フレームワークを適⽤ • VALE (CoNEXT 2012) • CuckooSwitch

    (CoNEXT 2013) • mSwitch (SOSR 2015) 仮想マシン通信の⾼速化 481 pkt-gen NIC デバイスドライバ VALE ユーザー空間 カーネル ホスト 仮想マシン pkt-gen ホスト・ユーザー空間 プロセス Virtual Port (netmap API) Virtual Port (netmap API) Guest to Host netmap ptnetmap バックエンド QEMU/KVM では vCPU は pthread として実装される ptnetmap のバックエンドは ホスト内でカーネルスレッドを作成し VALE の処理を実⾏
  401. • 仮想スイッチへパケット I/O フレームワークを適⽤ • VALE (CoNEXT 2012) • CuckooSwitch

    (CoNEXT 2013) • mSwitch (SOSR 2015) 仮想マシン通信の⾼速化 482 pkt-gen NIC デバイスドライバ VALE ユーザー空間 カーネル ホスト 仮想マシン pkt-gen ホスト・ユーザー空間 プロセス Virtual Port (netmap API) Virtual Port (netmap API) Guest to Host netmap ptnetmap バックエンド QEMU/KVM では vCPU は pthread として実装される ptnetmap のバックエンドは ホスト内でカーネルスレッドを作成し VALE の処理を実⾏ 時間 vCPU pthread (pkt-gen)
  402. • 仮想スイッチへパケット I/O フレームワークを適⽤ • VALE (CoNEXT 2012) • CuckooSwitch

    (CoNEXT 2013) • mSwitch (SOSR 2015) 仮想マシン通信の⾼速化 483 pkt-gen NIC デバイスドライバ VALE ユーザー空間 カーネル ホスト 仮想マシン pkt-gen ホスト・ユーザー空間 プロセス Virtual Port (netmap API) Virtual Port (netmap API) Guest to Host netmap ptnetmap バックエンド QEMU/KVM では vCPU は pthread として実装される ptnetmap のバックエンドは ホスト内でカーネルスレッドを作成し VALE の処理を実⾏ 時間 vCPU pthread (pkt-gen) pthetmap バックエンド カーネル スレッド パケット送信リクエスト
  403. • 仮想スイッチへパケット I/O フレームワークを適⽤ • VALE (CoNEXT 2012) • CuckooSwitch

    (CoNEXT 2013) • mSwitch (SOSR 2015) 仮想マシン通信の⾼速化 484 pkt-gen NIC デバイスドライバ VALE ユーザー空間 カーネル ホスト 仮想マシン pkt-gen ホスト・ユーザー空間 プロセス Virtual Port (netmap API) Virtual Port (netmap API) Guest to Host netmap ptnetmap バックエンド QEMU/KVM では vCPU は pthread として実装される ptnetmap のバックエンドは ホスト内でカーネルスレッドを作成し VALE の処理を実⾏ 時間 vCPU pthread (pkt-gen) pthetmap バックエンド カーネル スレッド vCPU pthread (pkt-gen) VALE を実⾏
  404. • 仮想スイッチへパケット I/O フレームワークを適⽤ • VALE (CoNEXT 2012) • CuckooSwitch

    (CoNEXT 2013) • mSwitch (SOSR 2015) 仮想マシン通信の⾼速化 485 pkt-gen NIC デバイスドライバ VALE ユーザー空間 カーネル ホスト 仮想マシン pkt-gen ホスト・ユーザー空間 プロセス Virtual Port (netmap API) Virtual Port (netmap API) Guest to Host netmap ptnetmap バックエンド QEMU/KVM では vCPU は pthread として実装される ptnetmap のバックエンドは ホスト内でカーネルスレッドを作成し VALE の処理を実⾏ 時間 vCPU pthread (pkt-gen) pthetmap バックエンド カーネル スレッド vCPU pthread (pkt-gen) VALE を実⾏ バックエンドのスレッドが 転送処理をしている間も vCPU(アプリ)スレッドが動ける
  405. • 仮想スイッチへパケット I/O フレームワークを適⽤ • VALE (CoNEXT 2012) • CuckooSwitch

    (CoNEXT 2013) • mSwitch (SOSR 2015) 仮想マシン通信の⾼速化 486 pkt-gen NIC デバイスドライバ VALE ユーザー空間 カーネル ホスト 仮想マシン pkt-gen ホスト・ユーザー空間 プロセス Virtual Port (netmap API) Virtual Port (netmap API) Guest to Host netmap ptnetmap バックエンド QEMU/KVM では vCPU は pthread として実装される ptnetmap のバックエンドは ホスト内でカーネルスレッドを作成し VALE の処理を実⾏ 時間 vCPU pthread (pkt-gen) pthetmap バックエンド カーネル スレッド vCPU pthread (pkt-gen) VALE を実⾏ バックエンドのスレッドが 転送処理をしている間も vCPU(アプリ)スレッドが動ける バックエンドのカーネルスレッドのおかげで pkt-gen のために最⼤2CPUコア同時に動く
  406. • 仮想スイッチへパケット I/O フレームワークを適⽤ • VALE (CoNEXT 2012) • CuckooSwitch

    (CoNEXT 2013) • mSwitch (SOSR 2015) 仮想マシン通信の⾼速化 487 pkt-gen NIC デバイスドライバ VALE ユーザー空間 カーネル ホスト 仮想マシン pkt-gen ホスト・ユーザー空間 プロセス Virtual Port (netmap API) Virtual Port (netmap API) Guest to Host netmap ptnetmap バックエンド
  407. • 仮想スイッチへパケット I/O フレームワークを適⽤ • VALE (CoNEXT 2012) • CuckooSwitch

    (CoNEXT 2013) • mSwitch (SOSR 2015) 仮想マシン通信の⾼速化 488 pkt-gen NIC デバイスドライバ VALE ユーザー空間 カーネル ホスト 仮想マシン pkt-gen ホスト・ユーザー空間 プロセス Virtual Port (netmap API) Virtual Port (netmap API) Guest to Host netmap ptnetmap バックエンド VALE の通常の仮想ポートの場合 バックエンドのスレッドがない 時間 ホスト ユーザー 空間 プロセス (pkt-gen) 通常の(ホストの)ユーザー空間プロセスが パケットを送信する場合
  408. • 仮想スイッチへパケット I/O フレームワークを適⽤ • VALE (CoNEXT 2012) • CuckooSwitch

    (CoNEXT 2013) • mSwitch (SOSR 2015) 仮想マシン通信の⾼速化 489 pkt-gen NIC デバイスドライバ VALE ユーザー空間 カーネル ホスト 仮想マシン pkt-gen ホスト・ユーザー空間 プロセス Virtual Port (netmap API) Virtual Port (netmap API) Guest to Host netmap ptnetmap バックエンド VALE の通常の仮想ポートの場合 バックエンドのスレッドがない 時間 ホスト ユーザー 空間 プロセス (pkt-gen) 通常の(ホストの)ユーザー空間プロセスが パケットを送信する場合 システムコール システムコール
  409. • 仮想スイッチへパケット I/O フレームワークを適⽤ • VALE (CoNEXT 2012) • CuckooSwitch

    (CoNEXT 2013) • mSwitch (SOSR 2015) 仮想マシン通信の⾼速化 490 pkt-gen NIC デバイスドライバ VALE ユーザー空間 カーネル ホスト 仮想マシン pkt-gen ホスト・ユーザー空間 プロセス Virtual Port (netmap API) Virtual Port (netmap API) Guest to Host netmap ptnetmap バックエンド VALE の通常の仮想ポートの場合 バックエンドのスレッドがない 時間 ホスト ユーザー 空間 プロセス (pkt-gen) 通常の(ホストの)ユーザー空間プロセスが パケットを送信する場合 カーネル (システム コール) VALEを実⾏
  410. • 仮想スイッチへパケット I/O フレームワークを適⽤ • VALE (CoNEXT 2012) • CuckooSwitch

    (CoNEXT 2013) • mSwitch (SOSR 2015) 仮想マシン通信の⾼速化 491 pkt-gen NIC デバイスドライバ VALE ユーザー空間 カーネル ホスト 仮想マシン pkt-gen ホスト・ユーザー空間 プロセス Virtual Port (netmap API) Virtual Port (netmap API) Guest to Host netmap ptnetmap バックエンド VALE の通常の仮想ポートの場合 バックエンドのスレッドがない 時間 ホスト ユーザー 空間 プロセス (pkt-gen) 通常の(ホストの)ユーザー空間プロセスが パケットを送信する場合 カーネル (システム コール) VALEを実⾏ ホスト ユーザー 空間 プロセス (pkt-gen) ユーザー空間へリターン
  411. • 仮想スイッチへパケット I/O フレームワークを適⽤ • VALE (CoNEXT 2012) • CuckooSwitch

    (CoNEXT 2013) • mSwitch (SOSR 2015) 仮想マシン通信の⾼速化 492 pkt-gen NIC デバイスドライバ VALE ユーザー空間 カーネル ホスト 仮想マシン pkt-gen ホスト・ユーザー空間 プロセス Virtual Port (netmap API) Virtual Port (netmap API) Guest to Host netmap ptnetmap バックエンド VALE の通常の仮想ポートの場合 バックエンドのスレッドがない 時間 ホスト ユーザー 空間 プロセス (pkt-gen) 通常の(ホストの)ユーザー空間プロセスが パケットを送信する場合 カーネル (システム コール) VALEを実⾏ ホスト ユーザー 空間 プロセス (pkt-gen) ユーザー空間へリターン pkt-gen と VALE が同じ CPU コアで実⾏される
  412. • 仮想スイッチへパケット I/O フレームワークを適⽤ • VALE (CoNEXT 2012) • CuckooSwitch

    (CoNEXT 2013) • mSwitch (SOSR 2015) 仮想マシン通信の⾼速化 493 pkt-gen NIC デバイスドライバ VALE ユーザー空間 カーネル ホスト 仮想マシン pkt-gen ホスト・ユーザー空間 プロセス Virtual Port (netmap API) Virtual Port (netmap API) Guest to Host netmap ptnetmap バックエンド VALE の通常の仮想ポートの場合 バックエンドのスレッドがない 時間 ホスト ユーザー 空間 プロセス (pkt-gen) 通常の(ホストの)ユーザー空間プロセスが パケットを送信する場合 カーネル (システム コール) VALEを実⾏ ホスト ユーザー 空間 プロセス (pkt-gen) ユーザー空間へリターン pkt-gen と VALE が同じ CPU コアで実⾏される:pkt-gen のために最⼤1CPUコアが同時に動く
  413. • 仮想スイッチへパケット I/O フレームワークを適⽤ • VALE (CoNEXT 2012) • CuckooSwitch

    (CoNEXT 2013) • mSwitch (SOSR 2015) 仮想マシン通信の⾼速化 494 pkt-gen NIC デバイスドライバ VALE ユーザー空間 カーネル ホスト 仮想マシン pkt-gen ホスト・ユーザー空間 プロセス Virtual Port (netmap API) Virtual Port (netmap API) Guest to Host netmap ptnetmap バックエンド VALE の通常の仮想ポートの場合 バックエンドのスレッドがない 時間 ホスト ユーザー 空間 プロセス (pkt-gen) カーネル (システム コール) VALEを実⾏ ホスト ユーザー 空間 プロセス (pkt-gen) vCPU pthread (pkt-gen) pthetmap バックエンド カーネル スレッド vCPU pthread (pkt-gen) ptnetmap の場合
  414. • 仮想スイッチへパケット I/O フレームワークを適⽤ • VALE (CoNEXT 2012) • CuckooSwitch

    (CoNEXT 2013) • mSwitch (SOSR 2015) 仮想マシン通信の⾼速化 495 pkt-gen NIC デバイスドライバ VALE ユーザー空間 カーネル ホスト 仮想マシン pkt-gen ホスト・ユーザー空間 プロセス Virtual Port (netmap API) Virtual Port (netmap API) Guest to Host netmap ptnetmap バックエンド VALE の通常の仮想ポートの場合 バックエンドのスレッドがない 時間 ホスト ユーザー 空間 プロセス (pkt-gen) カーネル (システム コール) VALEを実⾏ ホスト ユーザー 空間 プロセス (pkt-gen) vCPU pthread (pkt-gen) pthetmap バックエンド カーネル スレッド vCPU pthread (pkt-gen) ptnetmap の場合 最⼤2CPUコアを 同時に利⽤できるから速い
  415. • 仮想スイッチへパケット I/O フレームワークを適⽤ • VALE (CoNEXT 2012) • CuckooSwitch

    (CoNEXT 2013) • mSwitch (SOSR 2015) 仮想マシン通信の⾼速化 496 pkt-gen NIC デバイスドライバ VALE ユーザー空間 カーネル ホスト 仮想マシン pkt-gen ホスト・ユーザー空間 プロセス Virtual Port (netmap API) Virtual Port (netmap API) Guest to Host netmap ptnetmap バックエンド VALE の通常の仮想ポートの場合 バックエンドのスレッドがない 時間 ホスト ユーザー 空間 プロセス (pkt-gen) カーネル (システム コール) VALEを実⾏ ホスト ユーザー 空間 プロセス (pkt-gen) vCPU pthread (pkt-gen) pthetmap バックエンド カーネル スレッド vCPU pthread (pkt-gen) ptnetmap の場合 0 4 8 12 16 20 24 1 2 4 8 16 32 64 128 256 512 1024 Throughput [Mpps] TX Batch [pkts] Guest to Host Host to Guest Guest to Guest Host to Host Figure 6: Throughput across a VALE switch, w di↵erent placements of the source and sink, and Stefano Garzarella, Giuseppe Lettieri, and Luigi Rizzo. 2015. Virtual Device Passthrough for High Speed Vm Networking. In 2015 ACM/IEEE Symposium on Architectures for Networking and Communications Systems (ANCS), 99-110.(https://doi.org/10.1109/ANCS.2015.7110124)
  416. 仮想マシン通信の⾼速化 • パケット I/O フレームワークを使った仮想スイッチを仮想マシ ン通信基盤へ適⽤ • ClickOS (NSDI 2014)

    • NetVM (NSDI 2014) • ptnetmap (ANCS 2015, LANMAN 2016) • HyperNF (SoCC 2017) • ELISA (ASPLOS 2023) 498 Xen に netmap/VALE を適⽤ QEMU/KVM に DPDK を適⽤ Xen に netmap/VALE を適⽤
  417. 仮想マシン通信の⾼速化 • パケット I/O フレームワークを使った仮想スイッチを仮想マシ ン通信基盤へ適⽤ • ClickOS (NSDI 2014)

    • NetVM (NSDI 2014) • ptnetmap (ANCS 2015, LANMAN 2016) • HyperNF (SoCC 2017) • ELISA (ASPLOS 2023) 499 Xen に netmap/VALE を適⽤ QEMU/KVM に DPDK を適⽤ Xen に netmap/VALE を適⽤ 実⾏のモデルを改善
  418. 仮想マシン通信の⾼速化 • パケット I/O フレームワークを使った仮想スイッチを仮想マシ ン通信基盤へ適⽤ • ClickOS (NSDI 2014)

    • NetVM (NSDI 2014) • ptnetmap (ANCS 2015, LANMAN 2016) • HyperNF (SoCC 2017) • ELISA (ASPLOS 2023) 500 Xen に netmap/VALE を適⽤ QEMU/KVM に DPDK を適⽤ Xen に netmap/VALE を適⽤ 実⾏のモデルを改善 時間 バックエンド カーネル スレッド vCPU thread vCPU thread パケット送信 リクエスト
  419. 仮想マシン通信の⾼速化 • パケット I/O フレームワークを使った仮想スイッチを仮想マシ ン通信基盤へ適⽤ • ClickOS (NSDI 2014)

    • NetVM (NSDI 2014) • ptnetmap (ANCS 2015, LANMAN 2016) • HyperNF (SoCC 2017) • ELISA (ASPLOS 2023) 501 Xen に netmap/VALE を適⽤ QEMU/KVM に DPDK を適⽤ Xen に netmap/VALE を適⽤ 実⾏のモデルを改善 時間 バックエンド カーネル スレッド vCPU thread vCPU thread パケット送信 リクエスト 主張:vCPU スレッドと仮想スイッチを実⾏する バックエンドのスレッドを分けない⽅が良い
  420. 仮想マシン通信の⾼速化 • パケット I/O フレームワークを使った仮想スイッチを仮想マシ ン通信基盤へ適⽤ • ClickOS (NSDI 2014)

    • NetVM (NSDI 2014) • ptnetmap (ANCS 2015, LANMAN 2016) • HyperNF (SoCC 2017) • ELISA (ASPLOS 2023) 502 Xen に netmap/VALE を適⽤ QEMU/KVM に DPDK を適⽤ Xen に netmap/VALE を適⽤ 実⾏のモデルを改善 主張:vCPU スレッドと仮想スイッチを実⾏する バックエンドのスレッドを分けない⽅が良い
  421. 仮想マシン通信の⾼速化 • パケット I/O フレームワークを使った仮想スイッチを仮想マシ ン通信基盤へ適⽤ • ClickOS (NSDI 2014)

    • NetVM (NSDI 2014) • ptnetmap (ANCS 2015, LANMAN 2016) • HyperNF (SoCC 2017) • ELISA (ASPLOS 2023) 503 Xen に netmap/VALE を適⽤ QEMU/KVM に DPDK を適⽤ Xen に netmap/VALE を適⽤ 実⾏のモデルを改善 主張:vCPU スレッドと仮想スイッチを実⾏する バックエンドのスレッドを分けない⽅が良い CPU 時間 100 % CPU 時間 100 %
  422. 仮想マシン通信の⾼速化 • パケット I/O フレームワークを使った仮想スイッチを仮想マシ ン通信基盤へ適⽤ • ClickOS (NSDI 2014)

    • NetVM (NSDI 2014) • ptnetmap (ANCS 2015, LANMAN 2016) • HyperNF (SoCC 2017) • ELISA (ASPLOS 2023) 504 Xen に netmap/VALE を適⽤ QEMU/KVM に DPDK を適⽤ Xen に netmap/VALE を適⽤ 実⾏のモデルを改善 主張:vCPU スレッドと仮想スイッチを実⾏する バックエンドのスレッドを分けない⽅が良い
  423. 仮想マシン通信の⾼速化 • パケット I/O フレームワークを使った仮想スイッチを仮想マシ ン通信基盤へ適⽤ • ClickOS (NSDI 2014)

    • NetVM (NSDI 2014) • ptnetmap (ANCS 2015, LANMAN 2016) • HyperNF (SoCC 2017) • ELISA (ASPLOS 2023) 505 Xen に netmap/VALE を適⽤ QEMU/KVM に DPDK を適⽤ Xen に netmap/VALE を適⽤ 実⾏のモデルを改善 主張:vCPU スレッドと仮想スイッチを実⾏する バックエンドのスレッドを分けない⽅が良い カーネル スレッド vCPU thread 理想的には性能のために CPU は最⼤限利⽤できるべき 理想
  424. 仮想マシン通信の⾼速化 • パケット I/O フレームワークを使った仮想スイッチを仮想マシ ン通信基盤へ適⽤ • ClickOS (NSDI 2014)

    • NetVM (NSDI 2014) • ptnetmap (ANCS 2015, LANMAN 2016) • HyperNF (SoCC 2017) • ELISA (ASPLOS 2023) 506 Xen に netmap/VALE を適⽤ QEMU/KVM に DPDK を適⽤ Xen に netmap/VALE を適⽤ 実⾏のモデルを改善 主張:vCPU スレッドと仮想スイッチを実⾏する バックエンドのスレッドを分けない⽅が良い カーネル スレッド vCPU thread 実際は、vCPU かバックエンドのスレッドどちらかが常にボトルネックになる (ワークロード依存) 実際 vCPU スレッドがボトルネック
  425. 仮想マシン通信の⾼速化 • パケット I/O フレームワークを使った仮想スイッチを仮想マシ ン通信基盤へ適⽤ • ClickOS (NSDI 2014)

    • NetVM (NSDI 2014) • ptnetmap (ANCS 2015, LANMAN 2016) • HyperNF (SoCC 2017) • ELISA (ASPLOS 2023) 507 Xen に netmap/VALE を適⽤ QEMU/KVM に DPDK を適⽤ Xen に netmap/VALE を適⽤ 実⾏のモデルを改善 主張:vCPU スレッドと仮想スイッチを実⾏する バックエンドのスレッドを分けない⽅が良い カーネル スレッド vCPU thread 実際は、vCPU かバックエンドのスレッドどちらかが常にボトルネックになる (ワークロード依存) 実際 vCPU スレッドがボトルネック 利⽤されない CPU 時間
  426. 仮想マシン通信の⾼速化 • パケット I/O フレームワークを使った仮想スイッチを仮想マシ ン通信基盤へ適⽤ • ClickOS (NSDI 2014)

    • NetVM (NSDI 2014) • ptnetmap (ANCS 2015, LANMAN 2016) • HyperNF (SoCC 2017) • ELISA (ASPLOS 2023) 508 Xen に netmap/VALE を適⽤ QEMU/KVM に DPDK を適⽤ Xen に netmap/VALE を適⽤ 実⾏のモデルを改善 主張:vCPU スレッドと仮想スイッチを実⾏する バックエンドのスレッドを分けない⽅が良い カーネル スレッド vCPU thread 実際は、vCPU かバックエンドのスレッドどちらかが常にボトルネックになる (ワークロード依存) 実際 バックエンドのカーネルスレッドがボトルネック 利⽤されない CPU 時間
  427. 仮想マシン通信の⾼速化 • パケット I/O フレームワークを使った仮想スイッチを仮想マシ ン通信基盤へ適⽤ • ClickOS (NSDI 2014)

    • NetVM (NSDI 2014) • ptnetmap (ANCS 2015, LANMAN 2016) • HyperNF (SoCC 2017) • ELISA (ASPLOS 2023) 509 Xen に netmap/VALE を適⽤ QEMU/KVM に DPDK を適⽤ Xen に netmap/VALE を適⽤ 実⾏のモデルを改善 主張:vCPU スレッドと仮想スイッチを実⾏する バックエンドのスレッドを分けない⽅が良い カーネル スレッド vCPU thread 解決策:vCPU とバックエンドのカーネルスレッドは同じ CPU コアの上で動かす カーネル スレッド vCPU thread
  428. 仮想マシン通信の⾼速化 • パケット I/O フレームワークを使った仮想スイッチを仮想マシ ン通信基盤へ適⽤ • ClickOS (NSDI 2014)

    • NetVM (NSDI 2014) • ptnetmap (ANCS 2015, LANMAN 2016) • HyperNF (SoCC 2017) • ELISA (ASPLOS 2023) 510 Xen に netmap/VALE を適⽤ QEMU/KVM に DPDK を適⽤ Xen に netmap/VALE を適⽤ 実⾏のモデルを改善 主張:vCPU スレッドと仮想スイッチを実⾏する バックエンドのスレッドを分けない⽅が良い カーネル スレッド vCPU thread 解決策:vCPU とバックエンドのカーネルスレッドは同じ CPU コアの上で動かす カーネル スレッド vCPU thread 利点:ワークロードが変化しても、CPU の vCPU とバックエンドへの割り当てが常に理想的
  429. 仮想マシン通信の⾼速化 • パケット I/O フレームワークを使った仮想スイッチを仮想マシ ン通信基盤へ適⽤ • ClickOS (NSDI 2014)

    • NetVM (NSDI 2014) • ptnetmap (ANCS 2015, LANMAN 2016) • HyperNF (SoCC 2017) • ELISA (ASPLOS 2023) 511 Xen に netmap/VALE を適⽤ QEMU/KVM に DPDK を適⽤ Xen に netmap/VALE を適⽤ 実⾏のモデルを改善 主張:vCPU スレッドと仮想スイッチを実⾏する バックエンドのスレッドを分けない⽅が良い カーネル スレッド vCPU thread 解決策:vCPU とバックエンドのカーネルスレッドは同じ CPU コアの上で動かす カーネル スレッド vCPU thread 利点:ワークロードが変化しても、CPU の vCPU とバックエンドへの割り当てが常に理想的 計算が多く、I/O が少ない場合
  430. 仮想マシン通信の⾼速化 • パケット I/O フレームワークを使った仮想スイッチを仮想マシ ン通信基盤へ適⽤ • ClickOS (NSDI 2014)

    • NetVM (NSDI 2014) • ptnetmap (ANCS 2015, LANMAN 2016) • HyperNF (SoCC 2017) • ELISA (ASPLOS 2023) 512 Xen に netmap/VALE を適⽤ QEMU/KVM に DPDK を適⽤ Xen に netmap/VALE を適⽤ 実⾏のモデルを改善 主張:vCPU スレッドと仮想スイッチを実⾏する バックエンドのスレッドを分けない⽅が良い カーネル スレッド vCPU thread 解決策:vCPU とバックエンドのカーネルスレッドは同じ CPU コアの上で動かす カーネル スレッド vCPU thread 利点:ワークロードが変化しても、CPU の vCPU とバックエンドへの割り当てが常に理想的 計算が少なく、I/O が多い場合:バックエンドに利⽤されない CPU 時間を vCPU が使える
  431. 仮想マシン通信の⾼速化 • パケット I/O フレームワークを使った仮想スイッチを仮想マシ ン通信基盤へ適⽤ • ClickOS (NSDI 2014)

    • NetVM (NSDI 2014) • ptnetmap (ANCS 2015, LANMAN 2016) • HyperNF (SoCC 2017) • ELISA (ASPLOS 2023) 513 Xen に netmap/VALE を適⽤ QEMU/KVM に DPDK を適⽤ Xen に netmap/VALE を適⽤ 実⾏のモデルを改善 主張:vCPU スレッドと仮想スイッチを実⾏する バックエンドのスレッドを分けない⽅が良い カーネル スレッド vCPU thread 解決策:vCPU とバックエンドのカーネルスレッドは同じ CPU コアの上で動かす カーネル スレッド vCPU thread 利点:ワークロードが変化しても、CPU の vCPU とバックエンドへの割り当てが常に理想的 計算が多く、I/O が少ない場合:vCPU に利⽤されない CPU 時間をバックエンドが使える
  432. 仮想マシン通信の⾼速化 • パケット I/O フレームワークを使った仮想スイッチを仮想マシ ン通信基盤へ適⽤ • ClickOS (NSDI 2014)

    • NetVM (NSDI 2014) • ptnetmap (ANCS 2015, LANMAN 2016) • HyperNF (SoCC 2017) • ELISA (ASPLOS 2023) 514 Xen に netmap/VALE を適⽤ QEMU/KVM に DPDK を適⽤ Xen に netmap/VALE を適⽤ 実⾏のモデルを改善 主張:vCPU スレッドと仮想スイッチを実⾏する バックエンドのスレッドを分けない⽅が良い カーネル スレッド vCPU thread 解決策:vCPU とバックエンドのカーネルスレッドは同じ CPU コアの上で動かす カーネル スレッド vCPU thread 利点:ワークロードが変化しても、CPU の vCPU とバックエンドへの割り当てが常に理想的 計算が多く、I/O が少ない場合:vCPU に利⽤されない CPU 時間をバックエンドが使える 時間 vCPU thread バックエンド カーネル スレッド vCPU thread バックエンド カーネル スレッド vCPU thread バックエンド カーネル スレッド vCPU thread バックエンド カーネル スレッド この解決策の課題
  433. 仮想マシン通信の⾼速化 • パケット I/O フレームワークを使った仮想スイッチを仮想マシ ン通信基盤へ適⽤ • ClickOS (NSDI 2014)

    • NetVM (NSDI 2014) • ptnetmap (ANCS 2015, LANMAN 2016) • HyperNF (SoCC 2017) • ELISA (ASPLOS 2023) 515 Xen に netmap/VALE を適⽤ QEMU/KVM に DPDK を適⽤ Xen に netmap/VALE を適⽤ 実⾏のモデルを改善 主張:vCPU スレッドと仮想スイッチを実⾏する バックエンドのスレッドを分けない⽅が良い カーネル スレッド vCPU thread 解決策:vCPU とバックエンドのカーネルスレッドは同じ CPU コアの上で動かす カーネル スレッド vCPU thread 利点:ワークロードが変化しても、CPU の vCPU とバックエンドへの割り当てが常に理想的 計算が多く、I/O が少ない場合:vCPU に利⽤されない CPU 時間をバックエンドが使える 時間 vCPU thread バックエンド カーネル スレッド vCPU thread バックエンド カーネル スレッド vCPU thread バックエンド カーネル スレッド vCPU thread バックエンド カーネル スレッド この解決策の課題 schedule スレッド切り替えのための スケジューリングコスト schedule schedule schedule schedule schedule
  434. 仮想マシン通信の⾼速化 • パケット I/O フレームワークを使った仮想スイッチを仮想マシ ン通信基盤へ適⽤ • ClickOS (NSDI 2014)

    • NetVM (NSDI 2014) • ptnetmap (ANCS 2015, LANMAN 2016) • HyperNF (SoCC 2017) • ELISA (ASPLOS 2023) 516 Xen に netmap/VALE を適⽤ QEMU/KVM に DPDK を適⽤ Xen に netmap/VALE を適⽤ 実⾏のモデルを改善 主張:vCPU スレッドと仮想スイッチを実⾏する バックエンドのスレッドを分けない⽅が良い カーネル スレッド vCPU thread 解決策:vCPU とバックエンドのカーネルスレッドは同じ CPU コアの上で動かす カーネル スレッド vCPU thread 利点:ワークロードが変化しても、CPU の vCPU とバックエンドへの割り当てが常に理想的 計算が多く、I/O が少ない場合:vCPU に利⽤されない CPU 時間をバックエンドが使える 時間 vCPU Thread ハイパー コール (I/O) 提案⼿法 I/O をハイパーコール内で実⾏ ハイパー コール (I/O) vCPU Thread ハイパー コール (I/O) ハイパー コール (I/O)
  435. 仮想マシン通信の⾼速化 • パケット I/O フレームワークを使った仮想スイッチを仮想マシ ン通信基盤へ適⽤ • ClickOS (NSDI 2014)

    • NetVM (NSDI 2014) • ptnetmap (ANCS 2015, LANMAN 2016) • HyperNF (SoCC 2017) • ELISA (ASPLOS 2023) 517 Xen に netmap/VALE を適⽤ QEMU/KVM に DPDK を適⽤ Xen に netmap/VALE を適⽤ 実⾏のモデルを改善 主張:vCPU スレッドと仮想スイッチを実⾏する バックエンドのスレッドを分けない⽅が良い カーネル スレッド vCPU thread 解決策:vCPU とバックエンドのカーネルスレッドは同じ CPU コアの上で動かす カーネル スレッド vCPU thread 利点:ワークロードが変化しても、CPU の vCPU とバックエンドへの割り当てが常に理想的 計算が多く、I/O が少ない場合:vCPU に利⽤されない CPU 時間をバックエンドが使える 時間 vCPU Thread ハイパー コール (I/O) 提案⼿法 I/O をハイパーコール内で実⾏ ハイパー コール (I/O) vCPU Thread ハイパー コール (I/O) ハイパー コール (I/O) スケジューリングコスト をなくすことができる
  436. 仮想マシン通信の⾼速化 • パケット I/O フレームワークを使った仮想スイッチを仮想マシ ン通信基盤へ適⽤ • ClickOS (NSDI 2014)

    • NetVM (NSDI 2014) • ptnetmap (ANCS 2015, LANMAN 2016) • HyperNF (SoCC 2017) • ELISA (ASPLOS 2023) 518 Xen に netmap/VALE を適⽤ QEMU/KVM に DPDK を適⽤ Xen に netmap/VALE を適⽤ 実⾏のモデルを改善 vCPU Thread ハイパー コール (I/O) ハイパー コール (I/O) vCPU Thread ハイパー コール (I/O) ハイパー コール (I/O) vCPU thread バックエンド カーネル スレッド vCPU thread バックエンド カーネル スレッド vCPU thread バックエンド カーネル スレッド vCPU thread バックエンド カーネル スレッド バックエンド カーネル スレッド vCPU thread vCPU thread 3パターン Split Merge 提案⼿法
  437. 仮想マシン通信の⾼速化 • パケット I/O フレームワークを使った仮想スイッチを仮想マシ ン通信基盤へ適⽤ • ClickOS (NSDI 2014)

    • NetVM (NSDI 2014) • ptnetmap (ANCS 2015, LANMAN 2016) • HyperNF (SoCC 2017) • ELISA (ASPLOS 2023) 519 Xen に netmap/VALE を適⽤ QEMU/KVM に DPDK を適⽤ Xen に netmap/VALE を適⽤ 実⾏のモデルを改善 vCPU Thread ハイパー コール (I/O) ハイパー コール (I/O) vCPU thread バックエンド カーネル スレッド vCPU thread バックエンド カーネル スレッド バックエンド カーネル スレッド vCPU thread vCPU thread 3パターン Split Merge 提案⼿法 実験の設定:Split は 2 CPU で動作するため、vCPU に割り当てる CPU 時間を半分に設定 その他は1 CPU のみ利⽤ 50% 50%
  438. 仮想マシン通信の⾼速化 520 vCPU Thread ハイパー コール (I/O) ハイパー コール (I/O)

    vCPU thread バックエンド カーネル スレッド vCPU thread バックエンド カーネル スレッド バックエンド カーネル スレッド vCPU thread vCPU thread Split Merge 提案⼿法 50% 50% SoCC ’17, September 24–27, 2017, San 0 2 4 6 8 10 12 14 16 64 512 1024 1472 Throughput [Mpps] Packet Size [#] Split Merge HyperNF (a) No NF - virtual ports. VM 間の転送速度 Kenichi Yasukata, Felipe Huici, Vincenzo Maffione, Giuseppe Lettieri, and Michio Honda. 2017. HyperNF: Building a High Performance, High Utilization and Fair NFV Platform. In Proceedings of the 2017 Symposium on Cloud Computing (SoCC ʼ17), 157-169.(https://doi.org/10.1145/3127479.3127489)
  439. 仮想マシン通信の⾼速化 521 vCPU Thread ハイパー コール (I/O) ハイパー コール (I/O)

    vCPU thread バックエンド カーネル スレッド vCPU thread バックエンド カーネル スレッド バックエンド カーネル スレッド vCPU thread vCPU thread Split Merge 提案⼿法 50% 50% SoCC ’17, September 24–27, 2017, San 0 2 4 6 8 10 12 14 16 64 512 1024 1472 Throughput [Mpps] Packet Size [#] Split Merge HyperNF (a) No NF - virtual ports. VM 間の転送速度 schedule schedule schedule vCPU とバックエンドに必要な CPU 時間が同じくらいだと スケジュールのコストが⼩さい Split の⽅が Merge より速い Kenichi Yasukata, Felipe Huici, Vincenzo Maffione, Giuseppe Lettieri, and Michio Honda. 2017. HyperNF: Building a High Performance, High Utilization and Fair NFV Platform. In Proceedings of the 2017 Symposium on Cloud Computing (SoCC ʼ17), 157-169.(https://doi.org/10.1145/3127479.3127489)
  440. 仮想マシン通信の⾼速化 522 vCPU Thread ハイパー コール (I/O) ハイパー コール (I/O)

    vCPU thread バックエンド カーネル スレッド vCPU thread バックエンド カーネル スレッド バックエンド カーネル スレッド vCPU thread vCPU thread Split Merge 提案⼿法 50% 50% schedule schedule schedule vCPU とバックエンドに必要な CPU 時間に偏りがあると スケジュールのコストがあっても Merge の⽅が Split より速い SoCC ’17, September 24–27, 2017, Santa Clara, CA, USA K. Yasukata, F. Huici, V. Ma (a) No NF - virtual ports. (b) Bridge NF - virtual ports. 0 1 2 3 4 5 64 512 1024 1472 Throughput [Mpps] Packet Size [#] (c) Firewall NF - virtual ports. ( ファイアウォールアプリ性能 Kenichi Yasukata, Felipe Huici, Vincenzo Maffione, Giuseppe Lettieri, and Michio Honda. 2017. HyperNF: Building a High Performance, High Utilization and Fair NFV Platform. In Proceedings of the 2017 Symposium on Cloud Computing (SoCC ʼ17), 157-169.(https://doi.org/10.1145/3127479.3127489)
  441. 仮想マシン通信の⾼速化 523 vCPU Thread ハイパー コール (I/O) ハイパー コール (I/O)

    vCPU thread バックエンド カーネル スレッド vCPU thread バックエンド カーネル スレッド バックエンド カーネル スレッド vCPU thread vCPU thread Split Merge 提案⼿法 50% 50% schedule schedule schedule SoCC ’17, September 24–27, 2017, Santa Clara, CA, USA K. Yasukata, F. Huici, V. Ma￿ 0 1 2 3 4 5 64 512 1024 1472 Throughput [Mpps] Packet Size [#] ファイアウォールアプリ性能 SoCC ’17, September 24–27, 2017, Santa 0 2 4 6 8 10 12 14 16 64 512 1024 1472 Throughput [Mpps] Packet Size [#] Split Merge HyperNF (a) No NF - virtual ports. (b VM 間の転送速度 提案⼿法は Merge からスケジュールの コストを削ることで⾼速化 Kenichi Yasukata, Felipe Huici, Vincenzo Maffione, Giuseppe Lettieri, and Michio Honda. 2017. HyperNF: Building a High Performance, High Utilization and Fair NFV Platform. In Proceedings of the 2017 Symposium on Cloud Computing (SoCC ʼ17), 157-169.(https://doi.org/10.1145/3127479.3127489)
  442. 仮想マシン通信の⾼速化 • パケット I/O フレームワークを使った仮想スイッチを仮想マシ ン通信基盤へ適⽤ • ClickOS (NSDI 2014)

    • NetVM (NSDI 2014) • ptnetmap (ANCS 2015, LANMAN 2016) • HyperNF (SoCC 2017) • ELISA (ASPLOS 2023) 524 Xen に netmap/VALE を適⽤ QEMU/KVM に DPDK を適⽤ Xen に netmap/VALE を適⽤ 実⾏のモデルを改善
  443. 仮想マシン通信の⾼速化 • パケット I/O フレームワークを使った仮想スイッチを仮想マシ ン通信基盤へ適⽤ • ClickOS (NSDI 2014)

    • NetVM (NSDI 2014) • ptnetmap (ANCS 2015, LANMAN 2016) • HyperNF (SoCC 2017) • ELISA (ASPLOS 2023) 525 Xen に netmap/VALE を適⽤ QEMU/KVM に DPDK を適⽤ Xen に netmap/VALE を適⽤ 実⾏のモデルを改善 パイプラインのような処理の場合は、スレッドを分けない⽅が CPU 利⽤効率が良い
  444. 仮想マシン通信の⾼速化 • パケット I/O フレームワークを使った仮想スイッチを仮想マシ ン通信基盤へ適⽤ • ClickOS (NSDI 2014)

    • NetVM (NSDI 2014) • ptnetmap (ANCS 2015, LANMAN 2016) • HyperNF (SoCC 2017) • ELISA (ASPLOS 2023) 527 改善
  445. 仮想マシン通信の⾼速化 • パケット I/O フレームワークを使った仮想スイッチを仮想マシ ン通信基盤へ適⽤ • ClickOS (NSDI 2014)

    • NetVM (NSDI 2014) • ptnetmap (ANCS 2015, LANMAN 2016) • HyperNF (SoCC 2017) • ELISA (ASPLOS 2023) 528 改善 vCPU Thread ハイパー コール (I/O) ハイパー コール (I/O)
  446. 仮想マシン通信の⾼速化 • パケット I/O フレームワークを使った仮想スイッチを仮想マシ ン通信基盤へ適⽤ • ClickOS (NSDI 2014)

    • NetVM (NSDI 2014) • ptnetmap (ANCS 2015, LANMAN 2016) • HyperNF (SoCC 2017) • ELISA (ASPLOS 2023) 529 改善 vCPU Thread ハイパー コール (I/O) ハイパー コール (I/O) VMEXIT VMEXIT 問題:ハイパーコールの呼び出しのたびに vCPU からハイパーバイザーのコンテキストへ exit する必要がある
  447. 仮想マシン通信の⾼速化 • パケット I/O フレームワークを使った仮想スイッチを仮想マシ ン通信基盤へ適⽤ • ClickOS (NSDI 2014)

    • NetVM (NSDI 2014) • ptnetmap (ANCS 2015, LANMAN 2016) • HyperNF (SoCC 2017) • ELISA (ASPLOS 2023) 530 改善 vCPU Thread ハイパー コール (I/O) ハイパー コール (I/O) VMEXIT VMEXIT 問題:ハイパーコールの呼び出しのたびに vCPU からハイパーバイザーのコンテキストへ exit する必要がある モチベーション:vCPU から exit しないで I/O を実⾏できるようにしたい
  448. 仮想マシン通信 • 仮想スイッチへパケット I/O フレームワークを適⽤ • VALE (CoNEXT 2012) •

    CuckooSwitch (CoNEXT 2013) • mSwitch (SOSR 2015) 531 NIC デバイスドライバ TCP/IP スタック アプリケーション NIC デバイスドライバ 仮想スイッチ 仮想 NIC バックエンド ユーザー空間 カーネル ホスト 仮想マシン NIC デバイスドライバ TCP/IP スタック アプリケーション ユーザー空間 カーネル 仮想マシン 仮想 NIC バックエンド ⽐較的⼀般的な構成
  449. 仮想マシン通信 • 仮想スイッチへパケット I/O フレームワークを適⽤ • VALE (CoNEXT 2012) •

    CuckooSwitch (CoNEXT 2013) • mSwitch (SOSR 2015) 532 NIC デバイスドライバ 仮想スイッチ 仮想 NIC バックエンド ホスト NIC デバイスドライバ TCP/IP スタック アプリケーション ユーザー空間 カーネル 仮想マシン 仮想 NIC バックエンド ⽐較的⼀般的な構成 NIC デバイスドライバ TCP/IP スタック アプリケーション ユーザー空間 カーネル 仮想マシン 転送リクエスト
  450. 仮想マシン通信 • 仮想スイッチへパケット I/O フレームワークを適⽤ • VALE (CoNEXT 2012) •

    CuckooSwitch (CoNEXT 2013) • mSwitch (SOSR 2015) 533 NIC デバイスドライバ 仮想スイッチ 仮想 NIC バックエンド ホスト NIC デバイスドライバ TCP/IP スタック アプリケーション ユーザー空間 カーネル 仮想マシン 仮想 NIC バックエンド ⽐較的⼀般的な構成 NIC デバイスドライバ TCP/IP スタック アプリケーション ユーザー空間 カーネル 仮想マシン 転送リクエスト VMEXIT
  451. 仮想マシン通信 • 仮想スイッチへパケット I/O フレームワークを適⽤ • VALE (CoNEXT 2012) •

    CuckooSwitch (CoNEXT 2013) • mSwitch (SOSR 2015) 534 NIC デバイスドライバ TCP/IP スタック アプリケーション ユーザー空間 カーネル 仮想マシン ⽐較的⼀般的な構成 NIC デバイスドライバ TCP/IP スタック アプリケーション ユーザー空間 カーネル 仮想マシン NIC デバイスドライバ 仮想スイッチ 仮想 NIC バックエンド ホスト 仮想 NIC バックエンド
  452. 仮想マシン通信 • 仮想スイッチへパケット I/O フレームワークを適⽤ • VALE (CoNEXT 2012) •

    CuckooSwitch (CoNEXT 2013) • mSwitch (SOSR 2015) 535 NIC デバイスドライバ TCP/IP スタック アプリケーション NIC デバイスドライバ 仮想スイッチ 仮想 NIC バックエンド ユーザー空間 カーネル ホスト 仮想マシン NIC デバイスドライバ TCP/IP スタック アプリケーション ユーザー空間 カーネル 仮想マシン 仮想 NIC バックエンド 提案⼿法:仮想マシンに新しいコンテキストを追加
  453. 仮想マシン通信 • 仮想スイッチへパケット I/O フレームワークを適⽤ • VALE (CoNEXT 2012) •

    CuckooSwitch (CoNEXT 2013) • mSwitch (SOSR 2015) 536 NIC デバイスドライバ TCP/IP スタック アプリケーション ユーザー空間 カーネル ホスト 仮想マシン NIC デバイスドライバ TCP/IP スタック アプリケーション ユーザー空間 カーネル 仮想マシン 提案⼿法:仮想マシンに新しいコンテキストを追加 NIC デバイスドライバ 仮想スイッチ 仮想 NIC バックエンド NIC レジスタ
  454. 仮想マシン通信 • 仮想スイッチへパケット I/O フレームワークを適⽤ • VALE (CoNEXT 2012) •

    CuckooSwitch (CoNEXT 2013) • mSwitch (SOSR 2015) 537 NIC デバイスドライバ TCP/IP スタック アプリケーション ユーザー空間 カーネル ホスト 仮想マシン NIC デバイスドライバ TCP/IP スタック アプリケーション ユーザー空間 カーネル 仮想マシン 提案⼿法:仮想マシンに新しいコンテキストを追加 - これらは仮想マシンコンテキストの⼀部 - ホストと同じく信頼されているドメインとして想定 NIC デバイスドライバ 仮想スイッチ 仮想 NIC バックエンド NIC レジスタ 信頼されている 信頼されている
  455. 仮想マシン通信 • 仮想スイッチへパケット I/O フレームワークを適⽤ • VALE (CoNEXT 2012) •

    CuckooSwitch (CoNEXT 2013) • mSwitch (SOSR 2015) 538 NIC デバイスドライバ TCP/IP スタック アプリケーション NIC デバイスドライバ 仮想スイッチ 仮想 NIC バックエンド ユーザー空間 カーネル ホスト 仮想マシン NIC デバイスドライバ TCP/IP スタック アプリケーション ユーザー空間 カーネル 仮想マシン 提案⼿法:仮想マシンに新しいコンテキストを追加 - これらは仮想マシンコンテキストの⼀部 - ホストと同じく信頼されているドメインとして想定 NIC デバイスドライバ 仮想 NIC バックエンド NIC デバイスドライバ 仮想 NIC バックエンド NIC レジスタ
  456. 仮想マシン通信 • 仮想スイッチへパケット I/O フレームワークを適⽤ • VALE (CoNEXT 2012) •

    CuckooSwitch (CoNEXT 2013) • mSwitch (SOSR 2015) 539 NIC デバイスドライバ TCP/IP スタック アプリケーション NIC デバイスドライバ 仮想スイッチ 仮想 NIC バックエンド ユーザー空間 カーネル 管理⽤仮想マシン(信頼されている) 仮想マシン NIC デバイスドライバ TCP/IP スタック アプリケーション ユーザー空間 カーネル 仮想マシン 提案⼿法:仮想マシンに新しいコンテキストを追加 - これらは仮想マシンコンテキストの⼀部 - ホストと同じく信頼されているドメインとして想定 NIC デバイスドライバ 仮想 NIC バックエンド NIC デバイスドライバ 仮想 NIC バックエンド NIC レジスタ デバイスドライバやバックエンドのプログラムをロード
  457. 仮想マシン通信 • 仮想スイッチへパケット I/O フレームワークを適⽤ • VALE (CoNEXT 2012) •

    CuckooSwitch (CoNEXT 2013) • mSwitch (SOSR 2015) 540 NIC デバイスドライバ TCP/IP スタック アプリケーション NIC デバイスドライバ 仮想スイッチ 仮想 NIC バックエンド ユーザー空間 カーネル 管理⽤仮想マシン(信頼されている) 仮想マシン NIC デバイスドライバ TCP/IP スタック アプリケーション ユーザー空間 カーネル 仮想マシン 提案⼿法:仮想マシンに新しいコンテキストを追加 - これらは仮想マシンコンテキストの⼀部 - ホストと同じく信頼されているドメインとして想定 NIC デバイスドライバ 仮想 NIC バックエンド NIC デバイスドライバ 仮想 NIC バックエンド NIC レジスタ NIC レジスタ 仮想スイッチ NIC レジスタ 仮想スイッチ 仮想マシン間で共有される NIC レジスタや仮想スイッチ関連オブジェクトをマップ
  458. 仮想マシン通信 • 仮想スイッチへパケット I/O フレームワークを適⽤ • VALE (CoNEXT 2012) •

    CuckooSwitch (CoNEXT 2013) • mSwitch (SOSR 2015) 541 NIC デバイスドライバ TCP/IP スタック アプリケーション NIC デバイスドライバ 仮想スイッチ 仮想 NIC バックエンド ユーザー空間 カーネル 管理⽤仮想マシン(信頼されている) 仮想マシン NIC デバイスドライバ TCP/IP スタック アプリケーション ユーザー空間 カーネル 仮想マシン 提案⼿法:仮想マシンに新しいコンテキストを追加 - これらは仮想マシンコンテキストの⼀部 - ホストと同じく信頼されているドメインとして想定 NIC デバイスドライバ 仮想 NIC バックエンド NIC デバイスドライバ 仮想 NIC バックエンド NIC レジスタ NIC レジスタ 仮想スイッチ NIC レジスタ 仮想スイッチ ポイント:コンテキストの移⾏には VMFUNC という CPU 命令を利⽤ VMFUNC
  459. 仮想マシン通信 • 仮想スイッチへパケット I/O フレームワークを適⽤ • VALE (CoNEXT 2012) •

    CuckooSwitch (CoNEXT 2013) • mSwitch (SOSR 2015) 542 NIC デバイスドライバ TCP/IP スタック アプリケーション NIC デバイスドライバ 仮想スイッチ 仮想 NIC バックエンド ユーザー空間 カーネル 管理⽤仮想マシン(信頼されている) 仮想マシン NIC デバイスドライバ TCP/IP スタック アプリケーション ユーザー空間 カーネル 仮想マシン 提案⼿法:仮想マシンに新しいコンテキストを追加 - これらは仮想マシンコンテキストの⼀部 - ホストと同じく信頼されているドメインとして想定 NIC デバイスドライバ 仮想 NIC バックエンド NIC デバイスドライバ 仮想 NIC バックエンド NIC レジスタ NIC レジスタ 仮想スイッチ NIC レジスタ 仮想スイッチ ポイント:コンテキストの移⾏には VMFUNC という CPU 命令を利⽤ VMFUNC VMFUNC は vCPU からの exit を発⽣させない:結果、切り替えが速い
  460. 仮想マシン通信 • 仮想スイッチへパケット I/O フレームワークを適⽤ • VALE (CoNEXT 2012) •

    CuckooSwitch (CoNEXT 2013) • mSwitch (SOSR 2015) 543 NIC デバイスドライバ TCP/IP スタック アプリケーション NIC デバイスドライバ 仮想スイッチ 仮想 NIC バックエンド ユーザー空間 カーネル 管理⽤仮想マシン(信頼されている) 仮想マシン NIC デバイスドライバ TCP/IP スタック アプリケーション ユーザー空間 カーネル 仮想マシン 提案⼿法:仮想マシンに新しいコンテキストを追加 - これらは仮想マシンコンテキストの⼀部 - ホストと同じく信頼されているドメインとして想定 NIC デバイスドライバ 仮想 NIC バックエンド NIC デバイスドライバ 仮想 NIC バックエンド NIC レジスタ NIC レジスタ 仮想スイッチ NIC レジスタ 仮想スイッチ ポイント:コンテキストの移⾏には VMFUNC という CPU 命令を利⽤ VMFUNC VMFUNC は vCPU からの exit を発⽣させない:結果、切り替えが速い *仮想マシンは VMFUNC を通して以外は追加されたコンテキストにアクセスできない
  461. 仮想マシン通信の⾼速化 • パケット I/O フレームワークを使った仮想スイッチを仮想マシ ン通信基盤へ適⽤ • ClickOS (NSDI 2014)

    • NetVM (NSDI 2014) • ptnetmap (ANCS 2015, LANMAN 2016) • HyperNF (SoCC 2017) • ELISA (ASPLOS 2023) 544 改善
  462. 仮想マシン通信の⾼速化 • パケット I/O フレームワークを使った仮想スイッチを仮想マシ ン通信基盤へ適⽤ • ClickOS (NSDI 2014)

    • NetVM (NSDI 2014) • ptnetmap (ANCS 2015, LANMAN 2016) • HyperNF (SoCC 2017) • ELISA (ASPLOS 2023) 545 改善 0 2 4 6 8 10 64 128 256 512 1024 1472 Throughput [Mpps] パケットサイズ VM 間通信速度 既存⼿法 提案⼿法
  463. 仮想マシン通信の⾼速化 • パケット I/O フレームワークを使った仮想スイッチを仮想マシ ン通信基盤へ適⽤ • ClickOS (NSDI 2014)

    • NetVM (NSDI 2014) • ptnetmap (ANCS 2015, LANMAN 2016) • HyperNF (SoCC 2017) • ELISA (ASPLOS 2023) 546 改善 0 2 4 6 8 10 64 128 256 512 1024 1472 Throughput [Mpps] パケットサイズ VM 間通信速度 既存⼿法 提案⼿法 VMEXIT をなくすことによる改善
  464. 仮想マシン通信の⾼速化 • パケット I/O フレームワークを使った仮想スイッチを仮想マシ ン通信基盤へ適⽤ • ClickOS (NSDI 2014)

    • NetVM (NSDI 2014) • ptnetmap (ANCS 2015, LANMAN 2016) • HyperNF (SoCC 2017) • ELISA (ASPLOS 2023) 547 改善 0 2 4 6 8 10 64 128 256 512 1024 1472 Throughput [Mpps] パケットサイズ VM 間通信速度 既存⼿法 提案⼿法 Linux vhost-net はこれくらい
  465. 最近の取り組み:TCP/IP スタック⾃作 • モチベーション • 他のシステムと統合しやすく • マルチコア環境で利⽤できる実装がほしい • +

    性能のボトルネックがどこから来るかに興味がある • まだ実装途中ですがよろしければお試しください • ソースコード:https://github.com/yasukata/iip 549
  466. モチベーション • 具体的に、既存の多くの TCP/IP スタック実装は 1. 特定の OS、ライブラリやネットワーク I/O 機能に依存

    2. それら機能が TCP/IP スタック外部から隠蔽されている 3. TCP/IP スタック⾃体にプロトコル処理を⾏うスレッドが含まれる • 結果として、 1. 他のシステムとの統合・コンパイル⾃体が難しい場合がある 2. 機能の隠蔽によって、最適化がしにくくなる場合がある 3. プロトコル処理を⾏うスレッドの実⾏形式が限定される 551
  467. 1. 統合・コンパイルが難しい • 例えば、Shenango や Caladan のように独⾃のユーザー空間ス レッドでプロトコル処理を実⾏しようとすると、既存の pthread や

    pthread を想定したロックに依存した TCP/IP ス タック実装は組み合わせるのが難しい • 新しく設計・実装された OS 等の既存の標準ライブラリ等との 互換が⼗分でないシステムに適⽤するのが難しい 552
  468. 2. 機能隠蔽により最適化しにくくなる • 例えば、sendfile システムコールのようにディスクと NIC 間の データの受け渡しのメモリコピーを削減したいと思った時 553 既存の

    DPDK を使った TCP/IP スタック実装 DPDK DPDK ⽤パケットバッファ TCP/IP 既存の TCP/IP スタックが 想定する利⽤法 ディスクから読み出したデータ ディスク API メモリコピー
  469. 2. 機能隠蔽により最適化しにくくなる • 例えば、sendfile システムコールのようにディスクと NIC 間の データの受け渡しのメモリコピーを削減したいと思った時 554 既存の

    DPDK を使った TCP/IP スタック実装 DPDK DPDK ⽤パケットバッファ TCP/IP 本当はディスクのデータを DPDK ⽤パケットバッファへ読み出したい ディスク
  470. 2. 機能隠蔽により最適化しにくくなる • 例えば、sendfile システムコールのようにディスクと NIC 間の データの受け渡しのメモリコピーを削減したいと思った時 555 既存の

    DPDK を使った TCP/IP スタック実装 DPDK DPDK ⽤パケットバッファ TCP/IP 本当はディスクのデータを DPDK ⽤パケットバッファへ読み出したい ディスク 多くの実装で、DPDK とそのパケットバッファは TCP/IP スタック実装内部に隠蔽され ディスクの直接的なデータ読み込み先として指定できない
  471. 3. スレッドの実⾏形式が制限される • 既存の実装の多くは⾃前でプロトコル処理を⾏うスレッドを含 んでいる 557 既存の DPDK を使った TCP/IP

    スタック実装 DPDK DPDK ⽤パケットバッファ TCP/IP while (1) { } TCP/IP スタック実装利⽤者が 実装するアプリ while (1) { receive_data process_data send_data } 送受信 キュー API TCP/IP スタック実装利⽤者は以下のような感じでアプリを実装する
  472. 3. スレッドの実⾏形式が制限される • 既存の実装の多くは⾃前でプロトコル処理を⾏うスレッドを含 んでいる 558 既存の DPDK を使った TCP/IP

    スタック実装 DPDK DPDK ⽤パケットバッファ TCP/IP while (1) { } TCP/IP スタック実装利⽤者が 実装するアプリ while (1) { receive_data process_data send_data } 送受信 キュー API 典型的な設定ではアプリと TCP/IP スタック実装のスレッドは別の CPU コアで実⾏する TCP/IP スタック実装利⽤者は以下のような感じでアプリを実装する
  473. 仮想マシン通信の⾼速化 • パケット I/O フレームワークを使った仮想スイッチを仮想マシ ン通信基盤へ適⽤ • ClickOS (NSDI 2014)

    • NetVM (NSDI 2014) • ptnetmap (ANCS 2015, LANMAN 2016) • HyperNF (SoCC 2017) • ELISA (ASPLOS 2023) 559 Xen に netmap/VALE を適⽤ QEMU/KVM に DPDK を適⽤ Xen に netmap/VALE を適⽤ 実⾏のモデルを改善 主張:vCPU スレッドと仮想スイッチを実⾏する バックエンドのスレッドを分けない⽅が良い カーネル スレッド vCPU thread 実際は、vCPU かバックエンドのスレッドどちらかが常にボトルネックになる (ワークロード依存) 実際 vCPU スレッドがボトルネック 利⽤されない CPU 時間
  474. 3. スレッドの実⾏形式が制限される • 既存の実装の多くは⾃前でプロトコル処理を⾏うスレッドを含 んでいる 560 既存の DPDK を使った TCP/IP

    スタック実装 DPDK DPDK ⽤パケットバッファ TCP/IP while (1) { } TCP/IP スタック実装利⽤者が 実装するアプリ while (1) { receive_data process_data send_data } 送受信 キュー API 典型的な設定ではアプリと TCP/IP スタック実装のスレッドは別の CPU コアで実⾏する TCP/IP スタック実装利⽤者は以下のような感じでアプリを実装する
  475. 3. スレッドの実⾏形式が制限される • 既存の実装の多くは⾃前でプロトコル処理を⾏うスレッドを含 んでいる 562 典型的な設定ではアプリと TCP/IP スタック実装のスレッドは別の CPU

    コアで実⾏する TCP/IP スタック実装利⽤者は以下のような感じでアプリを実装する アプリ スレッド TCP/IP スレッド 常に空きの CPU 時間ができる
  476. 3. スレッドの実⾏形式が制限される • 既存の実装の多くは⾃前でプロトコル処理を⾏うスレッドを含 んでいる 563 典型的な設定ではアプリと TCP/IP スタック実装のスレッドは別の CPU

    コアで実⾏する TCP/IP スタック実装利⽤者は以下のような感じでアプリを実装する アプリ スレッド TCP/IP スレッド 常に空きの CPU 時間ができる
  477. 3. スレッドの実⾏形式が制限される • 理想的には • NIC からデータを受け取る • TCP/IP スタック受信処理

    • アプリ固有処理 • TCP/IP スタック送信処理 • NIC からデータを送信する • 上記を⼀つのスレッドで実⾏できた⽅が嬉しい 564
  478. lwIP • ⼩さい組み込みデバイスを想定したポータブルな TCP/IP 実装 • (個⼈的に)⾮常に利⽤しやすい上に性能も⾼い • ⼀⽅、 •

    NIC のオフローディング機能に対応していない • NIC とアプリの間でコピーを削除しきれない • 複数スレッドで同時に lwIP を実⾏できるように作られていない 565
  479. モチベーション • 以下のような特性を持つ TCP/IP 実装が欲しい 1. プロトコル処理の実装が特定の CPU、NIC、OS、ライブラリ、コン パイラ機能に依存しない 2.

    外部の実装に対して、隠蔽する機構が最⼩限 3. TCP/IP スタックがプロトコル処理を実⾏するスレッドを持たない 4. NIC のオフローディング機能を使える 5. NIC とアプリの間でコピーをなくすことができる 6. 複数スレッドで実⾏可能でマルチコア環境で性能がスケールする 566
  480. 実装ポイント 567 ネットワーク I/O 機能 パケットバッファ TCP/IP 多くの既存の実装の構成 アプリ TCP/IP

    スタック実装者が提供 TCP/IP スタック利⽤者 (アプリ開発者)が提供
  481. 実装ポイント 568 ネットワーク I/O 機能 パケットバッファ TCP/IP 今回の実装の構成 アプリ TCP/IP

    スタック実装者が提供 TCP/IP スタック利⽤者 (アプリ開発者)が提供
  482. 実装ポイント 569 ネットワーク I/O 機能 パケットバッファ TCP/IP 今回の実装の構成 アプリ TCP/IP

    スタック実装者が提供 TCP/IP スタック利⽤者 (アプリ開発者)が提供 CALLBACK CALLBACK 利⽤者が実装するコールバック パケットバッファ確保・解放 NIC からのパケット転送 NIC のオフロード機能通知
  483. 実装ポイント 570 ネットワーク I/O 機能 パケットバッファ TCP/IP 今回の実装の構成 アプリ TCP/IP

    スタック実装者が提供 TCP/IP スタック利⽤者 (アプリ開発者)が提供 CALLBACK CALLBACK 利⽤者が実装するコールバック パケットバッファ確保・解放 NIC からのパケット転送 NIC のオフロード機能通知 アプリはパケットバッファへ直接送信したいデータを書き込める
  484. 実装ポイント 571 ネットワーク I/O 機能 パケットバッファ TCP/IP 今回の実装の構成 アプリ TCP/IP

    スタック実装者が提供 TCP/IP スタック利⽤者 (アプリ開発者)が提供 CALLBACK CALLBACK 利⽤者が実装するコールバック パケットバッファ確保・解放 NIC からのパケット転送 NIC のオフロード機能通知 アプリはパケットバッファへ直接送信したいデータを書き込める API 送信⽤ API には、パケットバッファへのポインタを渡す
  485. 実装ポイント 572 ネットワーク I/O 機能 パケットバッファ TCP/IP 今回の実装の構成 アプリ TCP/IP

    スタック実装者が提供 TCP/IP スタック利⽤者 (アプリ開発者)が提供 CALLBACK CALLBACK 利⽤者が実装するコールバック パケットバッファ確保・解放 NIC からのパケット転送 NIC のオフロード機能通知 アプリはパケットバッファへ直接送信したいデータを書き込める API 送信⽤ API には、パケットバッファへのポインタを渡す TCP/IP スタックは利⽤者が実装したコールバックを使って ヘッダを配置するためのパケットバッファを確保+ヘッダを⽤意
  486. 実装ポイント 573 ネットワーク I/O 機能 パケットバッファ TCP/IP 今回の実装の構成 アプリ TCP/IP

    スタック実装者が提供 TCP/IP スタック利⽤者 (アプリ開発者)が提供 CALLBACK CALLBACK 利⽤者が実装するコールバック パケットバッファ確保・解放 NIC からのパケット転送 NIC のオフロード機能通知 アプリはパケットバッファへ直接送信したいデータを書き込める API 送信⽤ API には、パケットバッファへのポインタを渡す TCP/IP スタックは利⽤者が実装したコールバックを使って NIC の Scatter Gather 機能でペイロードにヘッダを結合して パケットを送信:ペイロードのメモリコピーはなし
  487. 実装ポイント 574 ネットワーク I/O 機能 パケットバッファ TCP/IP 今回の実装の構成 アプリ TCP/IP

    スタック実装者が提供 TCP/IP スタック利⽤者 (アプリ開発者)が提供 CALLBACK CALLBACK 利⽤者が実装するコールバック パケットバッファ確保・解放 NIC からのパケット転送 NIC のオフロード機能通知 アプリはパケットバッファへ直接送信したいデータを書き込める API 送信⽤ API には、パケットバッファへのポインタを渡す TCP/IP スタックは利⽤者が実装したコールバックを使って 確保したパケットバッファを解放
  488. 実装ポイント 575 ネットワーク I/O 機能 パケットバッファ TCP/IP 今回の実装の構成 アプリ TCP/IP

    スタック実装者が提供 TCP/IP スタック利⽤者 (アプリ開発者)が提供 CALLBACK CALLBACK 利⽤者が実装するコールバック パケットバッファ確保・解放 NIC からのパケット転送 NIC のオフロード機能通知 アプリはパケットバッファへ直接送信したいデータを書き込める API 送信⽤ API には、パケットバッファへのポインタを渡す ここで利⽤者がアプリで書き込んだパケットバッファを 解放しなければ、同じパケットバッファ上のデータを 別の宛先へ送ることもできます
  489. 実装ポイント 576 ネットワーク I/O 機能 パケットバッファ TCP/IP 今回の実装の構成 アプリ TCP/IP

    スタック実装者が提供 TCP/IP スタック利⽤者 (アプリ開発者)が提供 CALLBACK CALLBACK 利⽤者が実装するコールバック パケットバッファ確保・解放 NIC からのパケット転送 NIC のオフロード機能通知 アプリはパケットバッファへ直接送信したいデータを書き込める API 送信⽤ API には、パケットバッファへのポインタを渡す ここで利⽤者がアプリで書き込んだパケットバッファを 解放しなければ、同じパケットバッファ上のデータを 別の宛先へ送ることもできます 利⽤者にこのような⾃由度を残せるところが TCP/IP スタック実装が機能の隠蔽を⾏わない利点
  490. 性能 • ベンチマーク 577 0 2 4 6 8 10

    12 14 16 18 20 1 2 4 8 16 32 Throughput [ million requests / sec ] CPU cores [#] Linux TCP/IP this work - TCP ペイロードは 4 ~ 64 バイト - サーバーが各 CPU コアが 16 TCP 接続へ 応答するようクライアントは接続数を調整 - TCP 接続は確⽴後切断しない - なるべく⾼速にメッセージの交換を⾏う CPU: 2 x 16-core Intel Xeon Gold 6326 CPU @ 2.90GHz (合計 32 コア) NIC: Mellanox ConnectX-5 100 Gbps NIC (マシン間はケーブルを直繋ぎして接続) OS: Linux 6.2 実験環境(同じ設定のマシン2台)
  491. 性能 • ベンチマーク 578 0 2 4 6 8 10

    12 14 16 18 20 1 2 4 8 16 32 Throughput [ million requests / sec ] CPU cores [#] Linux TCP/IP this work - TCP ペイロードは 4 ~ 64 バイト - サーバーが各 CPU コアが 16 TCP 接続へ 応答するようクライアントは接続数を調整 - TCP 接続は確⽴後切断しない - なるべく⾼速にメッセージの交換を⾏う 16 CPU コア以降、コア数を増やしても あまり速くならなかった 何故? CPU: 2 x 16-core Intel Xeon Gold 6326 CPU @ 2.90GHz (合計 32 コア) NIC: Mellanox ConnectX-5 100 Gbps NIC (マシン間はケーブルを直繋ぎして接続) OS: Linux 6.2 実験環境
  492. 簡単な調査 • pqos コマンドでメモリに関する情報を取得 • Instruction Per Cycle (IPC) •

    Cache Miss • Last-Level Cache occupancy • Memory Bandwidth 579 https://github.com/intel/intel-cmt-cat/wiki/PQoS-monitoring-metrics-definition
  493. Instruction Per Cycle (IPC) • 利⽤している CPU コア 全ての IPC

    の合計 580 0 5 10 15 20 25 30 35 1 2 4 8 16 32 Total Instruction Per Cycle (IPC) CPU cores [#] 16 CPU コア以降、コア数を増やしても IPC があまり増えていない
  494. キャッシュミス回数 • 利⽤している CPU コアで 観測されたキャッシュミス 回数の合計 581 0 50

    100 150 200 250 300 1 2 4 8 16 32 Total Cache Misses [ million ] CPU cores [#] 16 CPU コア以降、8コアまでの時と ⽐べてキャッシュミス回数が⼤幅に増加
  495. メモリ帯域使⽤状況 • 利⽤している CPU コア で観測されたメモリ帯域 使⽤の合計 582 0 5

    10 15 20 25 30 35 1 2 4 8 16 32 Total Memory Bandwidth Local + Remote [ GB/s ] CPU cores [#] キャッシュミス増加に合わせて メモリ帯域の利⽤が増加
  496. キャッシュ占有状況 • 利⽤している CPU コア の占有している キャッシュサイズの合計 583 0 10

    20 30 40 50 1 2 4 8 16 32 Total Last Level Cache Occupancy [ MB ] CPU cores [#] コアを増やしてもデータが キャッシュに乗らなくなって 性能が制限されているかも? 今回のマシンの CPU は1つあたり 24 MB のキャッシュを持っており、 2CPU 構成のため 48 MB が限界と思われる
  497. 利⽤する CPU の数を1つにしてみる • 先ほどまでは2つの CPU のコアを同数利⽤していたので、今 度は全てのスレッドを同じ CPU で動かしてみる

    584 0 2 4 6 8 10 12 14 16 18 20 1 2 4 8 16 32 Throughput [ million requests / sec ] CPU cores [#] 2 CPU (32-core) 1 CPU (16-core) 0 5 10 15 20 25 30 35 40 45 50 1 2 4 8 16 32 Total Last Level Cache Occupancy [ MB ] CPU cores [#] 2 CPU (32-core) 1 CPU (16-core) ⻘が先ほどまでのグラフです 使えるキャッシュサイズが前の実験と⽐べて半分になる
  498. 利⽤する CPU の数を1つにしてみる • 先ほどまでは2つの CPU のコアを同数利⽤していたので、今 度は全てのスレッドを同じ CPU で動かしてみる

    585 0 2 4 6 8 10 12 14 16 18 20 1 2 4 8 16 32 Throughput [ million requests / sec ] CPU cores [#] 2 CPU (32-core) 1 CPU (16-core) 0 5 10 15 20 25 30 35 40 45 50 1 2 4 8 16 32 Total Last Level Cache Occupancy [ MB ] CPU cores [#] 2 CPU (32-core) 1 CPU (16-core) ⻘が先ほどまでのグラフです 1CPUの時の⽅が同じ CPU コア数でも性能が下がった 使えるキャッシュサイズが前の実験と⽐べて半分になる
  499. 利⽤する CPU の数を1つにしてみる • 先ほどまでは2つの CPU のコアを同数利⽤していたので、今 度は全てのスレッドを同じ CPU で動かしてみる

    586 0 2 4 6 8 10 12 14 16 18 20 1 2 4 8 16 32 Throughput [ million requests / sec ] CPU cores [#] 2 CPU (32-core) 1 CPU (16-core) 0 5 10 15 20 25 30 35 40 45 50 1 2 4 8 16 32 Total Last Level Cache Occupancy [ MB ] CPU cores [#] 2 CPU (32-core) 1 CPU (16-core) ⻘が先ほどまでのグラフです 1CPUの時の⽅が同じ CPU コア数でも性能が下がった 使えるキャッシュサイズは性能に影響がありそう 使えるキャッシュサイズが前の実験と⽐べて半分になる
  500. まとめ • NIC の⾼速化による性能の伸び代を活かす研究についてご紹介 しました • 引⽤等は技術レポート「Internet Infrastructure Review (IIR)

    Vol. 60」 をご参照ください • HTML / PDF 版:https://www.iij.ad.jp/dev/report/iir/060.html • TCP/IP スタックを⾃作してみて、⽐較的最近のハードウェア での性能の限界がどこから来るか簡単に調査してみました • よろしければお試しください:https://github.com/yasukata/iip 588