プロジェクト

全般

プロフィール

提案 #1417

完了

Photo ModelのGdkPixbufCacheの戦略を再検討する

Shibafu Midorino さんがほぼ5年前に追加. ほぼ5年前に更新.

ステータス:
終了
優先度:
通常
対象バージョン:
プラグイン名:

説明

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数のプロファイル記録用で作成したプラグイン)

そして、それぞれ以下の追加条件でプロファイルをとった。

  1. vanilla = 上記環境そのままで実行
  2. nocache = 上記環境のgtk_photo_pixbuf.rbをカスタマイズし、一切オンメモリキャッシュを使わないようにした状態で実行

現在の実装はキャッシュとしては機能を果たしているが、ほとんど減ることがなく増加し続けていることが分かる。


ファイル

mikutter-pixbuf-profile-20191229_vanilla.pdf (33.1 KB) mikutter-pixbuf-profile-20191229_vanilla.pdf Pixbufプロファイル (通常環境) Shibafu Midorino, 2020-01-02 18:01
mikutter-pixbuf-profile-20191229_nocache.pdf (31.3 KB) mikutter-pixbuf-profile-20191229_nocache.pdf Pixbufプロファイル (オンメモリキャッシュなし) Shibafu Midorino, 2020-01-02 18:01
mikutter-pixbuf-profile-20200107_vanilla.pdf (23.5 KB) mikutter-pixbuf-profile-20200107_vanilla.pdf Pixbufプロファイル (tag: 4.0.2) Shibafu Midorino, 2020-01-08 01:10
mikutter-pixbuf-profile-20200107_weakstorage.pdf (23.1 KB) mikutter-pixbuf-profile-20200107_weakstorage.pdf Pixbufプロファイル (WeakStorage化 102150e1) Shibafu Midorino, 2020-01-08 01:10

Shibafu Midorino さんがほぼ5年前に更新

Shibafu Midorino さんがほぼ5年前に更新

  • ステータス分類待ち から 実装待ち に変更
  • 担当者Shibafu Midorino にセット

Shibafu Midorino さんがほぼ5年前に更新

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しちゃってください。

Shibafu Midorino さんがほぼ5年前に更新

  • ステータスレビュー待ち から 終了 に変更

動作が確認できたため、マージしました。

他の形式にエクスポート: Atom PDF