ソフトウェア

たった1.6MBのGIF画像によってDiscourseのバックアップが377GBに膨らんだ原因とは?


オープンソースのインターネットフォーラムシステムであるDiscourseで、サイトのバックアップがたった1本のGIF画像によって大きく膨らんでいた事例が報告されました。

How Jennifer Aniston and Friends Cost Us 377GB (and Broke EXT4 Hardlinks) - Discourse
https://blog.discourse.org/2026/04/how-jennifer-aniston-and-friends-cost-us-377gb-and-broke-ext4-hardlinks/


Discourseで開発を担当するジェイク・ゴールズボロー氏は、アップロードが数百GBあるサイトでバックアップの作成中にディスク容量が足りなくなり、処理が止まってしまうという問題について調べていました。その過程で、システム上はアップロード済みファイルが数百GBあるように見えていても、実際には同じ中身のファイルが大量に重複していることに気付いたとのことです。

容量を大きく膨らませていたのは、テレビドラマ「フレンズ」に登場するレイチェル・カレン・グリーンがうれしそうに飛び跳ねるGIF画像でした。


このGIF画像のファイルサイズは約1.6MBで1個だけならそれほど大きくありませんが、同じGIF画像が24万6173回も別ファイルとして保存された結果、バックアップ内で377GB分の肥大化を招いていました。ゴールズボロー氏によると、このGIF画像は投稿やプライベートメッセージなど、サイト内のさまざまな場所で繰り返し使われていたとのことです。

このGIF画像が別ファイルとして保存されていった原因は、Discourseの「secure uploads」という機能でした。secure uploadsは画像やファイルを公開範囲ごとに分けて安全に扱うための機能で、たとえばプライベートメッセージ上で使った画像を公開投稿にも使うと、同じ画像でも別のファイルとして扱われます。

そのため、人気のGIF画像や画像が、投稿・プライベートメッセージ・別カテゴリーへの再投稿などで何度も使われると、同じ中身の別ファイルがその度に増えていくことになります。ゴールズボロー氏は「普段サイトを使っている時にはこの重複は目立ちにくいものの、バックアップでは大きな問題になる」と説明しています。


実際に、ある顧客のサイトではアップロードされたファイルの総量が432GBありましたが、中身を調べてみると重複分を除いた実体は26GBしかなかったそうです。

同一ファイルが重複保存されてバックアップに失敗する問題に対応するため、Discourseは同じ内容のファイルをまとめて扱う処理を導入しました。ファイルの中身が同じかどうかを見分けるための識別子であるSHA-1を元に中身が同じファイル同士を同じグループにまとめ、各グループでは最初の1個のファイルだけをダウンロードし、残りは別々のファイル名から同じ実体データを指す「ハードリンク」で処理するという方法です。

この方法にすればハードリンクの関係を保ったままバックアップ用のアーカイブを作れるため、本来なら26GB分だけをダウンロードし、そのまま26GB分のバックアップを作れるはずでした。


しかし、実際の運用環境で問題が発生しました。大規模なサイトでのバックアップを始めたところ、同じ内容のファイルをハードリンクに置き換える処理は6万4000件台まではうまく動いていましたが、6万5000件あたりに達するとハードリンクを作れなくなり始めたそうです。原因はLinuxで広く使われている「ext4」というファイルシステムの制限で、1つの実体ファイルに対して、作れるハードリンクの数がおよそ6万5000個までとされていました。

バックアップ自体はハードリンクを作れなくなった後に別の方法へ切り替えるフォールバック処理によって最後まで完了しましたが、24万6173個ある重複ファイルを1回のダウンロードで済ませるつもりが、実際には最初の1回に加えて約18万1000回のフォールバックダウンロードが発生したとのことです。24万6173個全てを別々にダウンロードするよりはマシだったものの、期待していたような結果ではなかったとゴールズボロー氏は振り返っています。


そこでDiscourseはさらなる修正を行いました。具体的には、まずこれまで通りハードリンクを作り、ハードリンクの数が上限に達してエラーが出たらその時点で元のファイルを手元にコピーし、以降はそのコピーを新しい元ファイルとして使うという方法に変更。この方法であればあらかじめ「このファイルシステムでは何個までハードリンクを作れる」と決めておかなくても、実際に上限へ達した時だけ新しいコピーへ切り替えれば済むとのことです。「どのファイルシステムでも使うことができて、特別な追加設定もいらない」とゴールズボロー氏は説明しています。

ゴールズボロー氏は、ext4でハードリンク数に上限が設けられているのは、単なる恣意的な制限ではなく、特定の不具合や攻撃を防ぐ役割があるためだとした上で、本番環境では事前に気付かなかった問題が見つかることや、全体ではうまくいっていても1本のGIFに処理が集中するような極端なケースでは別の問題が起きるため、そうした例外まで想定しておく必要があるということを教訓として挙げています。

この記事のタイトルとURLをコピーする

・関連記事
無料で同じ内容のファイルを見つけてクローンに置き換えストレージの空き容量を確保できるmacOSアプリ「dedup」 - GIGAZINE

「バックアップ」と「アーカイブ」の違いを意識しないと大きな問題が発生する可能性がある - GIGAZINE

不測の事態で重要なデータを失ってしまうのを防ぐ「3-2-1バックアップルール」とは? - GIGAZINE

GIFを最速でアニメーションさせるには遅延を最低値にしてもダメ、一体どうすればいいのか? - GIGAZINE

in ソフトウェア,   ネットサービス, Posted by log1b_ok

You can read the machine translated English article What caused a mere 1.6MB GIF image to sw….