萌えハッカーニュースリーダー

2025/05/07 17:55 QUIC restarts, slow problems: udpgrm to the rescue

出典: https://blog.cloudflare.com/quic-restarts-slow-problems-udpgrm-to-the-rescue/
hakase
博士

ロボ子、CloudflareがUDPサーバーのゼロダウンタイムアップグレードを支援する`udpgrm`っていうデーモンを導入したらしいのじゃ。

roboko
ロボ子

`udpgrm`ですか。UDPでゼロダウンタイムアップグレードとは、どういうことでしょう?

hakase
博士

UDPは普通ステートレスだけど、QUICとかWireGuardみたいな最近のプロトコルはステートフルなフローを使うからの。TCPみたいに、古いサーバーを新しいサーバーと並行して実行して、既存の接続をドレインさせるアプローチをUDPにも適用したいわけじゃ。

roboko
ロボ子

なるほど。でも、UDPはコネクションレスだから、難しそうですね。

hakase
博士

`udpgrm`は、Linuxの`SO_REUSEPORT` APIとeBPFプログラムを活用して、フローを追跡してパケットを適切なインスタンスにルーティングするらしいぞ。フローのスティッキーさを維持するってところがミソじゃな。

roboko
ロボ子

`SO_REUSEPORT`は複数のソケットが同じIP:ポートにバインドできるようにするんですよね。eBPFでカスタムロジックを実装できる`SO_ATTACH_REUSEPORT_EBPF`オプションも使うんですね。

hakase
博士

そうそう。昔は`established-over-unconnected`メソッドが使われたけど、競合状態とかスケーラビリティの問題があったみたいじゃ。`udpgrm`では、ソケットジェネレーションっていう概念を導入して、同じ論理アプリケーションインスタンスに属するreuseportグループ内のソケットのセットを定義するのじゃ。

roboko
ロボ子

ソケットジェネレーションですか。新しいフローはアクティブなサーバーインスタンスに属するソケットジェネレーションから選択されて、確立されたフローは適切なソケットから選択されるんですね。

hakase
博士

`udpgrm`はフローディセクターを使って、新しいパケットと古いパケットを区別して、フローが属する特定のソケットを特定するらしいぞ。`DISSECTOR_FLOW`、`DISSECTOR_CBPF`、`DISSECTOR_NOOP`の3つのディセクターモードをサポートしてるみたいじゃな。

roboko
ロボ子

システム管理者とプログラマー、両方の視点から使えるように設計されているんですね。システム管理者はデーモンを実行してcgroupフックをインストールし、プログラマーは`setsockopt`と`getsockopt`を使って`udpgrm`デーモンと通信すると。

hakase
博士

`udpgrm_activate.py`スクリプトを使うと、特権が必要な低いポートにバインドされたソケットを作成できるし、`mmdecoy`スクリプトはsystemdが古いサーバーインスタンスをすぐにkillしないようにするために使うらしいぞ。

roboko
ロボ子

色々な工夫が凝らされているんですね。でも、LinuxソケットAPIはUDPの現代的なニーズに対応できていないという指摘もあるんですね。

hakase
博士

そうなんじゃ。systemdが、"少なくとも1つ"のサーバーインスタンスモード、UDP `SO_REUSEPORT`ソケットの作成、`REUSEPORT_EBPF`プログラムのインストール、"ワーキングジェネレーション"ポインタの管理をサポートする必要があるって言ってるぞ。

roboko
ロボ子

今後のsystemdのアップデートに期待ですね。

hakase
博士

しかし、ロボ子よ。UDPのゼロダウンタイムアップグレードなんて、まるで幽霊船の乗り換えみたいじゃな。誰も気づかないうちに、船が入れ替わってるのじゃ!

roboko
ロボ子

幽霊船ですか。博士、たまには怖いこと言いますね。

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search