H2O と QLog で QUIC をデバッグ
コンピュータープログラムの質に関する重要な指標のひとつにデバッグのしやすさがあります。これは、さまざまな実装との相互運用性が必要なプロトコルの実装において特に重要です。デバッグのしやすさは、正確性のテストにおいてだけでなく、パフォーマンスを調整する機会を特定するのにも役立ちます。現在、QUIC はユーザースペースで実装される必要があるため、デバッグのしやすさは QUIC において不可欠です。このブログ記事では、QUIC エンドポイントのインクリメンタルなログ形式である QLog へのサポートを Fastly のエッジクラウドプラットフォーム全体 にデプロイされているオープンソースの HTTP サーバー H2O に追加した方法をご紹介します。
QUIC、QLog、デバッグツール
QUIC は、HTTP/3 で使用される、安全性に優れた低レイテンシのトランスポートレイヤープロトコルです。この魅力的な新しいプロトコルでは、TCP が今日のインターネット環境で直面している基本的な問題が解決されています。QUIC に興味のある方は、Fastly のエンジニア Jana Iyengar による QUIC 関連のブログシリーズをご覧ください。
QLog は QUIC エンドポイントのログ形式です。QLog プロジェクトは、QVis と呼ばれる QLog データを視覚化する JavaScript ベースのツールスイートも提供しています。QLog と QVis は一緒に語られることが多いのですが、QLog のログ形式は QVis 無しでも役立つことに留意すべきです。これは、QLog を活用するツールの構築を可能にする標準のログ形式が現在提供されているためです。QUIC のトレースデータをサポートする事実上の標準言語は、開発者にとってだけではなく、より広範なインターネットコミュニティ全体にメリットをもたらします。これが、Fastly が QLog プロジェクトをサポートしている理由です。現在、QLog の仕様は QUIC に合わせて進化しています。
H2O のイベントトレースインフラの再利用
H2O サーバーは、包括的な低レベルのイベントトレース機能を備えており、この機能は eBPF または DTrace によって実行されます (プラットフォームよって異なります)。具体的には、H2O サーバーとそのライブラリ (例えば H2O の QUIC 実装である quicly) を USDT (User Statically Defined Tracing) プローブで測定することでイベントのトレースが行われます。アクティブでないプローブのオーバーヘッドは単一の NOP 命令にすぎないため、プローブは本番環境のパフォーマンスに負担をかけません。そこで、この既存のトレースインフラを活かすため、H2O のパワフルな低レベルのトレース機能を維持しながら QLog 形式のサポートを可能にする後処理の QLog アダプタを記述しました。アダプタを使用することで、将来的に H2O のトレースインフラを変更せずに、異なるログ形式やツールを検討することが可能になります。
この作業では、H2O の低レベルトレース機能と QLog の高レベルのセマンティクスの構造的な違いの扱いに苦心しました。例えば、H2O ではパケットとストリームのイベントが個別にトレースされますが、これらは QLog 形式では緊密に連結されています。柔軟性のある設計を構築することで、最終的にこのマッピングを成功させることができました。
QUIC の未来
QUIC は今後、ますます発展すると思われます。IETF による標準化プロセスも最終段階に入り、Google の Chrome ブラウザは IETF QUIC を正式にサポートしています。また Fastly では、サーバーフリート全体に QUIC と HTTP/3 をデプロイしています。その結果、顧客の数が増えるにつれて、QUIC のトラフィックも増加しています。QUIC エンドポイントの統計データを QLog で記録し、確認できるようになったことで、Fastly のプロトコルエンジニアリングチームはより安全で高速なインターネットの構築を加速できます。