AWS Nitro Systemのネットワーク処理 〜EC2仮想化を支えるハードウェア〜

どうも、DWS 荒牧です🙌
最近、EC2の低レイヤーに興味があり、AWS Nitro Systemのネットワーク処理について調査してみました。
今回は、その調査した結果をベースに、AWS Nitro SystemがEC2のネットワーク処理をどのように高速化しているのかについて詳しく解説していきます。
この記事のポイント
- AWS Nitro Systemの基本概念とネットワーク処理の仕組み
- パケットがアプリケーションからEthernetまで流れる詳細な過程
- Nitroカード内部での5段階のパケット処理
- 5-tuple最適化によるパフォーマンス向上の仕組み
- フローキャッシュとコネクショントラッキングの効果
AWS Nitro Systemとは?
AWS Nitro Systemは、2013年に発表されたEC2の仮想化を支える基盤技術です。従来のXenハイパーバイザーを置き換え、軽量なハイパーバイザーに進化させました。
従来のXenとの違い
従来のXenベースの仮想化では、Dom0(Domain 0)でネットワーク・ストレージ処理を集中管理していました。しかし、これにはいくつかの課題がありました:
- CPUリソースがDom0のI/O処理に奪われる
- オーバーヘッドが増大する
- セキュリティ上の攻撃面が大きく複雑になる
Nitro Systemの革新
Nitro Systemでは、Dom0を廃止し、処理をハードウェアへ置き換えることで、これらの課題を解決しています。
- 専用ハードウェア(Nitroカード)でI/Oをオフロード
- 軽量ハイパーバイザーで最小限の機能のみを提供
- ハードウェアRoot of Trustによる強固なセキュリティ
パケットの流れ:アプリケーションから外部ネットワークまで
EC2インスタンス内から外部ネットワークへパケットが送信される際の流れを見てみましょう。
1. アプリケーション
↓
2. OS(Linuxカーネル)のネットワークスタック
↓
3. ENAドライバ(仮想NICを制御)
↓
4. Nitroカード(ハードウェアNIC)
↓
5. Ethernet
この流れの中で、特に重要なのがNitroカードでの処理です。ここで、VPCのルーティングやセキュリティグループの評価など、AWSの仮想ネットワーク機能が実現されているんですね。
Nitroカードでの5段階のパケット処理
Nitroカード内部では、以下の5つの段階でパケット処理が行われます。
① Txリングバッファへの投入
最初の段階では、EC2のOSがENAドライバーを通じてパケットをリングバッファ(キュー)に書き込みます。
- OSがENA経由でパケットをリングバッファに書き込み
- パケットの5-tupleからハッシュを計算
- ハッシュにより複数のキューに分散
5-tupleとは?
パケットの送信元IP、宛先IP、プロトコル、送信元ポート、宛先ポートの5つの組み合わせのことです。この情報を使ってパケットを識別・分散処理します。
② パケット読み取りとVPC情報の処理
Nitroカードはキューからパケットをポーリングし、VPC情報を参照して以下の処理を行います:
- ルートテーブルを参照 → 宛先経路を決定
- NACLで評価 → 許可されないパケットはドロップ
- セキュリティグループで評価 → 許可されないパケットはドロップ
重要なのは、NitroカードにはVPCの情報が記録されているということです。これにより、ハードウェアレベルでAWSの仮想ネットワーク機能を実現しているんですね。
③ 物理的な位置のマッピング
次に、AWS内部のマッピングサービスから宛先インスタンスの物理的な場所を取得します。
- マッピングサービスから宛先の物理的な場所を取得
- 隣接情報を記録し、次回の処理を高速化
このマッピングサービスの詳細な仕様は公開されていませんが、AWSの大規模なインフラストラクチャを支える重要な仕組みの一つです。
④ コネクショントラッキングとフローキャッシュ
パフォーマンス向上のため、Nitroカードは以下のキャッシュ機能を持っています:
コネクショントラッキング
- 初回パケットで5-tupleをキーとして以下の情報を保存
- 通信元・通信先の関係性
- 通信がSGやNACLによって許可済みであること
フローキャッシュ
- 隣接情報などをまとめてNitro内に保存
- フローキャッシュにあるパケットはSG等の評価を行う必要がないため高速化
この仕組みにより、同じフローのパケットは2回目以降の処理が大幅に高速化されるんです。
⑤ パケットの物理送出
最後に、Nitroカード内の処理が完了したパケットを物理NICを通じて外部へ送信します。
Nitro System が速い理由
それでは、Nitro Systemがどうやってスピードを引き出しているのか、主なポイントを見ていきましょう。
高速化のカギとなる技術は、次のとおりです。
ハードウェアオフロード
従来のソフトウェアベースの処理をハードウェアに移すことで、CPUオーバーヘッドを大幅に削減しています。
5-tuple最適化
パケットの5-tupleを使った効率的な分散処理により、高スループット・低遅延を実現しています。
フローキャッシュによる高速化
一度処理したフローの情報をキャッシュすることで、同じ通信パターンの処理を大幅に高速化しています。
まとめ
AWS Nitro Systemのネットワーク処理について、パケットの流れから内部の仕組みまで詳しく見てきました。
重要なポイント
- Nitroカードによるハードウェアレベルでのネットワーク処理
- 5段階のパケット処理による効率的な通信制御
- フローキャッシュとコネクショントラッキングによる高速化
- VPC機能のハードウェア実装による高性能化
Nitro System は EC2 を裏側で支える存在です。
ふだん使うだけなら仕組みを意識しなくても困りませんが、パフォーマンスチューニングやトラブルシューティングの場面では、この仕組みを知っていると心強いかもしれません。