# ユーザーレベルTCPスタック
## 定義
TCPスタックをOSカーネルから取り出し、ユーザープロセス空間で動作させる実装アプローチ。カーネルモード切り替え(システムコール)を排除し、高性能パケットI/Oライブラリ(DPDK, netmap, PSIOなど)を通じてNICに直接アクセスする。目的はカーネルTCPスタックの根本的非効率性——接続ローカリティの欠如・共有ファイルディスクリプタ空間・非効率なパケット単位処理・高コストなシステムコール——をユーザーレベルから解決することである。
代表実装として mTCP(NSDI 2014、[[EunYoung Jeong]]・[[KyoungSoo Park]] ら [[KAIST]])が挙げられる。mTCPは各CPUコアに1本のTCPスレッドを対応させ、パケットレベルとソケットレベルのイベントを双方向にバッチ処理することでコンテキストスイッチオーバーヘッドを複数イベントに分散させる。(Source: [[@2014__NSDI__mTCP - a Highly Scalable User-level TCP Stack for Multicore Systems]])
## アーキテクチャパターン
ユーザーレベルTCPスタックの実装が持つ共通の構造的要素:
- **コアローカルデータ構造**: フローハッシュテーブル・TCB・ソケットバッファをコアごとに独立させ、コア間ロック競合を排除する。
- **パケットI/Oバッチ化**: PCIeオペレーション(DMA・IOMMUルックアップ)のコストを複数パケットに分散させる。RSSでフローレベルのコアアフィニティを確保する。
- **ロックフリー共有キュー**: アプリケーションスレッドとTCPスレッド間のデータ交換を単一プロデューサ・単一コンシューマキューで実現する。
- **イベントバッチ化**: フローレベルのイベント(接続確立・データ到着・書き込み)を複数まとめてアプリケーションに渡し、コンテキストスイッチ1回のコストを分散させる。
## 横断的知見
- LinuxカーネルTCPスタックはCPUサイクルの70〜80%をカーネル内で消費しており、その大半はロック競合・バッファ管理・頻繁なモード切り替えに起因する。この問題は単一の最適化では解決せず、パケットI/Oとシステムコールバッチ化の両方を統合する必要がある。(Source: [[@2014__NSDI__mTCP - a Highly Scalable User-level TCP Stack for Multicore Systems]])
- mTCP(NSDI 2014)は先行する個別最適化(Affinity-Accept, MegaPipe, FlexSC)をユーザーレベルで統合し、単一システムが提供できる恩恵の和をカーネル改変なしに実現した最初の実装である。(Source: [[@2014__NSDI__mTCP - a Highly Scalable User-level TCP Stack for Multicore Systems]])
- バッチ処理はレイテンシの最小値をわずかに増加させる(mTCPで9ms vs Linuxで0ms)代わりに、平均レイテンシ・最大レイテンシ・標準偏差を劇的に改善する。スループットが9.5倍増加しながら平均レイテンシが8.8倍小さくなるというトレードオフは、データセンターアプリケーションにとって有利である。(Source: [[@2014__NSDI__mTCP - a Highly Scalable User-level TCP Stack for Multicore Systems]])
- ユーザーレベルTCPスタックはNICに直接アクセスするため、1アプリケーション1NICポートの制約を伴う。後続研究(AccelTCP, NSDI 2020)ではSmartNICへのTCPオフロードによってこの制約を別の形で解消するアプローチが登場した。(Source: [[@2020__NSDI__AccelTCP - Accelerating Network Applications with Stateful TCP Offloading]])
## 未解決の問い
- TCPオフロード機能(チェックサムオフロード・LSO・LRO)の統合により、長期接続でのCPU効率劣化(mTCPの294% vs Linux 80%)はどこまで解消されるか。
- SmartNICへのTCPスタックオフロード(AccelTCP等)とユーザーレベルソフトウェア実装(mTCP等)はどの条件で使い分けるべきか。ワークロード特性・ハードウェアコスト・運用複雑性の3軸で整理できるか。
- パケットI/Oライブラリ(PSIO→DPDK)の変遷に伴い、mTCPのアーキテクチャ的前提(バッチサイズ・コアアフィニティ設計)はどのように変化したか。
## 関連
- [[@2014__NSDI__mTCP - a Highly Scalable User-level TCP Stack for Multicore Systems]] — mTCP: 提案手法の詳細
- [[@2020__NSDI__AccelTCP - Accelerating Network Applications with Stateful TCP Offloading]] — SmartNICへのTCPオフロードによる後続アプローチ
- [[EunYoung Jeong]] — mTCP 筆頭著者
- [[KyoungSoo Park]] — mTCP・AccelTCP の共著者(KAIST)
- [[KAIST]] — 発信元機関
- [[structures/分散システム - MOC]] — 関連MOC(ネットワークシステム分野)
## 出典
- [[@2014__NSDI__mTCP - a Highly Scalable User-level TCP Stack for Multicore Systems]] — 初出・主要ソース
- [[@2020__NSDI__AccelTCP - Accelerating Network Applications with Stateful TCP Offloading]] — 後続研究