Workerプロセスの死活監視

359 views
Skip to first unread message

hagino3000

unread,
Jun 22, 2010, 6:43:08 AM6/22/10
to html5-developers-jp
hagino3000です。

WebWorkerで生成したWorkerプロセスが数十分経つと何も言わずに死んでいるという問題に、現在直面しています。環境はMacOSX
Snow leopard + Chrome 5.0.375.70 です。
今の所プロセスが死ぬ原因がわからないので、死活監視処理を入れようと思っているのですが、同様の問題に遭われた方やスマートな解決方法をご存知の方が
いましたら御教授願いたいです。

よろしくお願いします。

danield

unread,
Jun 22, 2010, 9:04:51 PM6/22/10
to html5-developers-jp
Opera のダニエルです。

同じような経験はありませんが、調べることができます。
もし良かったらURLとかソースファイルを送っていただけますでしょうか。
(能力不足のため、原因を見つける約束はできませんが…)

hagino3000

unread,
Jun 23, 2010, 12:28:58 AM6/23/10
to html5-developers-jp
ダニエルさん

hagino3000です。
助かります、動作ページとソースは以下の通りです。

動作ページ
http://chaos.yuiseki.net
ワーカーのソース
http://github.com/yuiseki/chaos_proxy/blob/master/ui/src/js/worker_user_loader.js
ワーカーの呼び出し元
http://github.com/yuiseki/chaos_proxy/blob/master/ui/src/js/userlist.js


5分に一回、twitterのアイコンと名前がずらずらっと出てくる処理があるのですが、15分くらいで出てこなくなります。アクティビティモニタで確
認するとプロセスも消えてます。
今朝実験しててわかったのは、呼び出し元から数秒毎に適当なpostmessageをしてやるとworkerが死なないという事です。

danield

unread,
Jun 23, 2010, 4:01:01 AM6/23/10
to html5-developers-jp
Opera のダニエルです。

動作ページとソースのURL、ありがとうございます。

確かに WebKit のコンソール出力を見ると Web Worker で実行されるユーザリストの取得は2回しか行われません。
ただし、Opera 10.60 を使えば死なずに5分毎に行われます。

簡単なテストケース( http://people.opera.com/danield/test/chaos_test.html )を作ってみま
したが、これは WebKit でも、Opera でも死なないで実行できます。

自分の意見だけですが、Web Workers そのものではなく、原因は他のスクリプトにあるかなと思います。WebKit は詳しくないですが、も
しかしたらユーザリスト取得と関係ないところの影響で worker の処理がクラッシュしているかなと考えています。もっと詳しく調べないと修正方法
が分かりませんが、一つ思ったことはタイマーの実行されるところです。現時点では worker にある処理はタイマーとユーザリスト取得ですが、
setTimeout を呼び出し元のスレッドに移動して、worker をユーザリスト取得専用にすればタイマーが停止される可能性が低くなるかも知
れません。

簡単に解決ができなくすみませんでした。しかも間違いばかりだと思いますが、他にもこちらで調べられることがあれば是非教えてください。


On 6月23日, 午後1:28, hagino3000 <hagino.3...@gmail.com> wrote:
> ダニエルさん
>
> hagino3000です。
> 助かります、動作ページとソースは以下の通りです。
>
> 動作ページhttp://chaos.yuiseki.net
> ワーカーのソースhttp://github.com/yuiseki/chaos_proxy/blob/master/ui/src/js/worker_us...
> ワーカーの呼び出し元http://github.com/yuiseki/chaos_proxy/blob/master/ui/src/js/userlist.js

hagino3000

unread,
Jun 23, 2010, 12:09:32 PM6/23/10
to html5-developers-jp
解決したので報告します。

原因は、workerへの参照を残していなかったためでした。
var hogeWork = new Worker('hoge.js');
として
hogeWork をグローバル変数から辿れるプロパティに入れてやったらworkerが死ななくなりました。

今朝から動かしていたのが18時間経ってもworkerが生きているので解決とみなしても良いかなと。
参照が切れたworkerは10分程度でGCか何かに処分されてしまう様に見えます。

hagino3000

unread,
Jun 23, 2010, 1:41:16 PM6/23/10
to html5-developers-jp
hagino3000です。

検証用にサンプルページを作りました。
http://hagino3k.appspot.com/sample/worker/index.html

workerAとworkerBを作って、5秒毎にworkerからpostmessageします。
コンソールにworkerからpostmessageがある度にログを出力していますが、
AとBで違うのは、workerBはwindowオブジェクトのプロパティにつけています。

Chrome5 for macでページを開いてコンソールを見ていると、workerAからのpostmessageが1分程度で途絶えるのがわかり
ます。
運が悪い(?)と最初の5秒ともたずにworkerAが処分される事があります。

他のブラウザだとこの様な動きにはならないですし、使い終ったら自分で terminate するので勝手に殺してくれるなという気がしますね。

Shumpei Shiraishi

unread,
Jun 23, 2010, 7:35:14 PM6/23/10
to html5-dev...@googlegroups.com
白石です。

おー、GCされちゃってたのが原因なんですね!
素晴らしいノウハウです。

確かに、ワーカに対する参照がなくなったら、GCされても当然、という気はしますね。
Chrome以外のブラウザではGCされない、とのことですが、逆にメモリリークになりはしないかと、不安が。。

基本はグローバルに参照を置いておいて、使い終わったらterminate()して参照を除去する、というのが基本になりそうですね。


var wk = new Worker();
...
// 要らなくなった
wk.terminate();
delete wk;

hagino3000さん、素晴らしい情報をありがとうございました!

2010/6/24 hagino3000 <hagin...@gmail.com>:

> --
> このメールは Google グループのグループ「html5-developers-jp」の登録者に送られています。
> このグループに投稿するには、html5-dev...@googlegroups.com にメールを送信してください。
> このグループから退会するには、html5-developer...@googlegroups.com にメールを送信してください。
> 詳細については、http://groups.google.com/group/html5-developers-jp?hl=ja からこのグループにアクセスしてください。
>
>

danield

unread,
Jun 23, 2010, 10:52:52 PM6/23/10
to html5-developers-jp
Opera のダニエルです。

Nice work hagino3000さん!
原因のご報告、ありがとうございます。

On 6月24日, 午前8:35, Shumpei Shiraishi <shumpei.shirai...@gmail.com>
wrote:
> 白石です。
>
> おー、GCされちゃってたのが原因なんですね!
> 素晴らしいノウハウです。
>
> 確かに、ワーカに対する参照がなくなったら、GCされても当然、という気はしますね。
> Chrome以外のブラウザではGCされない、とのことですが、逆にメモリリークになりはしないかと、不安が。。
>
> 基本はグローバルに参照を置いておいて、使い終わったらterminate()して参照を除去する、というのが基本になりそうですね。
>
> var wk = new Worker();
> ...
> // 要らなくなった
> wk.terminate();
> delete wk;
>
> hagino3000さん、素晴らしい情報をありがとうございました!
>
> 2010/6/24 hagino3000 <hagino.3...@gmail.com>:

edvakf

unread,
Jun 24, 2010, 1:29:43 AM6/24/10
to html5-developers-jp
edvakf です。

最新版 (今日の Chromium) でも再現しました。Opera, Firefox, Safari でも試しましたが、Chrome だけの問
題のようですね。

Chrome のバグだと思うので issue を立てておきました。
http://crbug.com/47379

このケースが GC されるべきか、そうでないか、という疑問はまああるのですが、Worker それ自体が参照されていなくても、Worker の
コールバックで DOM を弄ったりできることから、やはり GC されるべきではないと自分は考えます。

Chrome (V8) の内部的には、グローバルから参照を通して巡れないオブジェクトは次の遅延 GC のタイミングで解放されることになっている
ので、当然といえば当然なのですけどね。

では。
Reply all
Reply to author
Forward
0 new messages