Cantaloupe IIIF画像サーバーのパフォーマンスチューニング

AWS EC2上のCantaloupe IIIF画像サーバーで初回タイル取得に8秒かかっていた問題を、ピラミッドタイルTIFF変換・JVMヒープ増加・CloudFront導入によって0.84秒に改善した記録。

iiifcantaloupeawscloudfrontdockers3

台本(フルテキスト)

動画の掛け合いを書き起こしたものです。音声を再生しづらい場合はこちらをお読みください。

オープニング

  • Cantaloupe IIIFサーバーの初回タイル取得を8.8秒→0.84秒に改善
  • 4つの施策で段階的に高速化
はう
今日はAWS EC2上のCantaloupe IIIFサーバーのパフォーマンスチューニングの記録を紹介します。
めたん
最初はどのくらい遅かったんですか?
はう
初回タイルアクセスに8.8秒かかっていました。テスト画像は4万6825×2万8127ピクセルの大判TIFです。
めたん
最終的にはどのくらいになりましたか?
はう
0.84秒まで改善できました。ピラミッドタイルTIFF変換、JVMヒープ増加、キャッシュ永続化、CloudFront導入の4施策です。
めたん
ボトルネックはどこにあったんですか?

ボトルネック分析

  • strip形式TIFは1タイルにS3から9チャンク読み込みが必要
  • JVMヒープ512MB・キャッシュは再起動ごとに消失
めたん
初期状態の問題点を教えてください。
はう
最大の問題はソース画像の形式でした。strip形式TIFは1タイルを返すのにS3から9チャンク、約2MBの読み込みが必要です。
めたん
他には何がありましたか?
はう
JVMヒープがコンテナメモリ2GBに対して512MBと少なかった点、キャッシュボリュームが未永続化で再起動ごとに消えていた点もありました。
めたん
IIIFのタイル配信にはピラミッド形式が向いているんですね。
はう
そうです。ピラミッドタイルTIFFはタイル単位でランダムアクセスができるので、必要な部分だけ読み込めます。

施策1: ピラミッドタイルTIFF変換

  • libvipsのtiffsaveでピラミッドタイルTIFF変換
  • 初回タイルが8.8秒→0.7〜1.3秒に改善
めたん
最も効果が大きかったのはどの施策ですか?
はう
ピラミッドタイルTIFF変換です。libvipsのtiffsaveコマンドで変換します。Q85でピラミッド付き、タイル幅256×高さ256です。
めたん
変換後はどのくらい速くなりましたか?
はう
初回タイルが8.8秒から0.7〜1.3秒になりました。S3からの読み込みチャンク数が9回から大幅に減りました。
めたん
ファイルサイズはどうなりましたか?
はう
Q85でピラミッド付きタイルTIFFが219MBでした。タイル単位のアクセスが可能になったことが速度改善の主因です。

施策2〜4: JVM・キャッシュ・Cantaloupe更新

  • JVMヒープを1536MBに増加
  • 正しいdocker-composeでキャッシュを永続化
めたん
JVMヒープの設定はどうするんですか?
はう
islandora/cantaloupeイメージはCANTALOUPE_HEAP_MAXとCANTALOUPE_HEAP_MIN環境変数に対応しています。1536MBに設定しました。
めたん
JAVA_OPTSは使えないんですね。
はう
そうです。JAVA_OPTSは起動スクリプトに参照されないため効きません。キャッシュの問題は正しいdocker-composeファイルで起動するだけで解決しました。
めたん
Cantaloupeのバージョンアップでも改善がありましたか?
はう
2.0.10から6.3.12への更新で初回タイルが1.3秒から0.84秒になりました。画像処理時間が約4割短縮されました。

CloudFront導入

  • 日本からEC2 us-east-1へのRTT 146msをエッジで削減
  • info.jsonの@id問題はCANTALOUPE_BASE_URIで解消
めたん
CloudFront導入の効果は何ですか?
はう
EC2がus-east-1にあるため日本からのアクセスにRTT約146ミリ秒が加算されていました。CloudFrontを前段に置くと東京エッジから配信されます。
めたん
CloudFrontを入れたときに問題が出たと聞きましたが?
はう
info.jsonの@idフィールドがオリジンドメインになってしまう問題が出ました。CANTALOUPE_BASE_URIにCloudFrontドメインを設定して解消しました。
めたん
キャッシュ済みタイルはどのくらい速くなりますか?
はう
日本からのアクセスでキャッシュヒット時は0.1〜0.2秒程度で返ります。Miradorの並列20タイルシミュレーションでもキャッシュ済みなら1.3秒でした。

まとめ

  • ピラミッドタイルTIFF変換が最も効果的
  • 8.8秒→0.84秒を4施策で達成
めたん
今日のまとめをお願いします。
はう
最も効果的だったのはソース画像をピラミッドタイルTIFFに変換することです。strip形式TIFからの変換で8.8秒が0.7〜1.3秒になりました。
めたん
その後のCantaloupeアップデートとCloudFrontでさらに改善したんですね。
はう
最終的に0.84秒まで改善しました。同様の構成を運用している場合は、まずソース画像の形式を見直すのが手早い改善につながります。
めたん
ありがとうございました。