提案 #1417
完了Photo ModelのGdkPixbufCacheの戦略を再検討する
説明
TL;DR¶
オンメモリキャッシュを時限キャッシュからWeakrefに変えることで、実用上困らない範囲でメモリの節約ができるかも。
現在の問題¶
Photo ModelのGdkPixbuxCacheが、過剰にアイコンキャッシュを持つことが度々あります。
短時間の起動セッションであればあまり問題にはなりませんが、長時間起動していると不要である可能性のあるPixbufが蓄積され続けることとなります。
また、現在のキャッシュ戦略ではごく短時間に、または複数のTLで複数回出現したユーザーのアイコンは一気に生存期間が長くなります。
これは必要以上に生存するオブジェクトを増やしているおそれがあります。
もっとも、アイコン程度であればあまり大きなPixbufではないので、十分なメモリを持つ環境では無視できるとも言えます。
変更案¶
GdkPixbufCacheを現在の時限キャッシュから、Weakrefを用いて現在使用されているもののみ生かすようにする案が、mikutter Slackにて出ています。
頻繁にTLに出現するユーザーにフォーカスを当てたキャッシュ戦略であり、不要になったPixbufはすぐに捨てられるようになります。
また、ディスクキャッシュをもっと活用するように改良する案も上がっていて、これらを組み合わせることで
ネットワークに負荷をかけすぎることもなく、メモリの節約が期待できます。
(これは別チケットで良さそうです)
添付資料¶
常用環境においてキャッシュ戦略を変えることでメモリ消費がどのように変化するかを調査するため、以下の条件を基準として設定した。
- mikutter 4.0.0 (27493b3d)
- Pixbufの生成元を特定するため、Pixbufにタグ情報を追加できるようにするパッチを適用
- 私の普段使いのプロファイル (プラグイン約60個)
- moguno/mikutter-subparts-image
- toshia/image-file-cache-ng
- shibafu528/pixbuf_profiler (今回のPixbuf数のプロファイル記録用で作成したプラグイン)
そして、それぞれ以下の追加条件でプロファイルをとった。
- vanilla = 上記環境そのままで実行
- nocache = 上記環境のgtk_photo_pixbuf.rbをカスタマイズし、一切オンメモリキャッシュを使わないようにした状態で実行
現在の実装はキャッシュとしては機能を果たしているが、ほとんど減ることがなく増加し続けていることが分かる。
ファイル
Shibafu Midorino さんがほぼ5年前に更新
- ファイル mikutter-pixbuf-profile-20200107_vanilla.pdf mikutter-pixbuf-profile-20200107_vanilla.pdf を追加
- ファイル mikutter-pixbuf-profile-20200107_weakstorage.pdf mikutter-pixbuf-profile-20200107_weakstorage.pdf を追加
WeakStorage化することで、多少はオブジェクトが解放されていることが確認できました。
数時間くらい計測したいのですが、なぜかWeakStorage版がクラッシュするようになり上手く計測できず……。
ref: https://social.mikutter.hachune.net/@shibafu528/103438974781402072
Shibafu Midorino さんがほぼ5年前に更新
- ステータス を 実装待ち から レビュー待ち に変更
- 担当者 を削除 (
Shibafu Midorino) - ブランチ を topic/1417-weak-pixbuf-cache にセット
ひとまず実装はこんなものかなという感じになったのでレビュー待ちにします。
#1417-3 の時点ではSkinに限って特殊な実装を入れていたのですが、効果に疑問があるため廃止しました。
toshi_a 初音 さんがほぼ5年前に更新
- 担当者 を Shibafu Midorino にセット
- 対象バージョン を 4.1 にセット
4.1.0 (develop) にmergeしようとしたのですが、conflictしました。
Conflicts:
core/mui/gtk_photo_pixbuf.rb
plugin/skin/model/image.rb
こっちで簡単にmergeできたので、developをmergeしたものを topic/1417-weak-pixbuf-cache にpushしました。一応確認して、良さそうならmergeしちゃってください。