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秒まで改善しました。同様の構成を運用している場合は、まずソース画像の形式を見直すのが手早い改善につながります。
- めたん
- ありがとうございました。