提案 #1417
closedPhoto ModelのGdkPixbufCacheの戦略を再検討する
Description
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をカスタマイズし、一切オンメモリキャッシュを使わないようにした状態で実行
現在の実装はキャッシュとしては機能を果たしているが、ほとんど減ることがなく増加し続けていることが分かる。
Files
Updated by Shibafu Midorino over 5 years ago
- Status changed from 分類待ち to 実装待ち
- Assignee set to Shibafu Midorino
Updated by Shibafu Midorino over 5 years ago
- File mikutter-pixbuf-profile-20200107_vanilla.pdf mikutter-pixbuf-profile-20200107_vanilla.pdf added
- File mikutter-pixbuf-profile-20200107_weakstorage.pdf mikutter-pixbuf-profile-20200107_weakstorage.pdf added
WeakStorage化することで、多少はオブジェクトが解放されていることが確認できました。
数時間くらい計測したいのですが、なぜかWeakStorage版がクラッシュするようになり上手く計測できず……。
ref: https://social.mikutter.hachune.net/@shibafu528/103438974781402072
Updated by Shibafu Midorino over 5 years ago
- Status changed from 実装待ち to レビュー待ち
- Assignee deleted (
Shibafu Midorino) - ブランチ set to topic/1417-weak-pixbuf-cache
ひとまず実装はこんなものかなという感じになったのでレビュー待ちにします。
#1417-3 の時点ではSkinに限って特殊な実装を入れていたのですが、効果に疑問があるため廃止しました。
Updated by toshi_a 初音 over 5 years ago
- Assignee set to Shibafu Midorino
- Target version set to 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しちゃってください。