1.1.1.1 の DNS キャッシュ最適化でメモリ使用量を 100TB 削減

2026/08/28 2:17

1.1.1.1 の DNS キャッシュ最適化でメモリ使用量を 100TB 削減

RSS: https://news.ycombinator.com/rss

要約

Japanese Translation:

Big Pineapple は、5 つの主要なストレージ最適化によりパーエントリーフッタープリントを 50% 以上削減したことで、DNS インフラストラクチャを大幅に革新することに成功しました。

Vec
String
フィールドをボックスポインタに置換し、レコードセクションを単一のリストへ統合し、不要なオーナーフィールドを除去し、大きな列挙型バリアントをボックス化してパディングを削減し、レコードを連続的なワイヤフォーマットバッファに格納することで、膨大な量の無駄なヒープ容量を排除しました。これらの改善は、特に 1 クライアントネットワークにつき複数の照会バージョンをキャッシュする必要がある ECS クライアントサブネット(ECS)照会を処理する場所にとって極めて重要です。2026 年 5 月 18 日から 7 月 6 日までのプロダクションロールアウト後、システムは劇的な効率向上を達成しました:平均居住メモリは 9.3 GB から 5.3 GB に低下し(p99 使用量の 43% 削減)、実質的に Gen 13 サーバー 130 機以上の RAM を解放しました。また、挿通スループットが 43% 増加し、照会遅延は 19% 減少することで、高負荷下でも船団がより信頼性高く動作すると同時に、大きなコスト削減を実現しました。

本文

BigPineapple: DNS キャッシュのメモリ使用量 56% 削減とパフォーマンス向上

BigPineapple(ビッグパイナップル)は、Cloudflare の1.1.1.1、ゲートウェイ DNS、DNS ファイアウォール、AS112 など複数の DNS サービスを支えるプラットフォームです。

  • いかなる時点においても 2,500 億を超える DNS キャッシュエントリを保持しています。
  • この規模において、1 エントリあたり 1 バイトの無駄は艦隊全体で約 250 ギガバイトのメモリ浪費に相当します。

🚀 達成された成果

連続して行われた 5 つの最適化変更により、以下の成果を達成しました。

  • フットプリント削減: 1 エントリあたりのメモリ使用量を 50% 以上削減
  • メモリ確保: 艦隊全体で約 100 テラバイトのメモリが解放されました(Gen 13 サーバー 130 機分の RAM に相当)。
  • パフォーマンス向上:
    • インサートスループットは 43% 増加
    • 検索遅延は 19% 減少

1. キャッシュ構造と ECS の影響

キャッシュの基本動作

  • 起動時:空のキャッシュから開始。
  • 埋まり方:DNS クエリに応じて埋まり、上限に達すると古いものや人気の低いものを弾き出します
  • ECS(EDNS Client Subnet)の影響:
    • オーソライズサーバーはクライアントのネットワークにより異なる回答を返すため、同じクエリの複数バージョンをキャッシュする必要があります
    • これによりエントリ数と各エントリのメモリ消費が増加し、最適化の効果が高まります。

データ構造の詳細

キャッシュ内のアイテムは**鍵(Key)と値(Value)**のペアです。

// キャッシュキー:何が検索されたかを示します
pub struct CacheKey {
    qname: Name,
    qtype: Rtype,
    authenticated: bool,
    tag: Vec<u8>,
}

// キャッシュエントリ:DNS 応答とメタデータを格納します
pub struct CacheEntry {
    timestamp: UnixTimeStamp,
    pub inception: Instant,
    pub ttl: Ttl,
    pub hits: u32,
    pub answers: Vec<Record>,
    pub authority: Vec<Record>,
    pub additional: Vec<Record>,
    pub errors: Vec<ExtendedError>,
    // ...
}

課題: 格納後に不要なフィールドや、不必要に重い型を使用している箇所への改善余地がありました。


2.
Vec<T>
String
の容量削減

ベンチマーク設定

  • 実環境のトラフィック分布と類似したランダムエントリで充填してベンチマーク。
  • レコード構成:A(56%) / AAAA(25%) / TXT(19%)。
  • TXT レコードは平均応答サイズ(64〜224 バイト)を模擬。

課題:
Vec
String
の過剰予約

Vec<T>
String
は、現在の長さだけでなく総容量ヒープへのポインタを持ちます。

  • キャッシュに格納後はアイテム追加が停止するため、容量フィールドは役に立ちません
  • 例:「8 つのアイテム用の容量」を持つが実際は「5 つ」だけの場合、3 つのスロットが無駄になります。

解決策:
Box<[T]>
Box<str>
の採用

作成後には成長しないため、容量予約スペースを削除できます。

  • 節約効果:
    • フィールドあたり 8 バイト、エントリあたり 64 バイトの節約。
    • 過剰なヒープメモリ予約がなくなります。
  • 累積効果: 2,500 億エントリにわたり、合計で 15 テラバイト以上のメモリ節約を実現。

3. リストとポインタの削減

セクションリストの最適化

回答、オーソリティ、追加セクションを別々のリストではなく、単一のリスト+オフセットで管理しました。

  • DNS レコード数は
    u16
    (2 バイト) で収まるため、個別のリストより短くなります。
  • 節約効果: エントリあたり 28 バイト(個別リストのポインタ 8 バイト × 2 + 長さフィールド)を削減。

パディング削減

Rust は構造体のサイズを整列倍に丸めるため、パディングが発生しますが、不要なフィールド削除によりこれを回避できました。

  • 例:複数の
    bool
    フィールドを単一の bitflag にパック化し、周囲のパディング削減を実現。

4. 「所有者」フィールドの廃棄

DNS レコードの「所有者」

レコードが属するドメインを示すフィールドですが、多くの場合は検索されたドメインと同一です。

;; 例:example.com A へのクエリ
;; ANSWER SECTION:
example.com.        300    IN    A        198.51.100.1
example.com.        300    IN    A        198.51.100.2

;; 例:CNAME の場合(所有者が異なる)
;; ANSWER SECTION:
example.com.        300    IN    CNAME    cdn.example.com.
cdn.example.com.    300    IN    A        198.51.100.1

Wire Format とキャッシュのトレードオフ

  • Wire Format: RFC 1035 に従い、重複ドメインは名前圧縮でポインタ化されます。
  • キャッシュ: 検索時の高速化(ホットパス)のために、通常は完全な所有者名を保存します(メモリ対速度のトレードオフ)。

解決策:条件付き保存

大多数のレコードは検索されたドメインと同じ所有者を持つため、これを廃棄し読み取り時に復元するようにしました。

pub struct Record {
    owner: Option<Box<Name>>, // None: ヒープ割り当てなし (同一所有者)
                                // Some: ヒープ割り当てあり (異なる所有者)
    class: Class,
    ttl: Ttl,
    rtype: Rtype,
    data: RecordData,
}
  • 効果: 検索されたドメインと同じ所有者を持つレコードの大半において、ヒープ割り当てを回避しました。

5. Enum のサイズ化と Box 化

課題:Enum のパディング問題

Rust の

enum
は常に最大のバリエーション分のメモリを確保します。

  • 例:
    NAPTR
    (136 バイト) が最大なら、A レコード (4 バイト) も 136 バイト+タグ+パディング(計 144 バイト)になります。
  • A/AAAA がトラフィックの 80% を超えるため、パディングによる無駄が巨大に累積します。

解決策:Box で包装

大きなバリエーションを別々のヒープ割り当て (

Box
) に移動させ、Enum自体は最小化しました。

pub enum RecordData {
    A(Ipv4Addr),                // インライン (4 バイト)
    Aaaa(Ipv6Addr),             // インライン (16 バイト)
    Txt(Box<Txt>),              // ヒープに移動 (8 バイトポインタのみ)
    Naptr(Box<Naptr>),          // ヒープに移動
    Svcb(Box<Svcb>),            // ヒープに移動
}
  • 効果: A/AAAA レコードあたり 120 バイトの節約。

Box 化によるコストと対策

Box 化には以下のコストが発生しますが、全体最適で削減可能です。

  1. アロケーターオーバーヘッド:
    • 最小サイズクラスに丸め上げられるため(例:TXT は OK, MX は 40→48 バイト丸め)、細かな無駄が発生します。
  2. メモリアクセス Locality の低下:
    • データがヒープ上で散らばるため、CPU キャッシュ効率が悪化します。

対策: 後述の「ワイアフォーマットでの保存」により、これらのコストを相殺し、さらにパフォーマンス向上を実現しました。


6. ワイアフォーマットでレコードを保存する(最終最適化)

従来の問題点

  • 完全な DNS メッセージ(Wire Format)を保存すると:
    • DNSSEC レコードは
      DO
      フラグの有無でバージョンが分岐するため、2 つのバリエーションが必要。
    • 毎回の検索でメッセージをパースするオーバーヘッドが発生。

解決策:生バイト+構造化フィールドハイブリッド

  • レコードデータを**生バイト (
    Box<[u8]>
    )**として保存し、他のメタデータは構造化フィールドのままにしました。
  • メリット:
    • Enum オーバーヘッドと Box ヒープ割り当ての排除。
    • データの連続配置による CPU キャッシュ Locality の改善。
  • 検索パスの高速化:
    • 直近の最適化により、A/AAAA/TXT/DNSSEC レコードのエンコード済みバイトを直接コピー可能に。
    • CNAME/Native など解析が必要なレコードは一部のみ該当し、全体としては負荷削減。

インサート時のメモリー管理

  • 再利用可能なスクラッチスペースバッファへ書き込み。
  • サイズが確定したら
    Box<[u8]>
    を割り当てて
    memcpy
    (1 つの大きなアロケータに集約)。
  • 効果: ベンチマークでキャッシュインサートスループットを**+13%**向上。

7. 結果:実環境での測定とパフォーマンス

メモリ使用量の削減(P99/P98/P99)

  • p99 メモリ: 9.3 GB → 5.3 GB (-42%)
  • 実在メモリ (Resident Memory): **-43%**削減。
  • キャッシュが満杯に近いほど、絶対的な節約量が大きくなりました。

エントリあたりのフットプリント比較

メトリックBeforeAfter変化率
エントリあたりのネットフットプリント953 バイト420 バイト-56%
エントリあたりの割り当て1.1 KB461 バイト-58%

注:ベンチマークでは 953→420 バイト(-56%)の削減ですが、実在メモリへ反映されたのはプロセス全体の特性によるものです。それでも艦隊全体で約100 テラバイトの集計ワーキングセットメモリが低減されました。

パフォーマンス向上

  • キャッシュインサートスループット: +43% (625,000 → 893,000 entries/s)
  • 検索遅延: -19% (828 ns → 670 ns)

今後の計画とコミュニティ

  • 再投資: 解放されたメモリをキャッシュ容量増加分に投入し、ヒットレートを高めアップストリームクエリボリュームを削減。
  • さらにの最適化: キャッシュ自体のさらなる改良を検討中。

関連リンク

同じ日のほかのニュース

一覧に戻る →

2026/08/28 0:56

小型モデルがやってきました

## Japanese Translation: 本質的なメッセージは、人工知能の最近の進歩により、運用コストが劇的に削減されたため、Luna などのコスト効率の高いモデルが消費者向けサブスクリプションにおいて実現可能になったという点です。以前は、高トークンコスト(旧モデルでタスクを実行する際に約$1 かかっていたのに対し、新しいモデルでは約$0.10 で済むというシナリオが例)が障壁となり、消費者にとって月次 AI プランは数学的に不可能でした。新しい技術により、企業は破格な予算なしに強力な AI にアクセスできるようになり、その結果として消費者向けグレードのサブスクリプションが登場しました。 企業の大部分の仕事は「トークン・スパイラー(大量生成型)」のカテゴリーに属しており、画期的な新しさを優先するよりも速度と応答性を重視しています。日常業務の約 95% は深い発見ではなく実行上のロジスティクスを占めています。Fable などの最先端モデルは稀な研究ブレイクスルー(「IQ 180」)には不可欠ですが、将来の市場はこの高コストのイノベーション用ツールと、標準的な対話向けの低価格で効率的なオプションの間で分かれることになります。現在の成功には、企業環境において安全性を確保し、ロール管理を行い、プロンプトインジェクション攻撃を防ぐための新しい「ハーネス(枠組み)」を構築することにかかっています。この変化により、企業は標準的なタスクのために高価な人間による「革新的思考者」を、応答性の高い AI エージェントで置換できるようになりました。結局のところ、この進化は AI を排他的な贅沢品から、日常業務用の実用的かつ手頃な価格のユーティリティへと変革させ、ついに大衆にとって消費者向けグレードのサブスクリプションが現実的となりました。

2026/08/27 23:08

メカニカル・ムーブメント No.507

## Japanese Translation: 本プロジェクトでは、507 の異なるアニメーションの完全なコレクションを編成することを目的としていますが、アーカイブからいくつかのエントリが現在欠落しています。利用者がこの拡大するライブラリをナビゲートできるよう、色分けされたサムネイルで完成作品と未完成のものを視覚的に区別し、右上に配置されている「prev」と「next」リンクにより、サムネイルページの間の簡単な閲覧が可能になっています。デジタル倉庫は、ヘンリー・T・ブラウンによる元のイラストをクラシックな技術書の参考資料と並べて収録することで歴史的意義を備えています。将来の発展には、507 の完全なセットが達成されるまで新しいアニメーションを順次リリースするものがあります。チームはタイムラインについて定期的に Facebook や Twitter などのソーシャルメディアプラットフォームで情報を共有することで透明性を維持しています。最終的には、ユーザーは現代的なデジタル作品と本物の歴史的アートワークの両方にアクセスできる利点を享受でき、プロジェクト自体に関する情報も「About」ページで入手可能です。

2026/08/28 2:53

振動符号化(vibecoded)ファザーを使用して FFmpeg でゼロ除算のバグを見つけた。

## Japanese Translation: AI データスクレイピングへの対抗として、ウェブサイト管理者は Anubis を一時的なシールドとして導入し、電子メールスパム削減のために元々設計された Proof-of-Work システム(Hashcash に類似)を利用しています。このアプローチは意図的にダウンタイムを引き起こすものであり、大量のデータ抽出を計算量的に高価にするため、課題期間中、リソースはすべてのユーザーに対してアクセス不能となりますが、個人レベルでは追加負荷は無視可能です。現在の構成は最新の JavaScript 機能に依存しており、JShelter といったプライバシーツールと対立するため、そのような拡張を利用する正当なユーザーを誤ってブロックしてしまうことがしばしば発生します。訪問者は中断を避けるためにこれらのプラグインを無効にする必要があります。過渡的な措置として、より精緻な防衛手段の開発中に Anubis を保留し、特にフォントレンダリング分析のような指紋付け技術を導入してヘッドレスブラウザを特定することを目指しています。究極の目標は、不要な障壁を人間のユーザーから取り除きつつ、自動化された悪用に対して堅牢な保護を維持するというニュアンスのあるセキュリティ姿勢への洗練化です。