Pixelfed内部の画像リサイズ処理、Intervention Imageライブラリを介してGDかImageMagickに投げられるのだけど、元の画像が大きいとそれを開くだけでメモリをやたら食うので、JPEGヒントを活用して改善できないか考えている。VPSのメモリに限りがあるので、ピンポイントでしか動かない処理のためにジョブワーカーに割り当てるメモリをあまり増やしたくない。
ImageMagickを使えば可能そうだが、Intervention ImageがJPEGヒントの指定に対応していない感じ。どうしようね。

参考:blog.mirakui.com/entry/2011012

よく調べたら、Pixelfedでワーカーがメモリ不足になるの、リサイズ処理ではなくBlurhashの生成のところらしい… :blobcatthinking2:

見るからに画像サイズ以上にメモリを食いそうなデータ構造ではある…(Pixelfedの app/Util/Media/Blurhash.php)

これ、どうもPixelfedのオリジナルではなくて、オリジナルライブラリがあるようだ。
github.com/kornrunner/php-blur

それはともかく、高々640x480の画像に対するBlurhash計算が128MBで足りないのは本当か?実験してみよう。

本当だった…。入力画像は640x427だったが、RSS 157MBって。
128MBで落ちるが256MBでうまくいっているのと符合する。

BlurHashのC言語実装をPHP拡張モジュールにコンパイルすることを試みた。高速化の効果は十分あり。あとはメモリ消費の改善効果がどれくらいあるかな。

[PHP8対応] PHP拡張モジュールを自作してBlurHashの計算を高速化する qiita.com/everylittle/items/21

フォロー

ローカルのテスト用環境で、Pixelfedが動いているPHPのコンテナに拡張モジュールをインストールして動かしてみた。
RSS 25128KBなので、130MBほど減らせた。しかも実行時間も1回あたり2秒→0.1秒にまで短縮。これなら上出来!

あとはPixelfed側のBlurHash生成コードを書き換えれば完成だ。

ログインして会話に参加
Fedibird

様々な目的に使える、日本の汎用マストドンサーバーです。安定した利用環境と、多数の独自機能を提供しています。