S3互換のR2に移行後、アバターの読み込みに時間がかかる

ふむ、3つの異なる問題のいずれかだと思うのですが、最も可能性が高いのはリアルタイムでのリサイズです。

1. リアルタイムのアバターリサイズ

アップロードをR2に移行した際、元の画像が移動しました。ただし、Discourseでは投稿用(45px)やユーザーカード用(120px)など、さまざまなサイズのアバターを使用しています。

これらの特定の最適化されたサイズが完璧に移行されなかった場合、またはまだ生成されていない場合、Discourseはユーザーがクリックした瞬間にそれらを同期的に生成する必要があります。

  1. DiscourseがR2から元の avatar をローカルサーバーにダウンロード
  2. ImageMagickを使用してリサイズ
  3. 新しいサイズをR2にアップロード
  4. ブラウザを新しいURLにリダイレクトし、このプロセスには3〜4秒かかる

確認方法: ページをハードリフレッシュしてください。最初にアバターが3〜4秒かかるが、2回目には即座に読み込まれる場合、まさにこれが起きていることです。

修正方法: ユーザーが閲覧するにつれてサイズが生成されるため、自然と修正されます。ただし、SSHでサーバーに接続して以下のコマンドを実行することで、サーバーにすべてのアバターをバックグラウンドでプリ生成させ、即座に修正することもできます。

./launcher enter app
rake avatars:refresh

2. 3秒のIPv6タイムアウト

アバターが複数回のリフレッシュ後も毎回3〜4秒かかる場合、ネットワークタイムアウトに遭遇している可能性が高いです。

Cloudflare R2 APIエンドポイントはデュアルスタック(IPv4とIPv6の両方を使用)です。サーバーのドロップレットにIPv6アドレスが割り当てられているが、ホストのIPv6ゲートウェイが正しくルーティングされていない場合、R2バケットへのRuby内部接続はまずIPv6を試み、3秒間ハングし(これはLinuxのデフォルトTCPタイムアウトです)、失敗してからIPv4を使用して即座に成功します。

確認方法: サーバーにSSHで接続し、以下を実行してください。

curl -I -6 https://cloudflare.com

数秒間ハングして失敗する場合、サーバーのIPv6が壊れており、内部のS3 APIチェックごとに3秒の遅延が発生しています。

修正方法: ホストコントロールパネルでIPv6ルーティングを修正するか、ドロップレット全体でIPv6を無効にする必要があります。

3. Gravatarの遅延

サイトがGravatarの更新を確認するように設定されている場合、アバターを描画する前にGravatarの外部サーバーにピングを送信する可能性があります。サーバーの送信接続が遅い場合(これもDNSやIPv6に関連していることが多いです)、アバターの描画がブロックされる可能性があります。

確認方法: サーバーで以下を実行してください。
curl -I -6 https://gravatar.com
3秒間ハングする場合、IPv6が壊れています(上記参照)。

Gravatar関連の修正: Discourseの設定で「Gravatarを自動的にダウンロード」を一時的にオフにし、それが修正されるか確認してください。これが問題だとは思いませんが、もし問題であれば、この設定をオフにしたままにするか、上記2のIPv6ルーティングを修正するか、DNSリゾルバーを変更してください。