Gauche > Archives > 2013/02/03

2013/02/03 00:25:39 UTCwasao
#
環境によってまちまちですが、大体, 数十秒に一度リークしてしまいます。Gentoo Linux 3.7.1 x86_64とFreeBSD 6.2-RC1 i386上で確認しました。
2013/02/03 01:00:36 UTCshiro
#
Linux x86_64だとあまりうちと違いがありそうにもないなあ。「数十秒に一度リーク」というのは具体的にどうなるのですか? メモリ使用量が増えるということか、それともクラッシュするということ?
2013/02/03 01:04:32 UTCwasao
#
単に増え続けるだけで動作に問題はありません。
2013/02/03 01:11:54 UTCshiro
#
その「数十秒に一度」どういうふうになるのですか? (何で観察していると何がどうなるのか、ということです)
2013/02/03 01:16:41 UTCwasao
#
何度もすみません.. `top -p`で観察してると数十秒に一度Resident Sizeが増大していきます。
2013/02/03 01:19:50 UTCshiro
#
おお、ok。確認しました。わずかづづですが増えて行きますね。
2013/02/03 01:28:20 UTCshiro
#
sleepを0にしたり、nanosleepで1000nsとか短いウェイトを入れてみたら確かに増えないんですが、観察時点で既にRSSが(1秒sleepの時に比べて)大きいんで何とも言えないですねぇ。一定量でサチるなら、それまで徐々に増えて行くのは別に異常ではないので)。wasaoさんの環境で、上のコードが一定量でメモリ増加が止まるということですが、その止まった時のメモリサイズと、sleepを抜いた時に見えるメモリサイズがいくつだったかわかりますか?
2013/02/03 01:36:31 UTCshiro
#
GC環境下でリークというのは、アクティブデータセットがboundedなのにメモリ使用量がunboundedに増えて行くことなので、「一定量でサチる」なら(その一定量が常識外れでなければ)正常動作の範囲です。単に回収が遅延されているだけです。デーモンでunboundedに増えていったなら、それは上のコードとは別の原因でリークが起きているんじゃないかという気がします。
2013/02/03 01:42:02 UTCshiro
#
なお0.9.3.3ではforceにメモリリークのバグがあることがわかってて、lazy/delay/forceを使ったutil.streamなどの遅延ストリームを使うと漏れまくりです。lazy-sequenceの方は大丈夫だけど。
2013/02/03 01:50:56 UTCwasao
#
止まった時のメモリサイズとsleepを抜いた時のメモリサイズは同じです。確かに他に原因がありそうです。ありがとうございました。
2013/02/03 02:03:17 UTCshiro
#
あとありそうなのが、「weak-gc-robustでないデータ構造」というもので、例えばリストの尻尾にどんどん新たなデータ構造が追加されてゆく場合です。リストの頭の方はごみだからと安心していると、偽ポインタが頭の方をたまたま指していた場合にそれ以降のリストが回収されません。こういうunboundedに増えて行く構造では、使い終わったリストのcdrをset!してリンクを陽に切るといった配慮が要ることがあります。
2013/02/03 07:08:44 UTCcryks
#
こんにちは、またまたmakikiについてです(今更ですがmakikiもここで良かったですか?)。cgi-handler経由で出力するときに、出力するデータが大きくなると(<buffered-output-port>のflushが2度以上呼ばれると)データが壊れてしまいます。こんな感じですかね:
#
--- a/makiki.scm
+++ b/makiki.scm
@@ -579,7 +579,7 @@
                                   (get-cgi-metavariables req script-name)]
                                  [current-output-port
                                   (make <buffered-output-port>
-                                    :flush (^[v f] (enqueue! q v)
+                                    :flush (^[v f] (enqueue! q (u8vector-copy v))
                                                    (u8vector-length v)))])
                     (unwind-protect (proc "")
                       (close-output-port (current-output-port))))
2013/02/03 07:13:02 UTCshiro
#
makikiもここでいいですよー。ユーザが増えてくれると色々見つかってうれしいです。確かにvは上書きされ得るのでそのまま持ってちゃだめですね。ありがとうございます。
2013/02/03 07:22:22 UTCshiro
#
pushしたけど、今見直してみたら後で全部つなげるんだからstring port使ってflushごとに中身を書き出して最後にget-stringすればいい気がしてきだ。
#
>cryks これで動きますか? https://gist.github.com/4700835 cgi-handlerはまだテスト書いてないので…
2013/02/03 07:43:23 UTCshiro
#
あ、header+contentがu8vectorを要求するからだめだな。
#
修正した。 https://gist.github.com/4700835
2013/02/03 08:05:44 UTCcryks
#
正常に動いています。
2013/02/03 10:14:00 UTCshiro
#
先ほどのパッチはデバッグスタブが入ったままでした。今gitにpushしてあるのは直してあります。
2013/02/03 23:56:15 UTCshiro
#
JavaScript書いてて、エラーの出る行をとりあえず;でコメントアウトして走らせてみるとまだそこでエラーが出てなぜだ、となる。