プロジェクト

全般

プロフィール

最適化 #930

バグ #925: mikutterがメモリを大量に消費することがある

Message::MessageUserの代わりに新しくUserを作る

Osamu Koga7ヶ月前に追加. 7ヶ月前に更新.

ステータス:
終了
優先度:
通常
担当者:
対象バージョン:
開始日:
2016-11-14
期日:
進捗率:

0%

プラグイン名:

説明

#925 の文字列リークは、各ツイートについて1つ作られるMessage::MessageUserが原因ではないかと思われます。このオブジェクトはUserオブジェクトの他に、TweetにくっついてきたUser情報の生JSON(をparseしたもの)を保持しており、実質Userオブジェクトが2倍以上あるような状況になっています。

>>> GC.start; ObjectSpace.each_object(Message::MessageUser).count
5216
>>> GC.start; ObjectSpace.each_object(User).count - ObjectSpace.each_object(Message::MessageUser).count
4063

元々このクラスは、ユーザがアイコンを変更したりしても過去のアイコンを保持できるようにするためのものでしたが、Retriever::Modelの分離度が上がったので、ユーザの見た目が変わるような変更があったときには新しいUserを生成してやることで、古いツイートは古いUserを保持しながら、新しいUserfindbyidnameで拾えるようにできます。
Stringが大量にダブる問題は、これである程度解決できるはず。

mikutter-memory-plot.png 表示 (5.84 KB) Osamu Koga, 2016-11-18 10:25

mikutter-memory.png 表示 (123 KB) Osamu Koga, 2016-11-18 10:42

mikutter-memory-plot-final.png 表示 (6.76 KB) Osamu Koga, 2016-11-18 22:51

mikutter-memory.png 表示 (125 KB) Osamu Koga, 2016-11-18 22:55

関係しているリビジョン

リビジョン c8392e59 (差分)
Osamu Koga7ヶ月前に追加

Message::MessageUserを消す refs #930

履歴

#1 Osamu Koga7ヶ月前に更新

  • ステータス進行中 から パッチ適用待 に変更

#2 Osamu Koga7ヶ月前に更新

このパッチを適用したらメモリ使用量のグラフが劇的に改善しました。下のグラフは、psの結果に出てくるRESを1分毎に記録したものです。
水色はdevelop HEAD( 8ceda65 gtk2 3.0.9)、紫と緑(重なってるけど)はそれぞれこのパッチ適用をした3.0.9と3.1.0の結果です。縦軸はメモリ使用量(単位はKBなので、2*10^6は2GBです)。

あと例のアレ。ニンジャスレイヤーの更新があったことを考えると、かなり落ち着いていると思います。

YUKI.N@aincrad> cat /tmp/strings.txt | sort | uniq -c | sort -k1 -r | head -n30
   5964 ja
   4283 fit
   3285
   2985 https
   2979 twitter.com
   1887 none
   1780 C0DEED
   1705 000000
   1488 333333
   1450 /home/osak/app/mikutter/core/lib/uithreadonly.rb:22:in `block (2 levels) in singleton class'
   1427 crop
   1413 photo
   1312 Tokyo
   1102 ~>
   1080 DDEEF6
    980 https://abs.twimg.com/images/themes/theme1/bg.png
    980 http://abs.twimg.com/images/themes/theme1/bg.png
    966 recent
    901 low
    892 njslyr
    794 1DA1F2
    776 mikutter.rb:94:in `<main>'
    776 mikutter.rb:65:in `boot!'
    776 /home/osak/app/mikutter/core/plugin/gtk/mainloop.rb:10:in `mainloop'
    776 /home/osak/app/mikutter/core/plugin/gtk/mainloop.rb:10:in `main'
    760 #njslyr
    717 /search
    711 >=
    597 ruby
    582 lib

#3 Osamu Koga7ヶ月前に更新

ついでにmemory_profilerの結果も貼っときます(gtk2 3.1.0)

#4 toshi_a 初音7ヶ月前に更新

お、すげえ!最近密かにUserがMessageより多くなってて気になってたんだけど(3.5。3.4では未検証)、改善されてるようですね。多分Userの発行数自体が落ち着いたおかげで、メモリリークがマシになったのかな。

コードもMessageUserが消えてベターな感じになったので良いと思います。今日にでもmergeしますね

#5 Osamu Koga7ヶ月前に更新

だんだん伸びて行って、最終的には元とあまり変わらなくなってしまった

#6 Osamu Koga7ヶ月前に更新

Stringの増え方は抑制されたものの、まだ何か漏れてそうですね

#7 toshi_a 初音7ヶ月前に更新

  • ステータスパッチ適用待 から 終了 に変更

既に取り込んだので完了にしときます

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