Nextcloudの内部画像処理を軽くしてサクサク表示させる (1) 初期設定

2022-10-10
  • B!

Nextcloud

Nextcloudはファイル一覧表示やギャラリー表示で必ず写真の小さなプレビュー画像を表示する。当たり前の機能なのだが、実はこれ気をつけないとサーバに過大な負荷をかけるのでチューニングが必要ですよという話。
ファイル一覧
Nextcloudのファイル一覧画面
この小さな写真をプレビュー画像という。これらを表示するときにImageMagick経由で元の写真や動画ファイルから縮小版の画像を生成している。基本的な動作は次のようになっている。
  • 画面表示の時にプレビューがなければ縮小画像を生成してサーバ内に保存する
  • 既存のプレビュー画像があれば再利用する
ギャラリープラグインによる中程度の画像一覧が必要な画面では、大きめのプレビュー画像が生成される。
ギャラリー
中程度の大きさのプレビュー画像の例

さらに1枚単位で拡大表示する際は、2048 x 2048ピクセルというようなもっと大きなプレビュー画像が生成される。
拡大用表示
最も大きなプレビュー画像の例

何が問題なのか

画面ごとにさまざまな大きさのプレビューを作成する挙動の何が問題なのだろうか?

それは、写真や動画をたくさん保存しているサーバではプレビュー画像の枚数分だけJPEGファイルが生成されるので、ストレージに負担がかかることだ。容量だけでなく、ファイル数が増えてインデックスが増えるとパフォーマンスも落ちる。バージョンアップ時のディレクトリの移動も大変だ。

私の場合、写真や動画は70,000枚ほどある。それでも写真愛好家に比べると枚数は少ない方である。問題は、例えばNextcloudが画面シーンに合わせてプレビュー画像を5種類生成すると、

7万枚の画像 × 5種類のプレビュー = 35万枚のプレビュー画像を生成

これだけの画像ファイルがサーバ内に生成されてしまうのである。

初期設定による対応

今回は初期設定で可能な範囲で対応をする。大きなプレビュー画像の生成をやめて、大きなプレビュー画像が必要な場面では、そこそこ大きめのプレビューを再利用する設定にすることで少し負担を減らす。
% cd /usr/local/www/nextcloud	## TrueNASプラグインの場合。Nextcloudのインストール先へcdする
% php occ config:system:set preview_max_x --value 1024
% php occ config:system:set preview_max_y --value 1024
config.phpの内容が以下のように書き変わる
  'preview_max_x' => '1024',
  'preview_max_y' => '1024’,
この設定を行うと、プレビューは最大1024 x 1024ピクセルの枠内までの生成となる。さらに大きな画像が必要となったとき、Nextcloudは1024x1024の最大プレビューのJPEGファイをを使い回して表示する。これで少し負担が減る。体感でテストして1024 x 1024が許容範囲であった。例えばそれよりも小さい768 x 768では拡大表示の時に画像が荒すぎてやや苦しかったので。

次に、デフォルトのプレビューのJPEG品質は90であるが、これを70まで減らす。
% php occ config:app:set preview jpeg_quality --value=“70"
% php occ config:system:set jpeg_quality --value 70
プレビュー画像のJPEG画質については、体感でテストして70が妥協点とした。大きく拡大した時は少々画質が気になる時もあるが、Nextcloudの用途はファイルのプレビュー確認用なので割り切っている。高画質画像は元ファイルをダウンロードすればよいので。

Nextcloudの挙動と課題

Nextcloudのプレビュー画像生成に関する設定はこちらの公式ドキュメントに書いている。
プレビュー画像を(Web画面上のimgタグで)拡大して再利用する。拡大率はデフォルト設定で10倍まで。

 ということなので、1024 x 1024ピクセル枠のプレビュー画像を最大と設定しておけば、1枚画像を拡大表示するときはimgタグ上で10倍までは引き伸ばして表示することになる。

拡大表示はこれでよい。しかし、問題は縮小表示である。

縮小表示については、わりと好きなだけプレビュー画像のJPEGファイルが大量に生成されているようなのである。公式な説明はないが、既存のプレビュー画像ファイルはWeb画面上で縦横1/2までの大きさまでimgタグ上で縮小表示させて再利用されているように見える。しかし、それよりも小さく表示させる場合はプレビューを再生成しているようだ。あるいは、各プラグインが使用する画像縦横サイズに特にルールはないので、各プラグインのリクエストで小さなプレビュー画像ファイルがどんどん生成されるようにも見える。

この点は今後も様子を確認しながら対策を考えることにする。

Profile

Profile header image


ampspeed

炎上している開発プロジェクトの火消し屋をやってます。

サイト内検索