From [E-MAIL ADDRESS DELETED] Thu Apr 3 19:11:53 2014
From: [E-MAIL ADDRESS DELETED] (gmail)
Date: Thu, 3 Apr 2014 19:11:53 +0900
Subject: [mayaa-user:1021]
=?iso-2022-jp?b?Zm9yd2FyZBskQjhlJE4bKEJwYWdlGyRCJTklMyE8JVcbKEI=?=
=?iso-2022-jp?b?GyRCJE5KUT90OzI+SCRLJEQkJCRGGyhC?=
Message-ID: <3238894B-4F41-4E40-99A4-F617BDAD2BCC@gmail.com>
Mayaa開発 各位
お世話になっております。
山崎と申します。
forward後のpageスコープの変数参照について、確認したいことがあり、ご連絡しました。
page['XXX']で指定した変数は暗黙的に${XXX}で参照できますが、
Mayaaのforward()を利用した後ですと、
forward後に宣言したpage['XXX']であっても、暗黙的に参照できなくなります。
(page['XXX']で指定すると参照できる。ただし、_['XXX']は参照できない。)
実装例と表示を以下に記します。
page[]は使わずvarを使うと問題なく参照できますが、キー名を変数から参照することをやろうと思うと、page[]を利用したくなります。本件を回避する方法があれば、教えていただけませんか。
また、実装方法や認識が間違っておりましたらご指摘いただけると幸いです。
本件確認のバージョンは1.1.32となります。
※実装例
■/index.html
${forward('/forward/to.html')}
■/forward/to.html
fowarded!
■/forward/to.mayaa
※表示
■index.html
fowarded!
success
■/forward/to.html
fowarded!
success
success
-------------- next part --------------
HTMLの添付ファイルを保管しました...
URL:
From [E-MAIL ADDRESS DELETED] Sun Apr 13 13:02:06 2014
From: [E-MAIL ADDRESS DELETED] (suga)
Date: Sun, 13 Apr 2014 13:02:06 +0900
Subject: [mayaa-user:1022] Re:
=?iso-2022-jp?b?Zm9yd2FyZBskQjhlJE4bKEJwYWdlGyRCJTklMyE8GyhC?=
=?iso-2022-jp?b?GyRCJVckTkpRP3Q7Mj5IJEskRCQkJEYbKEI=?=
In-Reply-To: <3238894B-4F41-4E40-99A4-F617BDAD2BCC@gmail.com>
References: <3238894B-4F41-4E40-99A4-F617BDAD2BCC@gmail.com>
Message-ID:
suga です。
すみません、メールがspam判定されていて気づくのが遅くなりました。
> 本件を回避する方法があれば、教えていただけませんか。
現象確認しました。
これはMayaaのバグなので修正します。
まだ詳細確認していませんが、おそらくpageがforward前を指しているのだと
思います。
回避方法としては、以下の方法があります。
- Mayaaに渡す前にServlet側でforwardする
- pageではなくrequestスコープにセットする
--
suga ( ko.suga @ gmail.com )
2014-04-03 19:11 GMT+09:00 gmail :
> Mayaa開発 各位
>
> お世話になっております。
> 山崎と申します。
>
> forward後のpageスコープの変数参照について、確認したいことがあり、ご連絡しました。
>
> page['XXX']で指定した変数は暗黙的に${XXX}で参照できますが、
> Mayaaのforward()を利用した後ですと、
> forward後に宣言したpage['XXX']であっても、暗黙的に参照できなくなります。
> (page['XXX']で指定すると参照できる。ただし、_['XXX']は参照できない。)
> 実装例と表示を以下に記します。
>
> page[]は使わずvarを使うと問題なく参照できますが、キー名を変数から参照することをやろうと思うと、page[]を利用したくなります。本件を回避する方法があれば、教えていただけませんか。
>
> また、実装方法や認識が間違っておりましたらご指摘いただけると幸いです。
>
> 本件確認のバージョンは1.1.32となります。
>
> ※実装例
> ■/index.html
>
>
>
> ${forward('/forward/to.html')}
>
>
> ■/forward/to.html
>
>
>
>
> fowarded!
>
>
>
>
>
>
>
> ■/forward/to.mayaa
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
> ※表示
> ■index.html
>
>
>
>
> fowarded!
>
>
>
> success
>
>
>
> ■/forward/to.html
>
>
>
>
> fowarded!
>
>
> success
> success
>
>
>
> _______________________________________________
> mayaa-user mailing list
> mayaa-user @ ml.seasar.org
> https://ml.seasar.org/mailman/listinfo/mayaa-user
From [E-MAIL ADDRESS DELETED] Mon Apr 21 18:02:53 2014
From: [E-MAIL ADDRESS DELETED] (Susumu ISHIGAMI)
Date: Mon, 21 Apr 2014 18:02:53 +0900
Subject: [mayaa-user:1023] Re:
=?utf-8?b?6aC757mB44Gr44Os44Oz44OA44Oq44Oz44Kw44KS6KGM44Gj?=
=?utf-8?b?44Gm44GE44KL44Go44CB44Oa44O844K444Gu44OT44Or44OJ44GM6YGF?=
=?utf-8?b?44GP44Gq44KK44G+44GZ?=
In-Reply-To:
References:
Message-ID:
石上です。
以前sugaさんに下記のアドバイスを頂いた件について、実際に対応を行おうとしています。
もし、とても良い成果が得られれば、高負荷環境下でのMayaaの事例として、
可能な限りソースなどをフィードバック致します。
> - 更新を検出したらビルドを別スレッドで開始
> - ビルドが終わったのと同じ扱いで(タイムスタンプ更新)更新前のリソースで描画
> - 別スレッドでのビルドが終わったら差し替える
具体的には以下のように考えました。
ざっくりとした感じで申し訳ありませんが、下記1から3の対応方針に
おかしな点があればご指摘いただけますと幸いです。
1.isDeprecatedをOverride
org.seasar.mayaa.impl.engine.specification.SpecificationImpl.isDeprecated()
org.seasar.mayaa.impl.engine.TemplateImpl.isDeprecated()
(もしかするとTemplateImplだけでも良いでしょうか。mayaaファイルの実行時更新は行いません)
をOverrideしてTimestampで比較してtrueを返している条件の箇所を常にfalseを返すように変更すればよいかと思っています。
2.ファイル更新をフックしてEngineImpl.createSpecificationInstanceを呼び出す
1.の時に更新を検知して裏でビルドを動かすような方式だと、
> 更新後最初のアクセスでは必ず更新前で描画される
となると思いますが、そうではなくファイルの更新をフックして、
createSpecificationInstanceを呼び出せば比較的リアルタイムに引き継げるのではないかと思います。
問題はこの中でもspec.isDeprecatedを何度も呼んでいるので、
ビルド用の別スレッドでは、isDeprecatedがfalseを返さないように調整しなければならないと思っています。
3.ビルド用スレッドはSingleThreadExecutorでキューイングする
createSpecificationInstance以下のメソッドがsynchronizedなしに実行されますが、
本来このロジックはsynchronizedされて実行されることを想定されて作られていますので、
並列実行を行うと、何か問題が起きるかもしれません。
別オブジェクトでsynchronizedしても良いですが、スレッドがむやみに増えてしまわないように、
シングルスレッドでキューイングしようと考えてます。
2014年3月16日 16:21 suga :
> suga です。
>
> 高負荷サイトでは再ビルドしない設定にすることを想定した造りのため、
> それに対応するにはTemplateBuilderやSpecificationBuilderに手を入れる
> (あるいは自作する)必要があるでしょう。
>
> アプローチとしてはこの方向が良いと思います。
>
>> ・レンダリング処理時は、ビルド処理と競合するリソースについては直接参照せず
>> キャッシュを参照することにして、ビルドとレンダリングを干渉させないようにする
>
> - 更新を検出したらビルドを別スレッドで開始
> - ビルドが終わったのと同じ扱いで(タイムスタンプ更新)更新前のリソースで描画
> - 別スレッドでのビルドが終わったら差し替える
>
> 当然ですが更新後最初のアクセスでは必ず更新前で描画されるなど
> 不便な点があるでしょう。
>
> あとsynchronizedを外せるような造りにするとより良いでしょう。
>
> --
> suga ( ko.suga @ gmail.com )
>
>
> 2014-03-15 20:41 GMT+09:00 Susumu ISHIGAMI :
>> 石上です
>>
>> 連投で申し訳ありません。
>>
>> 一つのmayaaエンジンで、多数のWebページを提供しているWebサイトにて、
>> ローカル環境では数秒で終わっていたテンプレートのビルドに、数十秒
>> かかる現象を観測しています。
>>
>> おそらく、このような構成のサイトでは、ページが多い分、
>> 全体的にレンダリング処理が頻繁に行われていると思われます。
>> JMeterを使用して、ビルド済みのテンプレートをレンダリングする
>> 処理を頻繁に行うと、ローカル環境でも、当該テンプレートのビルド時間が
>> 遅くなることを確認いたしました。
>>
>> 私の推測では、Engineオブジェクトが事実上シングルトンとして実装されているため、
>> ビルド処理やレンダリング処理などあらゆる処理でEngineオブジェクトをsynchronizeしてしまっていて、
>> Engineオブジェクトのロック待ちが処理のボトルネックとなっているのではないかと思っています。
>>
>> この件について、もし何か対処法があればご教示いただけると有難いです。
>>
>> 私が思いついたアプローチとしては、
>>
>> ・レンダリング処理時は、ビルド処理と競合するリソースについては直接参照せず
>> キャッシュを参照することにして、ビルドとレンダリングを干渉させないようにする
>>
>> ・ロックの範囲をテンプレートエンジン全体ではなく、フォルダ等一定のセグメントごとにロックする
>>
>> このとき、ランタイムで変更できるファイルを限定しても構いません
>> (例えばdefault.mayaaファイルの変更は検知しない)
>>
>> 曖昧で申し訳ありません。
>>
>> 更に情報が必要でしたら、提供致します。
>> 再現ソースが必要でしたら少し時間をいただければ作成致します。
>> _______________________________________________
>> mayaa-user mailing list
>> mayaa-user @ ml.seasar.org
>> https://ml.seasar.org/mailman/listinfo/mayaa-user
> _______________________________________________
> mayaa-user mailing list
> mayaa-user @ ml.seasar.org
> https://ml.seasar.org/mailman/listinfo/mayaa-user
--
Susumu ISHIGAMI
susumu.ishigami @ gmail.com
From [E-MAIL ADDRESS DELETED] Wed Apr 23 00:21:48 2014
From: [E-MAIL ADDRESS DELETED] (Hara Hara)
Date: Wed, 23 Apr 2014 00:21:48 +0900
Subject: [mayaa-user:1024]
=?iso-2022-jp?b?bWF5YWEbJEIkTiVhJWIlaiVqITwlLyRLJEQkLSReJDcbKEI=?=
=?iso-2022-jp?b?GyRCJEYbKEI=?=
Message-ID:
お世話になっております。 石川と申します。
Tomcat7+JDK6で稼働中のアプリで、スレッドダンプを取った時に下記のログが
出力されます。
"http-bio-8083-exec-5" daemon prio=10 tid=0x00007f035c0d4800 nid=0x6ecb runnable [0x00007f039cc1a000]
java.lang.Thread.State: RUNNABLE
at java.util.HashMap.getEntry(HashMap.java:364)
at java.util.HashMap.containsKey(HashMap.java:352)
at org.seasar.mayaa.impl.cycle.script.rhino.PageAttributeScope.has(PageAttributeScope.java:83)
at org.seasar.mayaa.impl.cycle.script.rhino.PageAttributeScope.findScope(PageAttributeScope.java:140)
at org.seasar.mayaa.impl.cycle.script.rhino.PageAttributeScope.hasAttribute(PageAttributeScope.java:148)
at org.seasar.mayaa.impl.cycle.CycleUtil.findStandardAttributeScope(CycleUtil.java:149)
at org.seasar.mayaa.impl.cycle.script.rhino.NativeServiceCycle.get(NativeServiceCycle.java:75)
at org.mozilla.javascript.ScriptableObject.getProperty(ScriptableObject.java:1617)
at org.mozilla.javascript.ScriptRuntime.nameOrFunction(ScriptRuntime.java:1746)
at org.mozilla.javascript.ScriptRuntime.name(ScriptRuntime.java:1697)
at org.mozilla.javascript.gen.c83128._c0(☆☆☆.mayaa#attribute:83)
at org.mozilla.javascript.gen.c83128.call(☆☆☆.mayaa#attribute)
at org.mozilla.javascript.ContextFactory.doTopCall(ContextFactory.java:398)
at org.mozilla.javascript.ScriptRuntime.doTopCall(ScriptRuntime.java:3065)
at org.mozilla.javascript.gen.c83128.call(☆☆☆.mayaa#attribute)
at org.mozilla.javascript.gen.c83128.exec(☆☆☆.mayaa#attribute)
at org.seasar.mayaa.impl.cycle.script.rhino.TextCompiledScriptImpl.normalExecute(TextCompiledScriptImpl.java:126)
at org.seasar.mayaa.impl.cycle.script.rhino.TextCompiledScriptImpl.execute(TextCompiledScriptImpl.java:166)
at org.seasar.mayaa.impl.cycle.script.ComplexScript.execute(ComplexScript.java:55)
at org.seasar.mayaa.impl.engine.processor.AttributeProcessor$ScriptWrapper.execute(AttributeProcessor.java:279)
at org.seasar.mayaa.impl.engine.processor.AttributeProcessor$EscapableScript.execute(AttributeProcessor.java:209)
at org.seasar.mayaa.impl.engine.processor.ElementProcessor.appendAttributeString(ElementProcessor.java:308)
at org.seasar.mayaa.impl.engine.processor.ElementProcessor.writePart2(ElementProcessor.java:372)
at org.seasar.mayaa.impl.engine.processor.ElementProcessor.writeStartElement(ElementProcessor.java:431)
at org.seasar.mayaa.impl.engine.processor.AbstractAttributableProcessor.processEnd(AbstractAttributableProcessor.java:237)
at org.seasar.mayaa.impl.engine.processor.ElementProcessor.processEnd(ElementProcessor.java:459)
at org.seasar.mayaa.impl.engine.processor.AbstractAttributableProcessor.doEndProcess(AbstractAttributableProcessor.java:220)
at org.seasar.mayaa.impl.engine.RenderUtil.renderTemplateProcessor(RenderUtil.java:158)
at org.seasar.mayaa.impl.engine.RenderUtil.renderTemplateProcessorChildren(RenderUtil.java:209)
at org.seasar.mayaa.impl.engine.RenderUtil.renderTemplateProcessor(RenderUtil.java:147)
at org.seasar.mayaa.impl.engine.processor.ComponentRenderer.renderTemplate(ComponentRenderer.java:70)
at org.seasar.mayaa.impl.engine.RenderUtil.renderPage(RenderUtil.java:349)
at org.seasar.mayaa.impl.engine.processor.InsertProcessor.doStartProcess(InsertProcessor.java:327)
at org.seasar.mayaa.impl.engine.RenderUtil.renderTemplateProcessor(RenderUtil.java:134)
at org.seasar.mayaa.impl.engine.RenderUtil.renderTemplateProcessorChildren(RenderUtil.java:209)
at org.seasar.mayaa.impl.engine.RenderUtil.renderTemplateProcessor(RenderUtil.java:147)
at org.seasar.mayaa.impl.engine.processor.ComponentRenderer.renderTemplate(ComponentRenderer.java:70)
at org.seasar.mayaa.impl.engine.RenderUtil.renderPage(RenderUtil.java:349)
at org.seasar.mayaa.impl.engine.processor.InsertProcessor.doStartProcess(InsertProcessor.java:327)
以下は
at org.seasar.mayaa.impl.engine.RenderUtil.renderTemplateProcessorChildren(RenderUtil.java:209)
at org.seasar.mayaa.impl.engine.RenderUtil.renderTemplateProcessor(RenderUtil.java:147)
at org.seasar.mayaa.impl.engine.processor.ComponentRenderer.renderTemplate(ComponentRenderer.java:70)
at org.seasar.mayaa.impl.engine.RenderUtil.renderPage(RenderUtil.java:349)
at org.seasar.mayaa.impl.engine.processor.InsertProcessor.doStartProcess(InsertProcessor.java:327)
at org.seasar.mayaa.impl.engine.RenderUtil.renderTemplateProcessor(RenderUtil.java:134)
の繰り返しが延々と続くのですが、「☆☆☆.mayaa#attribute」の部分は
という処理のm:ifの部分で、「ID=XXX」にあたるものはHTML内に1か所しかありません。
スレッドダンプを取得した時はサーバーのCPUが100%になっていて、上記の状態のスレッドがいくつかありました。
何か改善策はありますでしょうか。
どうぞよろしくお願いいたします。
-------------- next part --------------
HTMLの添付ファイルを保管しました...
URL:
From [E-MAIL ADDRESS DELETED] Wed Apr 23 07:59:12 2014
From: [E-MAIL ADDRESS DELETED] (suga)
Date: Wed, 23 Apr 2014 07:59:12 +0900
Subject: [mayaa-user:1025] Re:
=?utf-8?b?bWF5YWHjga7jg6Hjg6Ljg6rjg6rjg7zjgq/jgavjgaTjgY0=?=
=?utf-8?b?44G+44GX44Gm?=
In-Reply-To:
References:
Message-ID:
suga です。
まず、subjectにメモリリークとありますが、メモリリークだと判断した
理由は何でしょうか。文面にある情報からでは分かりませんが。
InsertProcessor があるのでどこかで m:insert を使っているようですが、
循環してはいないでしょうか。
--
suga ( ko.suga @ gmail.com )
2014-04-23 0:21 GMT+09:00 Hara Hara :
> お世話になっております。 石川と申します。
>
> Tomcat7+JDK6で稼働中のアプリで、スレッドダンプを取った時に下記のログが
> 出力されます。
>
> "http-bio-8083-exec-5" daemon prio=10 tid=0x00007f035c0d4800 nid=0x6ecb
> runnable [0x00007f039cc1a000]
> java.lang.Thread.State: RUNNABLE
> at java.util.HashMap.getEntry(HashMap.java:364)
> at java.util.HashMap.containsKey(HashMap.java:352)
> at
> org.seasar.mayaa.impl.cycle.script.rhino.PageAttributeScope.has(PageAttributeScope.java:83)
> at
> org.seasar.mayaa.impl.cycle.script.rhino.PageAttributeScope.findScope(PageAttributeScope.java:140)
> at
> org.seasar.mayaa.impl.cycle.script.rhino.PageAttributeScope.hasAttribute(PageAttributeScope.java:148)
> at
> org.seasar.mayaa.impl.cycle.CycleUtil.findStandardAttributeScope(CycleUtil.java:149)
> at
> org.seasar.mayaa.impl.cycle.script.rhino.NativeServiceCycle.get(NativeServiceCycle.java:75)
> at
> org.mozilla.javascript.ScriptableObject.getProperty(ScriptableObject.java:1617)
> at
> org.mozilla.javascript.ScriptRuntime.nameOrFunction(ScriptRuntime.java:1746)
> at org.mozilla.javascript.ScriptRuntime.name(ScriptRuntime.java:1697)
> at org.mozilla.javascript.gen.c83128._c0(☆☆☆.mayaa#attribute:83)
> at org.mozilla.javascript.gen.c83128.call(☆☆☆.mayaa#attribute)
> at
> org.mozilla.javascript.ContextFactory.doTopCall(ContextFactory.java:398)
> at
> org.mozilla.javascript.ScriptRuntime.doTopCall(ScriptRuntime.java:3065)
> at org.mozilla.javascript.gen.c83128.call(☆☆☆.mayaa#attribute)
> at org.mozilla.javascript.gen.c83128.exec(☆☆☆.mayaa#attribute)
> at
> org.seasar.mayaa.impl.cycle.script.rhino.TextCompiledScriptImpl.normalExecute(TextCompiledScriptImpl.java:126)
> at
> org.seasar.mayaa.impl.cycle.script.rhino.TextCompiledScriptImpl.execute(TextCompiledScriptImpl.java:166)
> at
> org.seasar.mayaa.impl.cycle.script.ComplexScript.execute(ComplexScript.java:55)
> at
> org.seasar.mayaa.impl.engine.processor.AttributeProcessor$ScriptWrapper.execute(AttributeProcessor.java:279)
> at
> org.seasar.mayaa.impl.engine.processor.AttributeProcessor$EscapableScript.execute(AttributeProcessor.java:209)
> at
> org.seasar.mayaa.impl.engine.processor.ElementProcessor.appendAttributeString(ElementProcessor.java:308)
> at
> org.seasar.mayaa.impl.engine.processor.ElementProcessor.writePart2(ElementProcessor.java:372)
> at
> org.seasar.mayaa.impl.engine.processor.ElementProcessor.writeStartElement(ElementProcessor.java:431)
> at
> org.seasar.mayaa.impl.engine.processor.AbstractAttributableProcessor.processEnd(AbstractAttributableProcessor.java:237)
> at
> org.seasar.mayaa.impl.engine.processor.ElementProcessor.processEnd(ElementProcessor.java:459)
> at
> org.seasar.mayaa.impl.engine.processor.AbstractAttributableProcessor.doEndProcess(AbstractAttributableProcessor.java:220)
> at
> org.seasar.mayaa.impl.engine.RenderUtil.renderTemplateProcessor(RenderUtil.java:158)
> at
> org.seasar.mayaa.impl.engine.RenderUtil.renderTemplateProcessorChildren(RenderUtil.java:209)
> at
> org.seasar.mayaa.impl.engine.RenderUtil.renderTemplateProcessor(RenderUtil.java:147)
> at
> org.seasar.mayaa.impl.engine.processor.ComponentRenderer.renderTemplate(ComponentRenderer.java:70)
> at
> org.seasar.mayaa.impl.engine.RenderUtil.renderPage(RenderUtil.java:349)
> at
> org.seasar.mayaa.impl.engine.processor.InsertProcessor.doStartProcess(InsertProcessor.java:327)
> at
> org.seasar.mayaa.impl.engine.RenderUtil.renderTemplateProcessor(RenderUtil.java:134)
> at
> org.seasar.mayaa.impl.engine.RenderUtil.renderTemplateProcessorChildren(RenderUtil.java:209)
> at
> org.seasar.mayaa.impl.engine.RenderUtil.renderTemplateProcessor(RenderUtil.java:147)
> at
> org.seasar.mayaa.impl.engine.processor.ComponentRenderer.renderTemplate(ComponentRenderer.java:70)
> at
> org.seasar.mayaa.impl.engine.RenderUtil.renderPage(RenderUtil.java:349)
> at
> org.seasar.mayaa.impl.engine.processor.InsertProcessor.doStartProcess(InsertProcessor.java:327)
>
> 以下は
> at
> org.seasar.mayaa.impl.engine.RenderUtil.renderTemplateProcessorChildren(RenderUtil.java:209)
> at
> org.seasar.mayaa.impl.engine.RenderUtil.renderTemplateProcessor(RenderUtil.java:147)
> at
> org.seasar.mayaa.impl.engine.processor.ComponentRenderer.renderTemplate(ComponentRenderer.java:70)
> at
> org.seasar.mayaa.impl.engine.RenderUtil.renderPage(RenderUtil.java:349)
> at
> org.seasar.mayaa.impl.engine.processor.InsertProcessor.doStartProcess(InsertProcessor.java:327)
> at
> org.seasar.mayaa.impl.engine.RenderUtil.renderTemplateProcessor(RenderUtil.java:134)
> の繰り返しが延々と続くのですが、「☆☆☆.mayaa#attribute」の部分は
>
>
>
>
>
> という処理のm:ifの部分で、「ID=XXX」にあたるものはHTML内に1か所しかありません。
> スレッドダンプを取得した時はサーバーのCPUが100%になっていて、上記の状態のスレッドがいくつかありました。
>
> 何か改善策はありますでしょうか。
> どうぞよろしくお願いいたします。
>
> _______________________________________________
> mayaa-user mailing list
> mayaa-user @ ml.seasar.org
> https://ml.seasar.org/mailman/listinfo/mayaa-user
From [E-MAIL ADDRESS DELETED] Wed Apr 23 08:27:20 2014
From: [E-MAIL ADDRESS DELETED] (suga)
Date: Wed, 23 Apr 2014 08:27:20 +0900
Subject: [mayaa-user:1026] Re:
=?utf-8?b?6aC757mB44Gr44Os44Oz44OA44Oq44Oz44Kw44KS6KGM44Gj?=
=?utf-8?b?44Gm44GE44KL44Go44CB44Oa44O844K444Gu44OT44Or44OJ44GM6YGF?=
=?utf-8?b?44GP44Gq44KK44G+44GZ?=
In-Reply-To:
References:
Message-ID:
suga です。
概ね問題ないように見えます。
isDeprecated をビルド用スレッドでのみtrueにするのは、ThreadLocal にフラグを持って、
というところですかね。
--
suga ( ko.suga @ gmail.com )
2014-04-21 18:02 GMT+09:00 Susumu ISHIGAMI :
> 石上です。
>
> 以前sugaさんに下記のアドバイスを頂いた件について、実際に対応を行おうとしています。
> もし、とても良い成果が得られれば、高負荷環境下でのMayaaの事例として、
> 可能な限りソースなどをフィードバック致します。
>
>> - 更新を検出したらビルドを別スレッドで開始
>> - ビルドが終わったのと同じ扱いで(タイムスタンプ更新)更新前のリソースで描画
>> - 別スレッドでのビルドが終わったら差し替える
>
> 具体的には以下のように考えました。
> ざっくりとした感じで申し訳ありませんが、下記1から3の対応方針に
> おかしな点があればご指摘いただけますと幸いです。
>
> 1.isDeprecatedをOverride
> org.seasar.mayaa.impl.engine.specification.SpecificationImpl.isDeprecated()
> org.seasar.mayaa.impl.engine.TemplateImpl.isDeprecated()
> (もしかするとTemplateImplだけでも良いでしょうか。mayaaファイルの実行時更新は行いません)
> をOverrideしてTimestampで比較してtrueを返している条件の箇所を常にfalseを返すように変更すればよいかと思っています。
>
> 2.ファイル更新をフックしてEngineImpl.createSpecificationInstanceを呼び出す
> 1.の時に更新を検知して裏でビルドを動かすような方式だと、
> > 更新後最初のアクセスでは必ず更新前で描画される
> となると思いますが、そうではなくファイルの更新をフックして、
> createSpecificationInstanceを呼び出せば比較的リアルタイムに引き継げるのではないかと思います。
>
> 問題はこの中でもspec.isDeprecatedを何度も呼んでいるので、
> ビルド用の別スレッドでは、isDeprecatedがfalseを返さないように調整しなければならないと思っています。
>
> 3.ビルド用スレッドはSingleThreadExecutorでキューイングする
> createSpecificationInstance以下のメソッドがsynchronizedなしに実行されますが、
> 本来このロジックはsynchronizedされて実行されることを想定されて作られていますので、
> 並列実行を行うと、何か問題が起きるかもしれません。
> 別オブジェクトでsynchronizedしても良いですが、スレッドがむやみに増えてしまわないように、
> シングルスレッドでキューイングしようと考えてます。
>
> 2014年3月16日 16:21 suga :
>> suga です。
>>
>> 高負荷サイトでは再ビルドしない設定にすることを想定した造りのため、
>> それに対応するにはTemplateBuilderやSpecificationBuilderに手を入れる
>> (あるいは自作する)必要があるでしょう。
>>
>> アプローチとしてはこの方向が良いと思います。
>>
>>> ・レンダリング処理時は、ビルド処理と競合するリソースについては直接参照せず
>>> キャッシュを参照することにして、ビルドとレンダリングを干渉させないようにする
>>
>> - 更新を検出したらビルドを別スレッドで開始
>> - ビルドが終わったのと同じ扱いで(タイムスタンプ更新)更新前のリソースで描画
>> - 別スレッドでのビルドが終わったら差し替える
>>
>> 当然ですが更新後最初のアクセスでは必ず更新前で描画されるなど
>> 不便な点があるでしょう。
>>
>> あとsynchronizedを外せるような造りにするとより良いでしょう。
>>
>> --
>> suga ( ko.suga @ gmail.com )
>>
>>
>> 2014-03-15 20:41 GMT+09:00 Susumu ISHIGAMI :
>>> 石上です
>>>
>>> 連投で申し訳ありません。
>>>
>>> 一つのmayaaエンジンで、多数のWebページを提供しているWebサイトにて、
>>> ローカル環境では数秒で終わっていたテンプレートのビルドに、数十秒
>>> かかる現象を観測しています。
>>>
>>> おそらく、このような構成のサイトでは、ページが多い分、
>>> 全体的にレンダリング処理が頻繁に行われていると思われます。
>>> JMeterを使用して、ビルド済みのテンプレートをレンダリングする
>>> 処理を頻繁に行うと、ローカル環境でも、当該テンプレートのビルド時間が
>>> 遅くなることを確認いたしました。
>>>
>>> 私の推測では、Engineオブジェクトが事実上シングルトンとして実装されているため、
>>> ビルド処理やレンダリング処理などあらゆる処理でEngineオブジェクトをsynchronizeしてしまっていて、
>>> Engineオブジェクトのロック待ちが処理のボトルネックとなっているのではないかと思っています。
>>>
>>> この件について、もし何か対処法があればご教示いただけると有難いです。
>>>
>>> 私が思いついたアプローチとしては、
>>>
>>> ・レンダリング処理時は、ビルド処理と競合するリソースについては直接参照せず
>>> キャッシュを参照することにして、ビルドとレンダリングを干渉させないようにする
>>>
>>> ・ロックの範囲をテンプレートエンジン全体ではなく、フォルダ等一定のセグメントごとにロックする
>>>
>>> このとき、ランタイムで変更できるファイルを限定しても構いません
>>> (例えばdefault.mayaaファイルの変更は検知しない)
>>>
>>> 曖昧で申し訳ありません。
>>>
>>> 更に情報が必要でしたら、提供致します。
>>> 再現ソースが必要でしたら少し時間をいただければ作成致します。
>>> _______________________________________________
>>> mayaa-user mailing list
>>> mayaa-user @ ml.seasar.org
>>> https://ml.seasar.org/mailman/listinfo/mayaa-user
>> _______________________________________________
>> mayaa-user mailing list
>> mayaa-user @ ml.seasar.org
>> https://ml.seasar.org/mailman/listinfo/mayaa-user
>
>
>
> --
> Susumu ISHIGAMI
> susumu.ishigami @ gmail.com
> _______________________________________________
> mayaa-user mailing list
> mayaa-user @ ml.seasar.org
> https://ml.seasar.org/mailman/listinfo/mayaa-user
From [E-MAIL ADDRESS DELETED] Thu Apr 24 17:19:08 2014
From: [E-MAIL ADDRESS DELETED] (Hara Hara)
Date: Thu, 24 Apr 2014 17:19:08 +0900
Subject: [mayaa-user:1027] Re:
=?iso-2022-jp?b?bWF5YWEbJEIkTiVhJWIlaiVqITwlLyRLJEQkLSReGyhC?=
=?iso-2022-jp?b?GyRCJDckRhsoQg==?=
In-Reply-To:
References: ,
Message-ID:
suga様
いつもお世話になっております。
大変申し訳ございません、メモリリークではなく無限ループですね・・・
確認したところ、insertタグでnameを指定していないところがあり、
それがループしていたようです。
お忙しいところお手間と取らせてしまい申し訳ございません。
大変恐縮ですが、もう一点ご教示いただけますでしょうか。
稀にページ表示に30秒ちかくかかることがあり、そういう場合に下記のような状態のスレッドが
幾つか存在しているのですが、これは問題ないでしょうか。
java.lang.Thread.State: BLOCKED (on object monitor)
at org.seasar.mayaa.impl.engine.specification.NamespaceImpl.getInstance(NamespaceImpl.java:54)
- waiting to lock <0x00000000c6fcc808> (a org.seasar.mayaa.impl.util.ReferenceCache)
at org.seasar.mayaa.impl.engine.specification.NamespaceImpl.copyOf(NamespaceImpl.java:77)
どうぞよろしくお願いいたします。
> Date: Wed, 23 Apr 2014 07:59:12 +0900
> From: ko.suga @ gmail.com
> To: mayaa-user @ ml.seasar.org
> Subject: [mayaa-user:1025] Re: mayaaのメモリリークにつきまして
>
> suga です。
>
> まず、subjectにメモリリークとありますが、メモリリークだと判断した
> 理由は何でしょうか。文面にある情報からでは分かりませんが。
>
> InsertProcessor があるのでどこかで m:insert を使っているようですが、
> 循環してはいないでしょうか。
>
>
> --
> suga ( ko.suga @ gmail.com )
>
>
> 2014-04-23 0:21 GMT+09:00 Hara Hara :
> > お世話になっております。 石川と申します。
> >
> > Tomcat7+JDK6で稼働中のアプリで、スレッドダンプを取った時に下記のログが
> > 出力されます。
> >
> > "http-bio-8083-exec-5" daemon prio=10 tid=0x00007f035c0d4800 nid=0x6ecb
> > runnable [0x00007f039cc1a000]
> > java.lang.Thread.State: RUNNABLE
> > at java.util.HashMap.getEntry(HashMap.java:364)
> > at java.util.HashMap.containsKey(HashMap.java:352)
> > at
> > org.seasar.mayaa.impl.cycle.script.rhino.PageAttributeScope.has(PageAttributeScope.java:83)
> > at
> > org.seasar.mayaa.impl.cycle.script.rhino.PageAttributeScope.findScope(PageAttributeScope.java:140)
> > at
> > org.seasar.mayaa.impl.cycle.script.rhino.PageAttributeScope.hasAttribute(PageAttributeScope.java:148)
> > at
> > org.seasar.mayaa.impl.cycle.CycleUtil.findStandardAttributeScope(CycleUtil.java:149)
> > at
> > org.seasar.mayaa.impl.cycle.script.rhino.NativeServiceCycle.get(NativeServiceCycle.java:75)
> > at
> > org.mozilla.javascript.ScriptableObject.getProperty(ScriptableObject.java:1617)
> > at
> > org.mozilla.javascript.ScriptRuntime.nameOrFunction(ScriptRuntime.java:1746)
> > at org.mozilla.javascript.ScriptRuntime.name(ScriptRuntime.java:1697)
> > at org.mozilla.javascript.gen.c83128._c0(☆☆☆.mayaa#attribute:83)
> > at org.mozilla.javascript.gen.c83128.call(☆☆☆.mayaa#attribute)
> > at
> > org.mozilla.javascript.ContextFactory.doTopCall(ContextFactory.java:398)
> > at
> > org.mozilla.javascript.ScriptRuntime.doTopCall(ScriptRuntime.java:3065)
> > at org.mozilla.javascript.gen.c83128.call(☆☆☆.mayaa#attribute)
> > at org.mozilla.javascript.gen.c83128.exec(☆☆☆.mayaa#attribute)
> > at
> > org.seasar.mayaa.impl.cycle.script.rhino.TextCompiledScriptImpl.normalExecute(TextCompiledScriptImpl.java:126)
> > at
> > org.seasar.mayaa.impl.cycle.script.rhino.TextCompiledScriptImpl.execute(TextCompiledScriptImpl.java:166)
> > at
> > org.seasar.mayaa.impl.cycle.script.ComplexScript.execute(ComplexScript.java:55)
> > at
> > org.seasar.mayaa.impl.engine.processor.AttributeProcessor$ScriptWrapper.execute(AttributeProcessor.java:279)
> > at
> > org.seasar.mayaa.impl.engine.processor.AttributeProcessor$EscapableScript.execute(AttributeProcessor.java:209)
> > at
> > org.seasar.mayaa.impl.engine.processor.ElementProcessor.appendAttributeString(ElementProcessor.java:308)
> > at
> > org.seasar.mayaa.impl.engine.processor.ElementProcessor.writePart2(ElementProcessor.java:372)
> > at
> > org.seasar.mayaa.impl.engine.processor.ElementProcessor.writeStartElement(ElementProcessor.java:431)
> > at
> > org.seasar.mayaa.impl.engine.processor.AbstractAttributableProcessor.processEnd(AbstractAttributableProcessor.java:237)
> > at
> > org.seasar.mayaa.impl.engine.processor.ElementProcessor.processEnd(ElementProcessor.java:459)
> > at
> > org.seasar.mayaa.impl.engine.processor.AbstractAttributableProcessor.doEndProcess(AbstractAttributableProcessor.java:220)
> > at
> > org.seasar.mayaa.impl.engine.RenderUtil.renderTemplateProcessor(RenderUtil.java:158)
> > at
> > org.seasar.mayaa.impl.engine.RenderUtil.renderTemplateProcessorChildren(RenderUtil.java:209)
> > at
> > org.seasar.mayaa.impl.engine.RenderUtil.renderTemplateProcessor(RenderUtil.java:147)
> > at
> > org.seasar.mayaa.impl.engine.processor.ComponentRenderer.renderTemplate(ComponentRenderer.java:70)
> > at
> > org.seasar.mayaa.impl.engine.RenderUtil.renderPage(RenderUtil.java:349)
> > at
> > org.seasar.mayaa.impl.engine.processor.InsertProcessor.doStartProcess(InsertProcessor.java:327)
> > at
> > org.seasar.mayaa.impl.engine.RenderUtil.renderTemplateProcessor(RenderUtil.java:134)
> > at
> > org.seasar.mayaa.impl.engine.RenderUtil.renderTemplateProcessorChildren(RenderUtil.java:209)
> > at
> > org.seasar.mayaa.impl.engine.RenderUtil.renderTemplateProcessor(RenderUtil.java:147)
> > at
> > org.seasar.mayaa.impl.engine.processor.ComponentRenderer.renderTemplate(ComponentRenderer.java:70)
> > at
> > org.seasar.mayaa.impl.engine.RenderUtil.renderPage(RenderUtil.java:349)
> > at
> > org.seasar.mayaa.impl.engine.processor.InsertProcessor.doStartProcess(InsertProcessor.java:327)
> >
> > 以下は
> > at
> > org.seasar.mayaa.impl.engine.RenderUtil.renderTemplateProcessorChildren(RenderUtil.java:209)
> > at
> > org.seasar.mayaa.impl.engine.RenderUtil.renderTemplateProcessor(RenderUtil.java:147)
> > at
> > org.seasar.mayaa.impl.engine.processor.ComponentRenderer.renderTemplate(ComponentRenderer.java:70)
> > at
> > org.seasar.mayaa.impl.engine.RenderUtil.renderPage(RenderUtil.java:349)
> > at
> > org.seasar.mayaa.impl.engine.processor.InsertProcessor.doStartProcess(InsertProcessor.java:327)
> > at
> > org.seasar.mayaa.impl.engine.RenderUtil.renderTemplateProcessor(RenderUtil.java:134)
> > の繰り返しが延々と続くのですが、「☆☆☆.mayaa#attribute」の部分は
> >
> >
> >
> >
> >
> > という処理のm:ifの部分で、「ID=XXX」にあたるものはHTML内に1か所しかありません。
> > スレッドダンプを取得した時はサーバーのCPUが100%になっていて、上記の状態のスレッドがいくつかありました。
> >
> > 何か改善策はありますでしょうか。
> > どうぞよろしくお願いいたします。
> >
> > _______________________________________________
> > mayaa-user mailing list
> > mayaa-user @ ml.seasar.org
> > https://ml.seasar.org/mailman/listinfo/mayaa-user
> _______________________________________________
> mayaa-user mailing list
> mayaa-user @ ml.seasar.org
> https://ml.seasar.org/mailman/listinfo/mayaa-user
-------------- next part --------------
HTMLの添付ファイルを保管しました...
URL:
From [E-MAIL ADDRESS DELETED] Fri Apr 25 06:57:27 2014
From: [E-MAIL ADDRESS DELETED] (suga)
Date: Fri, 25 Apr 2014 06:57:27 +0900
Subject: [mayaa-user:1028] Re:
=?utf-8?b?bWF5YWHjga7jg6Hjg6Ljg6rjg6rjg7zjgq/jgavjgaTjgY0=?=
=?utf-8?b?44G+44GX44Gm?=
In-Reply-To:
References:
Message-ID:
sugaです。
これ自体は単にsynchronizedの待ちなので正常にありえます。
同じオブジェクトを延々待ち続けているとかなら問題の可能性はありますが。
2014年4月24日木曜日、Hara Haraさんは書きました:
> suga様
>
> いつもお世話になっております。
> 大変申し訳ございません、メモリリークではなく無限ループですね・・・
> 確認したところ、insertタグでnameを指定していないところがあり、
> それがループしていたようです。
> お忙しいところお手間と取らせてしまい申し訳ございません。
>
> 大変恐縮ですが、もう一点ご教示いただけますでしょうか。
> 稀にページ表示に30秒ちかくかかることがあり、そういう場合に下記のような状態のスレッドが
> 幾つか存在しているのですが、これは問題ないでしょうか。
>
> java.lang.Thread.State: BLOCKED (on object monitor)
> at
> org.seasar.mayaa.impl.engine.specification.NamespaceImpl.getInstance(NamespaceImpl.java:54)
> - waiting to lock <0x00000000c6fcc808> (a
> org.seasar.mayaa.impl.util.ReferenceCache)
> at
> org.seasar.mayaa.impl.engine.specification.NamespaceImpl.copyOf(NamespaceImpl.java:77)
>
> どうぞよろしくお願いいたします。
>
> > Date: Wed, 23 Apr 2014 07:59:12 +0900
> > From: ko.suga @ gmail.com
> > To: mayaa-user @ ml.seasar.org
> > Subject: [mayaa-user:1025] Re: mayaaのメモリリークにつきまして
> >
> > suga です。
> >
> > まず、subjectにメモリリークとありますが、メモリリークだと判断した
> > 理由は何でしょうか。文面にある情報からでは分かりませんが。
> >
> > InsertProcessor があるのでどこかで m:insert を使っているようですが、
> > 循環してはいないでしょうか。
> >
> >
> > --
> > suga ( ko.suga @ gmail.com )
> >
> >
> > 2014-04-23 0:21 GMT+09:00 Hara Hara :
> > > お世話になっております。 石川と申します。
> > >
> > > Tomcat7+JDK6で稼働中のアプリで、スレッドダンプを取った時に下記のログが
> > > 出力されます。
> > >
> > > "http-bio-8083-exec-5" daemon prio=10 tid=0x00007f035c0d4800 nid=0x6ecb
> > > runnable [0x00007f039cc1a000]
> > > java.lang.Thread.State: RUNNABLE
> > > at java.util.HashMap.getEntry(HashMap.java:364)
> > > at java.util.HashMap.containsKey(HashMap.java:352)
> > > at
> > >
> org.seasar.mayaa.impl.cycle.script.rhino.PageAttributeScope.has(PageAttributeScope.java:83)
> > > at
> > >
> org.seasar.mayaa.impl.cycle.script.rhino.PageAttributeScope.findScope(PageAttributeScope.java:140)
> > > at
> > >
> org.seasar.mayaa.impl.cycle.script.rhino.PageAttributeScope.hasAttribute(PageAttributeScope.java:148)
> > > at
> > >
> org.seasar.mayaa.impl.cycle.CycleUtil.findStandardAttributeScope(CycleUtil.java:149)
> > > at
> > >
> org.seasar.mayaa.impl.cycle.script.rhino.NativeServiceCycle.get(NativeServiceCycle.java:75)
> > > at
> > >
> org.mozilla.javascript.ScriptableObject.getProperty(ScriptableObject.java:1617)
> > > at
> > >
> org.mozilla.javascript.ScriptRuntime.nameOrFunction(ScriptRuntime.java:1746)
> > > at org.mozilla.javascript.ScriptRuntime.name(ScriptRuntime.java:1697)
> > > at org.mozilla.javascript.gen.c83128._c0(☆☆☆.mayaa#attribute:83)
> > > at org.mozilla.javascript.gen.c83128.call(☆☆☆.mayaa#attribute)
> > > at
> > >
> org.mozilla.javascript.ContextFactory.doTopCall(ContextFactory.java:398)
> > > at
> > > org.mozilla.javascript.ScriptRuntime.doTopCall(ScriptRuntime.java:3065)
> > > at org.mozilla.javascript.gen.c83128.call(☆☆☆.mayaa#attribute)
> > > at org.mozilla.javascript.gen.c83128.exec(☆☆☆.mayaa#attribute)
> > > at
> > >
> org.seasar.mayaa.impl.cycle.script.rhino.TextCompiledScriptImpl.normalExecute(TextCompiledScriptImpl.java:126)
> > > at
> > >
> org.seasar.mayaa.impl.cycle.script.rhino.TextCompiledScriptImpl.execute(TextCompiledScriptImpl.java:166)
> > > at
> > >
> org.seasar.mayaa.impl.cycle.script.ComplexScript.execute(ComplexScript.java:55)
> > > at
> > >
> org.seasar.mayaa.impl.engine.processor.AttributeProcessor$ScriptWrapper.execute(AttributeProcessor.java:279)
> > > at
> > >
> org.seasar.mayaa.impl.engine.processor.AttributeProcessor$EscapableScript.execute(AttributeProcessor.java:209)
> > > at
> > >
> org.seasar.mayaa.impl.engine.processor.ElementProcessor.appendAttributeString(ElementProcessor.java:308)
> > > at
> > >
> org.seasar.mayaa.impl.engine.processor.ElementProcessor.writePart2(ElementProcessor.java:372)
> > > at
> > >
> org.seasar.mayaa.impl.engine.processor.ElementProcessor.writeStartElement(ElementProcessor.java:431)
> > > at
> > >
> org.seasar.mayaa.impl.engine.processor.AbstractAttributableProcessor.processEnd(AbstractAttributableProcessor.java:237)
> > > at
> > >
> org.seasar.mayaa.impl.engine.processor.ElementProcessor.processEnd(ElementProcessor.java:459)
> > > at
> > >
> org.seasar.mayaa.impl.engine.processor.AbstractAttributableProcessor.doEndProcess(AbstractAttributableProcessor.java:220)
> > > at
> > >
> org.seasar.mayaa.impl.engine.RenderUtil.renderTemplateProcessor(RenderUtil.java:158)
> > > at
> > >
> org.seasar.mayaa.impl.engine.RenderUtil.renderTemplateProcessorChildren(RenderUtil.java:209)
> > > at
> > >
> org.seasar.mayaa.impl.engine.RenderUtil.renderTemplateProcessor(RenderUtil.java:147)
> > > at
> > >
> org.seasar.mayaa.impl.engine.processor.ComponentRenderer.renderTemplate(ComponentRenderer.java:70)
> > > at
> > > org.seasar.mayaa.impl.engine.RenderUtil.renderP
>
--
--
suga ( ko.suga @ gmail.com )
-------------- next part --------------
HTML$B$NE:IU%U%!%$%k$rJ]4I$7$^$7$?(B...
URL:
From [E-MAIL ADDRESS DELETED] Fri Apr 25 11:48:00 2014
From: [E-MAIL ADDRESS DELETED] (Hara Hara)
Date: Fri, 25 Apr 2014 11:48:00 +0900
Subject: [mayaa-user:1029] Re:
=?iso-2022-jp?b?bWF5YWEbJEIkTiVhJWIlaiVqITwlLyRLJEQkLSReGyhC?=
=?iso-2022-jp?b?GyRCJDckRhsoQg==?=
In-Reply-To:
References: ,
,
,
Message-ID:
suga様
ありがとうございます。
以前のML確認させていただきましたが、
同様の現象が報告されていましたが最終的な解決に至ったかどうかが分かりませんでした。
わたくしの環境ではサイトのトラフィックが多い時はTomcat起動後1日で
NamespaceImpl.getInstanceで待っているスレッドが40以上ある状態で
CPU使用率が60%を超え、ページ表示に10-30秒かかっていました。
環境は
・mayaa-1.1.32
・java version "1.6.0_24"
OpenJDK Runtime Environment (IcedTea6 1.11.14) (amazon-65.1.11.14.57.amzn1-x86_64)
OpenJDK 64-Bit Server VM (build 20.0-b12, mixed mode)
・Tomcat/7.0.47
で、サーバーのメモリは3G積んでおり、
mayaaの設定は
としております。
スレッドの優先度の問題ではないかとのご回答もありましたが、
ダンプを見ると全て優先度は同じ10となっていて、
他に優先度が高いものはみあたりませんでした。
上記のCPU60%の時のスレッドダンプを添付させていただきました。
お忙しいところ大変申し訳ございません、
解消のためのアドバイスをいただけますよう、何卒よろしくお願いいたします。
Date: Fri, 25 Apr 2014 06:57:27 +0900
From: ko.suga @ gmail.com
To: mayaa-user @ ml.seasar.org
Subject: [mayaa-user:1028] Re: mayaaのメモリリークにつきまして
sugaです。
これ自体は単にsynchronizedの待ちなので正常にありえます。同じオブジェクトを延々待ち続けているとかなら問題の可能性はありますが。
2014年4月24日木曜日、Hara Haraさんは書きました:
suga様
いつもお世話になっております。
大変申し訳ございません、メモリリークではなく無限ループですね・・・
確認したところ、insertタグでnameを指定していないところがあり、
それがループしていたようです。
お忙しいところお手間と取らせてしまい申し訳ございません。
大変恐縮ですが、もう一点ご教示いただけますでしょうか。
稀にページ表示に30秒ちかくかかることがあり、そういう場合に下記のような状態のスレッドが
幾つか存在しているのですが、これは問題ないでしょうか。
java.lang.Thread.State: BLOCKED (on object monitor)
at org.seasar.mayaa.impl.engine.specification.NamespaceImpl.getInstance(NamespaceImpl.java:54)
- waiting to lock <0x00000000c6fcc808> (a org.seasar.mayaa.impl.util.ReferenceCache)
at org.seasar.mayaa.impl.engine.specification.NamespaceImpl.copyOf(NamespaceImpl.java:77)
どうぞよろしくお願いいたします。
> Date: Wed, 23 Apr 2014 07:59:12 +0900
> From: ko.suga @ gmail.com
> To: mayaa-user @ ml.seasar.org
> Subject: [mayaa-user:1025] Re: mayaaのメモリリークにつきまして
>
> suga です。
>
> まず、subjectにメモリリークとありますが、メモリリークだと判断した
> 理由は何でしょうか。文面にある情報からでは分かりませんが。
>
> InsertProcessor があるのでどこかで m:insert を使っているようですが、
> 循環してはいないでしょうか。
>
>
> --
> suga ( ko.suga @ gmail.com )
>
>
> 2014-04-23 0:21 GMT+09:00 Hara Hara :
> > お世話になっております。 石川と申します。
> >
> > Tomcat7+JDK6で稼働中のアプリで、スレッドダンプを取った時に下記のログが
> > 出力されます。
> >
> > "http-bio-8083-exec-5" daemon prio=10 tid=0x00007f035c0d4800 nid=0x6ecb
> > runnable [0x00007f039cc1a000]
> > java.lang.Thread.State: RUNNABLE
> > at java.util.HashMap.getEntry(HashMap.java:364)
> > at java.util.HashMap.containsKey(HashMap.java:352)
> > at
> > org.seasar.mayaa.impl.cycle.script.rhino.PageAttributeScope.has(PageAttributeScope.java:83)
> > at
> > org.seasar.mayaa.impl.cycle.script.rhino.PageAttributeScope.findScope(PageAttributeScope.java:140)
> > at
> > org.seasar.mayaa.impl.cycle.script.rhino.PageAttributeScope.hasAttribute(PageAttributeScope.java:148)
> > at
> > org.seasar.mayaa.impl.cycle.CycleUtil.findStandardAttributeScope(CycleUtil.java:149)
> > at
> > org.seasar.mayaa.impl.cycle.script.rhino.NativeServiceCycle.get(NativeServiceCycle.java:75)
> > at
> > org.mozilla.javascript.ScriptableObject.getProperty(ScriptableObject.java:1617)
> > at
> > org.mozilla.javascript.ScriptRuntime.nameOrFunction(ScriptRuntime.java:1746)
> > at org.mozilla.javascript.ScriptRuntime.name(ScriptRuntime.java:1697)
> > at org.mozilla.javascript.gen.c83128._c0(☆☆☆.mayaa#attribute:83)
> > at org.mozilla.javascript.gen.c83128.call(☆☆☆.mayaa#attribute)
> > at
> > org.mozilla.javascript.ContextFactory.doTopCall(ContextFactory.java:398)
> > at
> > org.mozilla.javascript.ScriptRuntime.doTopCall(ScriptRuntime.java:3065)
> > at org.mozilla.javascript.gen.c83128.call(☆☆☆.mayaa#attribute)
> > at org.mozilla.javascript.gen.c83128.exec(☆☆☆.mayaa#attribute)
> > at
> > org.seasar.mayaa.impl.cycle.script.rhino.TextCompiledScriptImpl.normalExecute(TextCompiledScriptImpl.java:126)
> > at
> > org.seasar.mayaa.impl.cycle.script.rhino.TextCompiledScriptImpl.execute(TextCompiledScriptImpl.java:166)
> > at
> > org.seasar.mayaa.impl.cycle.script.ComplexScript.execute(ComplexScript.java:55)
> > at
> > org.seasar.mayaa.impl.engine.processor.AttributeProcessor$ScriptWrapper.execute(AttributeProcessor.java:279)
> > at
> > org.seasar.mayaa.impl.engine.processor.AttributeProcessor$EscapableScript.execute(AttributeProcessor.java:209)
> > at
> > org.seasar.mayaa.impl.engine.processor.ElementProcessor.appendAttributeString(ElementProcessor.java:308)
> > at
> > org.seasar.mayaa.impl.engine.processor.ElementProcessor.writePart2(ElementProcessor.java:372)
> > at
> > org.seasar.mayaa.impl.engine.processor.ElementProcessor.writeStartElement(ElementProcessor.java:431)
> > at
> > org.seasar.mayaa.impl.engine.processor.AbstractAttributableProcessor.processEnd(AbstractAttributableProcessor.java:237)
> > at
> > org.seasar.mayaa.impl.engine.processor.ElementProcessor.processEnd(ElementProcessor.java:459)
> > at
> > org.seasar.mayaa.impl.engine.processor.AbstractAttributableProcessor.doEndProcess(AbstractAttributableProcessor.java:220)
> > at
> > org.seasar.mayaa.impl.engine.RenderUtil.renderTemplateProcessor(RenderUtil.java:158)
> > at
> > org.seasar.mayaa.impl.engine.RenderUtil.renderTemplateProcessorChildren(RenderUtil.java:209)
> > at
> > org.seasar.mayaa.impl.engine.RenderUtil.renderTemplateProcessor(RenderUtil.java:147)
> > at
> > org.seasar.mayaa.impl.engine.processor.ComponentRenderer.renderTemplate(ComponentRenderer.java:70)
> > at
> > org.seasar.mayaa.impl.engine.RenderUtil.renderP
--
--
suga ( ko.suga @ gmail.com )
_______________________________________________
mayaa-user mailing list
mayaa-user @ ml.seasar.org
https://ml.seasar.org/mailman/listinfo/mayaa-user
-------------- next part --------------
HTMLの添付ファイルを保管しました...
URL:
-------------- next part --------------
テキスト形式以外の添付ファイルを保管しました...
ファイル名: catalina.tgz
型: application/x-compressed
サイズ: 8749 バイト
説明: 無し
URL:
From [E-MAIL ADDRESS DELETED] Fri Apr 25 11:52:08 2014
From: [E-MAIL ADDRESS DELETED] (Susumu ISHIGAMI)
Date: Fri, 25 Apr 2014 11:52:08 +0900
Subject: [mayaa-user:1030] Re:
=?utf-8?b?bWF5YWHjga7jg6Hjg6Ljg6rjg6rjg7zjgq/jgavjgaTjgY0=?=
=?utf-8?b?44G+44GX44Gm?=
In-Reply-To:
References:
Message-ID:
石上と申します
> 稀にページ表示に30秒ちかくかかることがあり、そういう場合に下記のような状態のスレッドが
一ユーザーとしてですが、私も、やはりレンダリングに30秒近くかかることを観測しています
当該スレッドについては私の環境では観測しておりませんが、概ね下記の条件下で発生しています。
・高負荷環境(秒間数十PV以上)
・テンプレートファイルの更新直後(キャッシュ破棄→再ビルド)
・比較的大きめでDOMツリーが深いテンプレートファイル
・XPathを使用している
・mayaaファイル(特にdefault.mayaa)が巨大
もし、条件が同じであれば、
JMeterで高負荷をかけることで、ローカル環境でも再現できます。
もし、次の対策が可能なら、解消できるかもしれません。
・pageSerializeを有効にし、起動時にautoBuildを使用する
・ランタイムのテンプレートやmayaaファイルの更新を許可しない運用とする
・XPathを使用しない(org.seasar.mayaa.provider.ServiceProviderで
をコメントアウト)
・アプリケーションサーバーの同時処理スレッド数を減らす(全体のレスポンスが低下する可能性があります)
まだ効果が出せるかわかりませんが
別スレッドでsugaさんにアドバイスをいただきながら
この件の対策を行っておりますので、
共有できることがあれば報告させていただきます。
(詳しくは [mayaa-user:1023] Re: 頻繁にレンダリングを行っていると、ページのビルドが遅くなります をご参照ください)
2014年4月25日 6:57 suga :
> sugaです。
>
> これ自体は単にsynchronizedの待ちなので正常にありえます。
> 同じオブジェクトを延々待ち続けているとかなら問題の可能性はありますが。
>
>
> 2014年4月24日木曜日、Hara Haraさんは書きました:
>
>> suga様
>>
>> いつもお世話になっております。
>> 大変申し訳ございません、メモリリークではなく無限ループですね・・・
>> 確認したところ、insertタグでnameを指定していないところがあり、
>> それがループしていたようです。
>> お忙しいところお手間と取らせてしまい申し訳ございません。
>>
>> 大変恐縮ですが、もう一点ご教示いただけますでしょうか。
>> 稀にページ表示に30秒ちかくかかることがあり、そういう場合に下記のような状態のスレッドが
>> 幾つか存在しているのですが、これは問題ないでしょうか。
>>
>> java.lang.Thread.State: BLOCKED (on object monitor)
>> at
>> org.seasar.mayaa.impl.engine.specification.NamespaceImpl.getInstance(NamespaceImpl.java:54)
>> - waiting to lock <0x00000000c6fcc808> (a
>> org.seasar.mayaa.impl.util.ReferenceCache)
>> at
>> org.seasar.mayaa.impl.engine.specification.NamespaceImpl.copyOf(NamespaceImpl.java:77)
>>
>> どうぞよろしくお願いいたします。
>>
>> > Date: Wed, 23 Apr 2014 07:59:12 +0900
>> > From: ko.suga @ gmail.com
>> > To: mayaa-user @ ml.seasar.org
>> > Subject: [mayaa-user:1025] Re: mayaaのメモリリークにつきまして
>> >
>> > suga です。
>> >
>> > まず、subjectにメモリリークとありますが、メモリリークだと判断した
>> > 理由は何でしょうか。文面にある情報からでは分かりませんが。
>> >
>> > InsertProcessor があるのでどこかで m:insert を使っているようですが、
>> > 循環してはいないでしょうか。
>> >
>> >
>> > --
>> > suga ( ko.suga @ gmail.com )
>> >
>> >
>> > 2014-04-23 0:21 GMT+09:00 Hara Hara :
>> > > お世話になっております。 石川と申します。
>> > >
>> > > Tomcat7+JDK6で稼働中のアプリで、スレッドダンプを取った時に下記のログが
>> > > 出力されます。
>> > >
>> > > "http-bio-8083-exec-5" daemon prio=10 tid=0x00007f035c0d4800
>> > > nid=0x6ecb
>> > > runnable [0x00007f039cc1a000]
>> > > java.lang.Thread.State: RUNNABLE
>> > > at java.util.HashMap.getEntry(HashMap.java:364)
>> > > at java.util.HashMap.containsKey(HashMap.java:352)
>> > > at
>> > >
>> > > org.seasar.mayaa.impl.cycle.script.rhino.PageAttributeScope.has(PageAttributeScope.java:83)
>> > > at
>> > >
>> > > org.seasar.mayaa.impl.cycle.script.rhino.PageAttributeScope.findScope(PageAttributeScope.java:140)
>> > > at
>> > >
>> > > org.seasar.mayaa.impl.cycle.script.rhino.PageAttributeScope.hasAttribute(PageAttributeScope.java:148)
>> > > at
>> > >
>> > > org.seasar.mayaa.impl.cycle.CycleUtil.findStandardAttributeScope(CycleUtil.java:149)
>> > > at
>> > >
>> > > org.seasar.mayaa.impl.cycle.script.rhino.NativeServiceCycle.get(NativeServiceCycle.java:75)
>> > > at
>> > >
>> > > org.mozilla.javascript.ScriptableObject.getProperty(ScriptableObject.java:1617)
>> > > at
>> > >
>> > > org.mozilla.javascript.ScriptRuntime.nameOrFunction(ScriptRuntime.java:1746)
>> > > at org.mozilla.javascript.ScriptRuntime.name(ScriptRuntime.java:1697)
>> > > at org.mozilla.javascript.gen.c83128._c0(☆☆☆.mayaa#attribute:83)
>> > > at org.mozilla.javascript.gen.c83128.call(☆☆☆.mayaa#attribute)
>> > > at
>> > >
>> > > org.mozilla.javascript.ContextFactory.doTopCall(ContextFactory.java:398)
>> > > at
>> > >
>> > > org.mozilla.javascript.ScriptRuntime.doTopCall(ScriptRuntime.java:3065)
>> > > at org.mozilla.javascript.gen.c83128.call(☆☆☆.mayaa#attribute)
>> > > at org.mozilla.javascript.gen.c83128.exec(☆☆☆.mayaa#attribute)
>> > > at
>> > >
>> > > org.seasar.mayaa.impl.cycle.script.rhino.TextCompiledScriptImpl.normalExecute(TextCompiledScriptImpl.java:126)
>> > > at
>> > >
>> > > org.seasar.mayaa.impl.cycle.script.rhino.TextCompiledScriptImpl.execute(TextCompiledScriptImpl.java:166)
>> > > at
>> > >
>> > > org.seasar.mayaa.impl.cycle.script.ComplexScript.execute(ComplexScript.java:55)
>> > > at
>> > >
>> > > org.seasar.mayaa.impl.engine.processor.AttributeProcessor$ScriptWrapper.execute(AttributeProcessor.java:279)
>> > > at
>> > >
>> > > org.seasar.mayaa.impl.engine.processor.AttributeProcessor$EscapableScript.execute(AttributeProcessor.java:209)
>> > > at
>> > >
>> > > org.seasar.mayaa.impl.engine.processor.ElementProcessor.appendAttributeString(ElementProcessor.java:308)
>> > > at
>> > >
>> > > org.seasar.mayaa.impl.engine.processor.ElementProcessor.writePart2(ElementProcessor.java:372)
>> > > at
>> > >
>> > > org.seasar.mayaa.impl.engine.processor.ElementProcessor.writeStartElement(ElementProcessor.java:431)
>> > > at
>> > >
>> > > org.seasar.mayaa.impl.engine.processor.AbstractAttributableProcessor.processEnd(AbstractAttributableProcessor.java:237)
>> > > at
>> > >
>> > > org.seasar.mayaa.impl.engine.processor.ElementProcessor.processEnd(ElementProcessor.java:459)
>> > > at
>> > >
>> > > org.seasar.mayaa.impl.engine.processor.AbstractAttributableProcessor.doEndProcess(AbstractAttributableProcessor.java:220)
>> > > at
>> > >
>> > > org.seasar.mayaa.impl.engine.RenderUtil.renderTemplateProcessor(RenderUtil.java:158)
>> > > at
>> > >
>> > > org.seasar.mayaa.impl.engine.RenderUtil.renderTemplateProcessorChildren(RenderUtil.java:209)
>> > > at
>> > >
>> > > org.seasar.mayaa.impl.engine.RenderUtil.renderTemplateProcessor(RenderUtil.java:147)
>> > > at
>> > >
>> > > org.seasar.mayaa.impl.engine.processor.ComponentRenderer.renderTemplate(ComponentRenderer.java:70)
>> > > at
>> > > org.seasar.mayaa.impl.engine.RenderUtil.renderP
>
>
>
> --
> --
> suga ( ko.suga @ gmail.com )
>
> _______________________________________________
> mayaa-user mailing list
> mayaa-user @ ml.seasar.org
> https://ml.seasar.org/mailman/listinfo/mayaa-user
--
Susumu ISHIGAMI
susumu.ishigami @ gmail.com
From [E-MAIL ADDRESS DELETED] Fri Apr 25 12:19:44 2014
From: [E-MAIL ADDRESS DELETED] (gmail)
Date: Fri, 25 Apr 2014 12:19:44 +0900
Subject: [mayaa-user:1031] Re:
=?iso-2022-jp?b?bWF5YWEbJEIkTiVhJWIlaiVqITwlLyRLJEQkLSReGyhC?=
=?iso-2022-jp?b?GyRCJDckRhsoQg==?=
In-Reply-To:
References:
Message-ID: <57E2756E-7F0F-4A5E-A41D-58CE2F32B50B@gmail.com>
iPhoneから送信
2014/04/25 11:52、Susumu ISHIGAMI のメッセージ:
> 石上と申します
>
>> 稀にページ表示に30秒ちかくかかることがあり、そういう場合に下記のような状態のスレッドが
>
> 一ユーザーとしてですが、私も、やはりレンダリングに30秒近くかかることを観測しています
> 当該スレッドについては私の環境では観測しておりませんが、概ね下記の条件下で発生しています。
>
> ・高負荷環境(秒間数十PV以上)
> ・テンプレートファイルの更新直後(キャッシュ破棄→再ビルド)
> ・比較的大きめでDOMツリーが深いテンプレートファイル
> ・XPathを使用している
> ・mayaaファイル(特にdefault.mayaa)が巨大
>
> もし、条件が同じであれば、
> JMeterで高負荷をかけることで、ローカル環境でも再現できます。
> もし、次の対策が可能なら、解消できるかもしれません。
>
> ・pageSerializeを有効にし、起動時にautoBuildを使用する
> ・ランタイムのテンプレートやmayaaファイルの更新を許可しない運用とする
> ・XPathを使用しない(org.seasar.mayaa.provider.ServiceProviderで
>
> をコメントアウト)
> ・アプリケーションサーバーの同時処理スレッド数を減らす(全体のレスポンスが低下する可能性があります)
>
> まだ効果が出せるかわかりませんが
> 別スレッドでsugaさんにアドバイスをいただきながら
> この件の対策を行っておりますので、
> 共有できることがあれば報告させていただきます。
> (詳しくは [mayaa-user:1023] Re: 頻繁にレンダリングを行っていると、ページのビルドが遅くなります をご参照ください)
>
>
> 2014年4月25日 6:57 suga :
>> sugaです。
>>
>> これ自体は単にsynchronizedの待ちなので正常にありえます。
>> 同じオブジェクトを延々待ち続けているとかなら問題の可能性はありますが。
>>
>>
>> 2014年4月24日木曜日、Hara Haraさんは書きました:
>>
>>> suga様
>>>
>>> いつもお世話になっております。
>>> 大変申し訳ございません、メモリリークではなく無限ループですね・・・
>>> 確認したところ、insertタグでnameを指定していないところがあり、
>>> それがループしていたようです。
>>> お忙しいところお手間と取らせてしまい申し訳ございません。
>>>
>>> 大変恐縮ですが、もう一点ご教示いただけますでしょうか。
>>> 稀にページ表示に30秒ちかくかかることがあり、そういう場合に下記のような状態のスレッドが
>>> 幾つか存在しているのですが、これは問題ないでしょうか。
>>>
>>> java.lang.Thread.State: BLOCKED (on object monitor)
>>> at
>>> org.seasar.mayaa.impl.engine.specification.NamespaceImpl.getInstance(NamespaceImpl.java:54)
>>> - waiting to lock <0x00000000c6fcc808> (a
>>> org.seasar.mayaa.impl.util.ReferenceCache)
>>> at
>>> org.seasar.mayaa.impl.engine.specification.NamespaceImpl.copyOf(NamespaceImpl.java:77)
>>>
>>> どうぞよろしくお願いいたします。
>>>
>>>> Date: Wed, 23 Apr 2014 07:59:12 +0900
>>>> From: ko.suga @ gmail.com
>>>> To: mayaa-user @ ml.seasar.org
>>>> Subject: [mayaa-user:1025] Re: mayaaのメモリリークにつきまして
>>>>
>>>> suga です。
>>>>
>>>> まず、subjectにメモリリークとありますが、メモリリークだと判断した
>>>> 理由は何でしょうか。文面にある情報からでは分かりませんが。
>>>>
>>>> InsertProcessor があるのでどこかで m:insert を使っているようですが、
>>>> 循環してはいないでしょうか。
>>>>
>>>>
>>>> --
>>>> suga ( ko.suga @ gmail.com )
>>>>
>>>>
>>>> 2014-04-23 0:21 GMT+09:00 Hara Hara :
>>>>> お世話になっております。 石川と申します。
>>>>>
>>>>> Tomcat7+JDK6で稼働中のアプリで、スレッドダンプを取った時に下記のログが
>>>>> 出力されます。
>>>>>
>>>>> "http-bio-8083-exec-5" daemon prio=10 tid=0x00007f035c0d4800
>>>>> nid=0x6ecb
>>>>> runnable [0x00007f039cc1a000]
>>>>> java.lang.Thread.State: RUNNABLE
>>>>> at java.util.HashMap.getEntry(HashMap.java:364)
>>>>> at java.util.HashMap.containsKey(HashMap.java:352)
>>>>> at
>>>>>
>>>>> org.seasar.mayaa.impl.cycle.script.rhino.PageAttributeScope.has(PageAttributeScope.java:83)
>>>>> at
>>>>>
>>>>> org.seasar.mayaa.impl.cycle.script.rhino.PageAttributeScope.findScope(PageAttributeScope.java:140)
>>>>> at
>>>>>
>>>>> org.seasar.mayaa.impl.cycle.script.rhino.PageAttributeScope.hasAttribute(PageAttributeScope.java:148)
>>>>> at
>>>>>
>>>>> org.seasar.mayaa.impl.cycle.CycleUtil.findStandardAttributeScope(CycleUtil.java:149)
>>>>> at
>>>>>
>>>>> org.seasar.mayaa.impl.cycle.script.rhino.NativeServiceCycle.get(NativeServiceCycle.java:75)
>>>>> at
>>>>>
>>>>> org.mozilla.javascript.ScriptableObject.getProperty(ScriptableObject.java:1617)
>>>>> at
>>>>>
>>>>> org.mozilla.javascript.ScriptRuntime.nameOrFunction(ScriptRuntime.java:1746)
>>>>> at org.mozilla.javascript.ScriptRuntime.name(ScriptRuntime.java:1697)
>>>>> at org.mozilla.javascript.gen.c83128._c0(☆☆☆.mayaa#attribute:83)
>>>>> at org.mozilla.javascript.gen.c83128.call(☆☆☆.mayaa#attribute)
>>>>> at
>>>>>
>>>>> org.mozilla.javascript.ContextFactory.doTopCall(ContextFactory.java:398)
>>>>> at
>>>>>
>>>>> org.mozilla.javascript.ScriptRuntime.doTopCall(ScriptRuntime.java:3065)
>>>>> at org.mozilla.javascript.gen.c83128.call(☆☆☆.mayaa#attribute)
>>>>> at org.mozilla.javascript.gen.c83128.exec(☆☆☆.mayaa#attribute)
>>>>> at
>>>>>
>>>>> org.seasar.mayaa.impl.cycle.script.rhino.TextCompiledScriptImpl.normalExecute(TextCompiledScriptImpl.java:126)
>>>>> at
>>>>>
>>>>> org.seasar.mayaa.impl.cycle.script.rhino.TextCompiledScriptImpl.execute(TextCompiledScriptImpl.java:166)
>>>>> at
>>>>>
>>>>> org.seasar.mayaa.impl.cycle.script.ComplexScript.execute(ComplexScript.java:55)
>>>>> at
>>>>>
>>>>> org.seasar.mayaa.impl.engine.processor.AttributeProcessor$ScriptWrapper.execute(AttributeProcessor.java:279)
>>>>> at
>>>>>
>>>>> org.seasar.mayaa.impl.engine.processor.AttributeProcessor$EscapableScript.execute(AttributeProcessor.java:209)
>>>>> at
>>>>>
>>>>> org.seasar.mayaa.impl.engine.processor.ElementProcessor.appendAttributeString(ElementProcessor.java:308)
>>>>> at
>>>>>
>>>>> org.seasar.mayaa.impl.engine.processor.ElementProcessor.writePart2(ElementProcessor.java:372)
>>>>> at
>>>>>
>>>>> org.seasar.mayaa.impl.engine.processor.ElementProcessor.writeStartElement(ElementProcessor.java:431)
>>>>> at
>>>>>
>>>>> org.seasar.mayaa.impl.engine.processor.AbstractAttributableProcessor.processEnd(AbstractAttributableProcessor.java:237)
>>>>> at
>>>>>
>>>>> org.seasar.mayaa.impl.engine.processor.ElementProcessor.processEnd(ElementProcessor.java:459)
>>>>> at
>>>>>
>>>>> org.seasar.mayaa.impl.engine.processor.AbstractAttributableProcessor.doEndProcess(AbstractAttributableProcessor.java:220)
>>>>> at
>>>>>
>>>>> org.seasar.mayaa.impl.engine.RenderUtil.renderTemplateProcessor(RenderUtil.java:158)
>>>>> at
>>>>>
>>>>> org.seasar.mayaa.impl.engine.RenderUtil.renderTemplateProcessorChildren(RenderUtil.java:209)
>>>>> at
>>>>>
>>>>> org.seasar.mayaa.impl.engine.RenderUtil.renderTemplateProcessor(RenderUtil.java:147)
>>>>> at
>>>>>
>>>>> org.seasar.mayaa.impl.engine.processor.ComponentRenderer.renderTemplate(ComponentRenderer.java:70)
>>>>> at
>>>>> org.seasar.mayaa.impl.engine.RenderUtil.renderP
>>
>>
>>
>> --
>> --
>> suga ( ko.suga @ gmail.com )
>>
>> _______________________________________________
>> mayaa-user mailing list
>> mayaa-user @ ml.seasar.org
>> https://ml.seasar.org/mailman/listinfo/mayaa-user
>
>
>
> --
> Susumu ISHIGAMI
> susumu.ishigami @ gmail.com
> _______________________________________________
> mayaa-user mailing list
> mayaa-user @ ml.seasar.org
> https://ml.seasar.org/mailman/listinfo/mayaa-user
From [E-MAIL ADDRESS DELETED] Fri Apr 25 22:30:21 2014
From: [E-MAIL ADDRESS DELETED] (Hara Hara)
Date: Fri, 25 Apr 2014 22:30:21 +0900
Subject: [mayaa-user:1032] Re:
=?iso-2022-jp?b?bWF5YWEbJEIkTiVhJWIlaiVqITwlLyRLJEQkLSReGyhC?=
=?iso-2022-jp?b?GyRCJDckRhsoQg==?=
In-Reply-To:
References: ,
,
,
,
Message-ID:
石上様
ご教示いただきありがとうございます。
わたくしの現象でも高負荷環境で、特にmayaaファイルが複雑で
DOMツリーの深いテンプレートで発生しております。
> ・pageSerializeを有効にし、起動時にautoBuildを使用する
> ・ランタイムのテンプレートやmayaaファイルの更新を許可しない運用とする
> ・XPathを使用しない(org.seasar.mayaa.provider.ServiceProviderで
>
> をコメントアウト)
> ・アプリケーションサーバーの同時処理スレッド数を減らす(全体のレスポンスが低下する可能性があります)
ありがとうございます、サイトの運用上、どうしても頻繁にテンプレートの更新が
発生してしまいますが、
可能な限り負荷の少ない時間帯で更新を行うよう心がけます。
また、XPathは使用しておりませんので、コメントアウトをいたします。
autoBuildは次回再起動時に設定してみます。
今後も石上様のMLを参考にさせていただきます。
引き続き、どうぞよろしくお願いいたします。
> From: susumu.ishigami @ gmail.com
> Date: Fri, 25 Apr 2014 11:52:08 +0900
> To: mayaa-user @ ml.seasar.org
> Subject: [mayaa-user:1030] Re: mayaaのメモリリークにつきまして
>
> 石上と申します
>
> > 稀にページ表示に30秒ちかくかかることがあり、そういう場合に下記のような状態のスレッドが
>
> 一ユーザーとしてですが、私も、やはりレンダリングに30秒近くかかることを観測しています
> 当該スレッドについては私の環境では観測しておりませんが、概ね下記の条件下で発生しています。
>
> ・高負荷環境(秒間数十PV以上)
> ・テンプレートファイルの更新直後(キャッシュ破棄→再ビルド)
> ・比較的大きめでDOMツリーが深いテンプレートファイル
> ・XPathを使用している
> ・mayaaファイル(特にdefault.mayaa)が巨大
>
> もし、条件が同じであれば、
> JMeterで高負荷をかけることで、ローカル環境でも再現できます。
> もし、次の対策が可能なら、解消できるかもしれません。
>
> ・pageSerializeを有効にし、起動時にautoBuildを使用する
> ・ランタイムのテンプレートやmayaaファイルの更新を許可しない運用とする
> ・XPathを使用しない(org.seasar.mayaa.provider.ServiceProviderで
>
> をコメントアウト)
> ・アプリケーションサーバーの同時処理スレッド数を減らす(全体のレスポンスが低下する可能性があります)
>
> まだ効果が出せるかわかりませんが
> 別スレッドでsugaさんにアドバイスをいただきながら
> この件の対策を行っておりますので、
> 共有できることがあれば報告させていただきます。
> (詳しくは [mayaa-user:1023] Re: 頻繁にレンダリングを行っていると、ページのビルドが遅くなります をご参照ください)
>
>
> 2014年4月25日 6:57 suga :
> > sugaです。
> >
> > これ自体は単にsynchronizedの待ちなので正常にありえます。
> > 同じオブジェクトを延々待ち続けているとかなら問題の可能性はありますが。
> >
> >
> > 2014年4月24日木曜日、Hara Haraさんは書きました:
> >
> >> suga様
> >>
> >> いつもお世話になっております。
> >> 大変申し訳ございません、メモリリークではなく無限ループですね・・・
> >> 確認したところ、insertタグでnameを指定していないところがあり、
> >> それがループしていたようです。
> >> お忙しいところお手間と取らせてしまい申し訳ございません。
> >>
> >> 大変恐縮ですが、もう一点ご教示いただけますでしょうか。
> >> 稀にページ表示に30秒ちかくかかることがあり、そういう場合に下記のような状態のスレッドが
> >> 幾つか存在しているのですが、これは問題ないでしょうか。
> >>
> >> java.lang.Thread.State: BLOCKED (on object monitor)
> >> at
> >> org.seasar.mayaa.impl.engine.specification.NamespaceImpl.getInstance(NamespaceImpl.java:54)
> >> - waiting to lock <0x00000000c6fcc808> (a
> >> org.seasar.mayaa.impl.util.ReferenceCache)
> >> at
> >> org.seasar.mayaa.impl.engine.specification.NamespaceImpl.copyOf(NamespaceImpl.java:77)
> >>
> >> どうぞよろしくお願いいたします。
> >>
> >> > Date: Wed, 23 Apr 2014 07:59:12 +0900
> >> > From: ko.suga @ gmail.com
> >> > To: mayaa-user @ ml.seasar.org
> >> > Subject: [mayaa-user:1025] Re: mayaaのメモリリークにつきまして
> >> >
> >> > suga です。
> >> >
> >> > まず、subjectにメモリリークとありますが、メモリリークだと判断した
> >> > 理由は何でしょうか。文面にある情報からでは分かりませんが。
> >> >
> >> > InsertProcessor があるのでどこかで m:insert を使っているようですが、
> >> > 循環してはいないでしょうか。
> >> >
> >> >
> >> > --
> >> > suga ( ko.suga @ gmail.com )
> >> >
> >> >
> >> > 2014-04-23 0:21 GMT+09:00 Hara Hara :
> >> > > お世話になっております。 石川と申します。
> >> > >
> >> > > Tomcat7+JDK6で稼働中のアプリで、スレッドダンプを取った時に下記のログが
> >> > > 出力されます。
> >> > >
> >> > > "http-bio-8083-exec-5" daemon prio=10 tid=0x00007f035c0d4800
> >> > > nid=0x6ecb
> >> > > runnable [0x00007f039cc1a000]
> >> > > java.lang.Thread.State: RUNNABLE
> >> > > at java.util.HashMap.getEntry(HashMap.java:364)
> >> > > at java.util.HashMap.containsKey(HashMap.java:352)
> >> > > at
> >> > >
> >> > > org.seasar.mayaa.impl.cycle.script.rhino.PageAttributeScope.has(PageAttributeScope.java:83)
> >> > > at
> >> > >
> >> > > org.seasar.mayaa.impl.cycle.script.rhino.PageAttributeScope.findScope(PageAttributeScope.java:140)
> >> > > at
> >> > >
> >> > > org.seasar.mayaa.impl.cycle.script.rhino.PageAttributeScope.hasAttribute(PageAttributeScope.java:148)
> >> > > at
> >> > >
> >> > > org.seasar.mayaa.impl.cycle.CycleUtil.findStandardAttributeScope(CycleUtil.java:149)
> >> > > at
> >> > >
> >> > > org.seasar.mayaa.impl.cycle.script.rhino.NativeServiceCycle.get(NativeServiceCycle.java:75)
> >> > > at
> >> > >
> >> > > org.mozilla.javascript.ScriptableObject.getProperty(ScriptableObject.java:1617)
> >> > > at
> >> > >
> >> > > org.mozilla.javascript.ScriptRuntime.nameOrFunction(ScriptRuntime.java:1746)
> >> > > at org.mozilla.javascript.ScriptRuntime.name(ScriptRuntime.java:1697)
> >> > > at org.mozilla.javascript.gen.c83128._c0(☆☆☆.mayaa#attribute:83)
> >> > > at org.mozilla.javascript.gen.c83128.call(☆☆☆.mayaa#attribute)
> >> > > at
> >> > >
> >> > > org.mozilla.javascript.ContextFactory.doTopCall(ContextFactory.java:398)
> >> > > at
> >> > >
> >> > > org.mozilla.javascript.ScriptRuntime.doTopCall(ScriptRuntime.java:3065)
> >> > > at org.mozilla.javascript.gen.c83128.call(☆☆☆.mayaa#attribute)
> >> > > at org.mozilla.javascript.gen.c83128.exec(☆☆☆.mayaa#attribute)
> >> > > at
> >> > >
> >> > > org.seasar.mayaa.impl.cycle.script.rhino.TextCompiledScriptImpl.normalExecute(TextCompiledScriptImpl.java:126)
> >> > > at
> >> > >
> >> > > org.seasar.mayaa.impl.cycle.script.rhino.TextCompiledScriptImpl.execute(TextCompiledScriptImpl.java:166)
> >> > > at
> >> > >
> >> > > org.seasar.mayaa.impl.cycle.script.ComplexScript.execute(ComplexScript.java:55)
> >> > > at
> >> > >
> >> > > org.seasar.mayaa.impl.engine.processor.AttributeProcessor$ScriptWrapper.execute(AttributeProcessor.java:279)
> >> > > at
> >> > >
> >> > > org.seasar.mayaa.impl.engine.processor.AttributeProcessor$EscapableScript.execute(AttributeProcessor.java:209)
> >> > > at
> >> > >
> >> > > org.seasar.mayaa.impl.engine.processor.ElementProcessor.appendAttributeString(ElementProcessor.java:308)
> >> > > at
> >> > >
> >> > > org.seasar.mayaa.impl.engine.processor.ElementProcessor.writePart2(ElementProcessor.java:372)
> >> > > at
> >> > >
> >> > > org.seasar.mayaa.impl.engine.processor.ElementProcessor.writeStartElement(ElementProcessor.java:431)
> >> > > at
> >> > >
> >> > > org.seasar.mayaa.impl.engine.processor.AbstractAttributableProcessor.processEnd(AbstractAttributableProcessor.java:237)
> >> > > at
> >> > >
> >> > > org.seasar.mayaa.impl.engine.processor.ElementProcessor.processEnd(ElementProcessor.java:459)
> >> > > at
> >> > >
> >> > > org.seasar.mayaa.impl.engine.processor.AbstractAttributableProcessor.doEndProcess(AbstractAttributableProcessor.java:220)
> >> > > at
> >> > >
> >> > > org.seasar.mayaa.impl.engine.RenderUtil.renderTemplateProcessor(RenderUtil.java:158)
> >> > > at
> >> > >
> >> > > org.seasar.mayaa.impl.engine.RenderUtil.renderTemplateProcessorChildren(RenderUtil.java:209)
> >> > > at
> >> > >
> >> > > org.seasar.mayaa.impl.engine.RenderUtil.renderTemplateProcessor(RenderUtil.java:147)
> >> > > at
> >> > >
> >> > > org.seasar.mayaa.impl.engine.processor.ComponentRenderer.renderTemplate(ComponentRenderer.java:70)
> >> > > at
> >> > > org.seasar.mayaa.impl.engine.RenderUtil.renderP
> >
> >
> >
> > --
> > --
> > suga ( ko.suga @ gmail.com )
> >
> > _______________________________________________
> > mayaa-user mailing list
> > mayaa-user @ ml.seasar.org
> > https://ml.seasar.org/mailman/listinfo/mayaa-user
>
>
>
> --
> Susumu ISHIGAMI
> susumu.ishigami @ gmail.com
> _______________________________________________
> mayaa-user mailing list
> mayaa-user @ ml.seasar.org
> https://ml.seasar.org/mailman/listinfo/mayaa-user
-------------- next part --------------
HTMLの添付ファイルを保管しました...
URL:
From [E-MAIL ADDRESS DELETED] Fri Apr 25 22:58:52 2014
From: [E-MAIL ADDRESS DELETED] (Susumu ISHIGAMI)
Date: Fri, 25 Apr 2014 22:58:52 +0900
Subject: [mayaa-user:1033] Re:
=?utf-8?b?bWF5YWHjga7jg6Hjg6Ljg6rjg6rjg7zjgq/jgavjgaTjgY0=?=
=?utf-8?b?44G+44GX44Gm?=
In-Reply-To:
References:
Message-ID:
石上です。
スタックトレースを拝見させていただきましたが、私のところで発生している現象とは異なる箇所のようです。
早とちりで申し訳ありません。
org.seasar.mayaa.impl.util.ReferenceCache.ReferenceCacheIterator.hasNext()
内部でスレッドが停止しているように思われますので、
Full-GCが発生して、ReferenceCacheのリストが大量に破棄されてしまったのかもしれません。
jstat -gcutilなどを使用して、当該現象発生時のGCのログを確認してみるとなにかわかるかもしれません。
JVMパラメータのチューニングも役立つかもしれません。
ヒープダンプを取ることが可能でしたら解析する価値もあると思います。
2014年4月25日 22:30 Hara Hara :
> 石上様
>
> ご教示いただきありがとうございます。
> わたくしの現象でも高負荷環境で、特にmayaaファイルが複雑で
> DOMツリーの深いテンプレートで発生しております。
>
>
>> ・pageSerializeを有効にし、起動時にautoBuildを使用する
>> ・ランタイムのテンプレートやmayaaファイルの更新を許可しない運用とする
>> ・XPathを使用しない(org.seasar.mayaa.provider.ServiceProviderで
>> > class="org.seasar.mayaa.impl.builder.injection.XPathMatchesInjectionResolver"/>
>> をコメントアウト)
>> ・アプリケーションサーバーの同時処理スレッド数を減らす(全体のレスポンスが低下する可能性があります)
> ありがとうございます、サイトの運用上、どうしても頻繁にテンプレートの更新が
> 発生してしまいますが、
> 可能な限り負荷の少ない時間帯で更新を行うよう心がけます。
> また、XPathは使用しておりませんので、コメントアウトをいたします。
> autoBuildは次回再起動時に設定してみます。
>
> 今後も石上様のMLを参考にさせていただきます。
> 引き続き、どうぞよろしくお願いいたします。
>
>> From: susumu.ishigami @ gmail.com
>> Date: Fri, 25 Apr 2014 11:52:08 +0900
>> To: mayaa-user @ ml.seasar.org
>> Subject: [mayaa-user:1030] Re: mayaaのメモリリークにつきまして
>
>>
>> 石上と申します
>>
>> > 稀にページ表示に30秒ちかくかかることがあり、そういう場合に下記のような状態のスレッドが
>>
>> 一ユーザーとしてですが、私も、やはりレンダリングに30秒近くかかることを観測しています
>> 当該スレッドについては私の環境では観測しておりませんが、概ね下記の条件下で発生しています。
>>
>> ・高負荷環境(秒間数十PV以上)
>> ・テンプレートファイルの更新直後(キャッシュ破棄→再ビルド)
>> ・比較的大きめでDOMツリーが深いテンプレートファイル
>> ・XPathを使用している
>> ・mayaaファイル(特にdefault.mayaa)が巨大
>>
>> もし、条件が同じであれば、
>> JMeterで高負荷をかけることで、ローカル環境でも再現できます。
>> もし、次の対策が可能なら、解消できるかもしれません。
>>
>> ・pageSerializeを有効にし、起動時にautoBuildを使用する
>> ・ランタイムのテンプレートやmayaaファイルの更新を許可しない運用とする
>> ・XPathを使用しない(org.seasar.mayaa.provider.ServiceProviderで
>> > class="org.seasar.mayaa.impl.builder.injection.XPathMatchesInjectionResolver"/>
>> をコメントアウト)
>> ・アプリケーションサーバーの同時処理スレッド数を減らす(全体のレスポンスが低下する可能性があります)
>>
>> まだ効果が出せるかわかりませんが
>> 別スレッドでsugaさんにアドバイスをいただきながら
>> この件の対策を行っておりますので、
>> 共有できることがあれば報告させていただきます。
>> (詳しくは [mayaa-user:1023] Re: 頻繁にレンダリングを行っていると、ページのビルドが遅くなります をご参照ください)
>>
>>
>> 2014年4月25日 6:57 suga :
>> > sugaです。
>> >
>> > これ自体は単にsynchronizedの待ちなので正常にありえます。
>> > 同じオブジェクトを延々待ち続けているとかなら問題の可能性はありますが。
>> >
>> >
>> > 2014年4月24日木曜日、Hara Haraさんは書きました:
>> >
>> >> suga様
>> >>
>> >> いつもお世話になっております。
>> >> 大変申し訳ございません、メモリリークではなく無限ループですね・・・
>> >> 確認したところ、insertタグでnameを指定していないところがあり、
>> >> それがループしていたようです。
>> >> お忙しいところお手間と取らせてしまい申し訳ございません。
>> >>
>> >> 大変恐縮ですが、もう一点ご教示いただけますでしょうか。
>> >> 稀にページ表示に30秒ちかくかかることがあり、そういう場合に下記のような状態のスレッドが
>> >> 幾つか存在しているのですが、これは問題ないでしょうか。
>> >>
>> >> java.lang.Thread.State: BLOCKED (on object monitor)
>> >> at
>> >>
>> >> org.seasar.mayaa.impl.engine.specification.NamespaceImpl.getInstance(NamespaceImpl.java:54)
>> >> - waiting to lock <0x00000000c6fcc808> (a
>> >> org.seasar.mayaa.impl.util.ReferenceCache)
>> >> at
>> >>
>> >> org.seasar.mayaa.impl.engine.specification.NamespaceImpl.copyOf(NamespaceImpl.java:77)
>> >>
>> >> どうぞよろしくお願いいたします。
>> >>
>> >> > Date: Wed, 23 Apr 2014 07:59:12 +0900
>> >> > From: ko.suga @ gmail.com
>> >> > To: mayaa-user @ ml.seasar.org
>> >> > Subject: [mayaa-user:1025] Re: mayaaのメモリリークにつきまして
>> >> >
>> >> > suga です。
>> >> >
>> >> > まず、subjectにメモリリークとありますが、メモリリークだと判断した
>> >> > 理由は何でしょうか。文面にある情報からでは分かりませんが。
>> >> >
>> >> > InsertProcessor があるのでどこかで m:insert を使っているようですが、
>> >> > 循環してはいないでしょうか。
>> >> >
>> >> >
>> >> > --
>> >> > suga ( ko.suga @ gmail.com )
>> >> >
>> >> >
>> >> > 2014-04-23 0:21 GMT+09:00 Hara Hara :
>> >> > > お世話になっております。 石川と申します。
>> >> > >
>> >> > > Tomcat7+JDK6で稼働中のアプリで、スレッドダンプを取った時に下記のログが
>> >> > > 出力されます。
>> >> > >
>> >> > > "http-bio-8083-exec-5" daemon prio=10 tid=0x00007f035c0d4800
>> >> > > nid=0x6ecb
>> >> > > runnable [0x00007f039cc1a000]
>> >> > > java.lang.Thread.State: RUNNABLE
>> >> > > at java.util.HashMap.getEntry(HashMap.java:364)
>> >> > > at java.util.HashMap.containsKey(HashMap.java:352)
>> >> > > at
>> >> > >
>> >> > >
>> >> > > org.seasar.mayaa.impl.cycle.script.rhino.PageAttributeScope.has(PageAttributeScope.java:83)
>> >> > > at
>> >> > >
>> >> > >
>> >> > > org.seasar.mayaa.impl.cycle.script.rhino.PageAttributeScope.findScope(PageAttributeScope.java:140)
>> >> > > at
>> >> > >
>> >> > >
>> >> > > org.seasar.mayaa.impl.cycle.script.rhino.PageAttributeScope.hasAttribute(PageAttributeScope.java:148)
>> >> > > at
>> >> > >
>> >> > >
>> >> > > org.seasar.mayaa.impl.cycle.CycleUtil.findStandardAttributeScope(CycleUtil.java:149)
>> >> > > at
>> >> > >
>> >> > >
>> >> > > org.seasar.mayaa.impl.cycle.script.rhino.NativeServiceCycle.get(NativeServiceCycle.java:75)
>> >> > > at
>> >> > >
>> >> > >
>> >> > > org.mozilla.javascript.ScriptableObject.getProperty(ScriptableObject.java:1617)
>> >> > > at
>> >> > >
>> >> > >
>> >> > > org.mozilla.javascript.ScriptRuntime.nameOrFunction(ScriptRuntime.java:1746)
>> >> > > at
>> >> > > org.mozilla.javascript.ScriptRuntime.name(ScriptRuntime.java:1697)
>> >> > > at org.mozilla.javascript.gen.c83128._c0(☆☆☆.mayaa#attribute:83)
>> >> > > at org.mozilla.javascript.gen.c83128.call(☆☆☆.mayaa#attribute)
>> >> > > at
>> >> > >
>> >> > >
>> >> > > org.mozilla.javascript.ContextFactory.doTopCall(ContextFactory.java:398)
>> >> > > at
>> >> > >
>> >> > >
>> >> > > org.mozilla.javascript.ScriptRuntime.doTopCall(ScriptRuntime.java:3065)
>> >> > > at org.mozilla.javascript.gen.c83128.call(☆☆☆.mayaa#attribute)
>> >> > > at org.mozilla.javascript.gen.c83128.exec(☆☆☆.mayaa#attribute)
>> >> > > at
>> >> > >
>> >> > >
>> >> > > org.seasar.mayaa.impl.cycle.script.rhino.TextCompiledScriptImpl.normalExecute(TextCompiledScriptImpl.java:126)
>> >> > > at
>> >> > >
>> >> > >
>> >> > > org.seasar.mayaa.impl.cycle.script.rhino.TextCompiledScriptImpl.execute(TextCompiledScriptImpl.java:166)
>> >> > > at
>> >> > >
>> >> > >
>> >> > > org.seasar.mayaa.impl.cycle.script.ComplexScript.execute(ComplexScript.java:55)
>> >> > > at
>> >> > >
>> >> > >
>> >> > > org.seasar.mayaa.impl.engine.processor.AttributeProcessor$ScriptWrapper.execute(AttributeProcessor.java:279)
>> >> > > at
>> >> > >
>> >> > >
>> >> > > org.seasar.mayaa.impl.engine.processor.AttributeProcessor$EscapableScript.execute(AttributeProcessor.java:209)
>> >> > > at
>> >> > >
>> >> > >
>> >> > > org.seasar.mayaa.impl.engine.processor.ElementProcessor.appendAttributeString(ElementProcessor.java:308)
>> >> > > at
>> >> > >
>> >> > >
>> >> > > org.seasar.mayaa.impl.engine.processor.ElementProcessor.writePart2(ElementProcessor.java:372)
>> >> > > at
>> >> > >
>> >> > >
>> >> > > org.seasar.mayaa.impl.engine.processor.ElementProcessor.writeStartElement(ElementProcessor.java:431)
>> >> > > at
>> >> > >
>> >> > >
>> >> > > org.seasar.mayaa.impl.engine.processor.AbstractAttributableProcessor.processEnd(AbstractAttributableProcessor.java:237)
>> >> > > at
>> >> > >
>> >> > >
>> >> > > org.seasar.mayaa.impl.engine.processor.ElementProcessor.processEnd(ElementProcessor.java:459)
>> >> > > at
>> >> > >
>> >> > >
>> >> > > org.seasar.mayaa.impl.engine.processor.AbstractAttributableProcessor.doEndProcess(AbstractAttributableProcessor.java:220)
>> >> > > at
>> >> > >
>> >> > >
>> >> > > org.seasar.mayaa.impl.engine.RenderUtil.renderTemplateProcessor(RenderUtil.java:158)
>> >> > > at
>> >> > >
>> >> > >
>> >> > > org.seasar.mayaa.impl.engine.RenderUtil.renderTemplateProcessorChildren(RenderUtil.java:209)
>> >> > > at
>> >> > >
>> >> > >
>> >> > > org.seasar.mayaa.impl.engine.RenderUtil.renderTemplateProcessor(RenderUtil.java:147)
>> >> > > at
>> >> > >
>> >> > >
>> >> > > org.seasar.mayaa.impl.engine.processor.ComponentRenderer.renderTemplate(ComponentRenderer.java:70)
>> >> > > at
>> >> > > org.seasar.mayaa.impl.engine.RenderUtil.renderP
>> >
>> >
>> >
>> > --
>> > --
>> > suga ( ko.suga @ gmail.com )
>> >
>> > _______________________________________________
>> > mayaa-user mailing list
>> > mayaa-user @ ml.seasar.org
>> > https://ml.seasar.org/mailman/listinfo/mayaa-user
>>
>>
>>
>> --
>> Susumu ISHIGAMI
>> susumu.ishigami @ gmail.com
>> _______________________________________________
>> mayaa-user mailing list
>> mayaa-user @ ml.seasar.org
>> https://ml.seasar.org/mailman/listinfo/mayaa-user
>
> _______________________________________________
> mayaa-user mailing list
> mayaa-user @ ml.seasar.org
> https://ml.seasar.org/mailman/listinfo/mayaa-user
--
Susumu ISHIGAMI
susumu.ishigami @ gmail.com
From [E-MAIL ADDRESS DELETED] Sat Apr 26 10:11:41 2014
From: [E-MAIL ADDRESS DELETED] (Hara Hara)
Date: Sat, 26 Apr 2014 10:11:41 +0900
Subject: [mayaa-user:1034] Re:
=?iso-2022-jp?b?bWF5YWEbJEIkTiVhJWIlaiVqITwlLyRLJEQkLSReGyhC?=
=?iso-2022-jp?b?GyRCJDckRhsoQg==?=
In-Reply-To:
References: ,
,
,
,
,
,
Message-ID:
石上様
ご確認いただきありがとうございます。
> Full-GCが発生して、ReferenceCacheのリストが大量に破棄されてしまったのかもしれません。
確かにFull-GCが度々発生しているようでした・・
> JVMパラメータのチューニングも役立つかもしれません。
ありがとうございます!こちら早速試してみます。
ヒープダンプも次回発生した際に取得して確認いたします。
また結果ご報告させていただきます。
どうぞよろしくお願いいたします。
> From: susumu.ishigami @ gmail.com
> Date: Fri, 25 Apr 2014 22:58:52 +0900
> To: mayaa-user @ ml.seasar.org
> Subject: [mayaa-user:1033] Re: mayaaのメモリリークにつきまして
>
> 石上です。
>
> スタックトレースを拝見させていただきましたが、私のところで発生している現象とは異なる箇所のようです。
> 早とちりで申し訳ありません。
>
> org.seasar.mayaa.impl.util.ReferenceCache.ReferenceCacheIterator.hasNext()
> 内部でスレッドが停止しているように思われますので、
> Full-GCが発生して、ReferenceCacheのリストが大量に破棄されてしまったのかもしれません。
>
> jstat -gcutilなどを使用して、当該現象発生時のGCのログを確認してみるとなにかわかるかもしれません。
> JVMパラメータのチューニングも役立つかもしれません。
> ヒープダンプを取ることが可能でしたら解析する価値もあると思います。
>
> 2014年4月25日 22:30 Hara Hara :
> > 石上様
> >
> > ご教示いただきありがとうございます。
> > わたくしの現象でも高負荷環境で、特にmayaaファイルが複雑で
> > DOMツリーの深いテンプレートで発生しております。
> >
> >
> >> ・pageSerializeを有効にし、起動時にautoBuildを使用する
> >> ・ランタイムのテンプレートやmayaaファイルの更新を許可しない運用とする
> >> ・XPathを使用しない(org.seasar.mayaa.provider.ServiceProviderで
> >> >> class="org.seasar.mayaa.impl.builder.injection.XPathMatchesInjectionResolver"/>
> >> をコメントアウト)
> >> ・アプリケーションサーバーの同時処理スレッド数を減らす(全体のレスポンスが低下する可能性があります)
> > ありがとうございます、サイトの運用上、どうしても頻繁にテンプレートの更新が
> > 発生してしまいますが、
> > 可能な限り負荷の少ない時間帯で更新を行うよう心がけます。
> > また、XPathは使用しておりませんので、コメントアウトをいたします。
> > autoBuildは次回再起動時に設定してみます。
> >
> > 今後も石上様のMLを参考にさせていただきます。
> > 引き続き、どうぞよろしくお願いいたします。
> >
> >> From: susumu.ishigami @ gmail.com
> >> Date: Fri, 25 Apr 2014 11:52:08 +0900
> >> To: mayaa-user @ ml.seasar.org
> >> Subject: [mayaa-user:1030] Re: mayaaのメモリリークにつきまして
> >
> >>
> >> 石上と申します
> >>
> >> > 稀にページ表示に30秒ちかくかかることがあり、そういう場合に下記のような状態のスレッドが
> >>
> >> 一ユーザーとしてですが、私も、やはりレンダリングに30秒近くかかることを観測しています
> >> 当該スレッドについては私の環境では観測しておりませんが、概ね下記の条件下で発生しています。
> >>
> >> ・高負荷環境(秒間数十PV以上)
> >> ・テンプレートファイルの更新直後(キャッシュ破棄→再ビルド)
> >> ・比較的大きめでDOMツリーが深いテンプレートファイル
> >> ・XPathを使用している
> >> ・mayaaファイル(特にdefault.mayaa)が巨大
> >>
> >> もし、条件が同じであれば、
> >> JMeterで高負荷をかけることで、ローカル環境でも再現できます。
> >> もし、次の対策が可能なら、解消できるかもしれません。
> >>
> >> ・pageSerializeを有効にし、起動時にautoBuildを使用する
> >> ・ランタイムのテンプレートやmayaaファイルの更新を許可しない運用とする
> >> ・XPathを使用しない(org.seasar.mayaa.provider.ServiceProviderで
> >> >> class="org.seasar.mayaa.impl.builder.injection.XPathMatchesInjectionResolver"/>
> >> をコメントアウト)
> >> ・アプリケーションサーバーの同時処理スレッド数を減らす(全体のレスポンスが低下する可能性があります)
> >>
> >> まだ効果が出せるかわかりませんが
> >> 別スレッドでsugaさんにアドバイスをいただきながら
> >> この件の対策を行っておりますので、
> >> 共有できることがあれば報告させていただきます。
> >> (詳しくは [mayaa-user:1023] Re: 頻繁にレンダリングを行っていると、ページのビルドが遅くなります をご参照ください)
> >>
> >>
> >> 2014年4月25日 6:57 suga :
> >> > sugaです。
> >> >
> >> > これ自体は単にsynchronizedの待ちなので正常にありえます。
> >> > 同じオブジェクトを延々待ち続けているとかなら問題の可能性はありますが。
> >> >
> >> >
> >> > 2014年4月24日木曜日、Hara Haraさんは書きました:
> >> >
> >> >> suga様
> >> >>
> >> >> いつもお世話になっております。
> >> >> 大変申し訳ございません、メモリリークではなく無限ループですね・・・
> >> >> 確認したところ、insertタグでnameを指定していないところがあり、
> >> >> それがループしていたようです。
> >> >> お忙しいところお手間と取らせてしまい申し訳ございません。
> >> >>
> >> >> 大変恐縮ですが、もう一点ご教示いただけますでしょうか。
> >> >> 稀にページ表示に30秒ちかくかかることがあり、そういう場合に下記のような状態のスレッドが
> >> >> 幾つか存在しているのですが、これは問題ないでしょうか。
> >> >>
> >> >> java.lang.Thread.State: BLOCKED (on object monitor)
> >> >> at
> >> >>
> >> >> org.seasar.mayaa.impl.engine.specification.NamespaceImpl.getInstance(NamespaceImpl.java:54)
> >> >> - waiting to lock <0x00000000c6fcc808> (a
> >> >> org.seasar.mayaa.impl.util.ReferenceCache)
> >> >> at
> >> >>
> >> >> org.seasar.mayaa.impl.engine.specification.NamespaceImpl.copyOf(NamespaceImpl.java:77)
> >> >>
> >> >> どうぞよろしくお願いいたします。
> >> >>
> >> >> > Date: Wed, 23 Apr 2014 07:59:12 +0900
> >> >> > From: ko.suga @ gmail.com
> >> >> > To: mayaa-user @ ml.seasar.org
> >> >> > Subject: [mayaa-user:1025] Re: mayaaのメモリリークにつきまして
> >> >> >
> >> >> > suga です。
> >> >> >
> >> >> > まず、subjectにメモリリークとありますが、メモリリークだと判断した
> >> >> > 理由は何でしょうか。文面にある情報からでは分かりませんが。
> >> >> >
> >> >> > InsertProcessor があるのでどこかで m:insert を使っているようですが、
> >> >> > 循環してはいないでしょうか。
> >> >> >
> >> >> >
> >> >> > --
> >> >> > suga ( ko.suga @ gmail.com )
> >> >> >
> >> >> >
> >> >> > 2014-04-23 0:21 GMT+09:00 Hara Hara :
> >> >> > > お世話になっております。 石川と申します。
> >> >> > >
> >> >> > > Tomcat7+JDK6で稼働中のアプリで、スレッドダンプを取った時に下記のログが
> >> >> > > 出力されます。
> >> >> > >
> >> >> > > "http-bio-8083-exec-5" daemon prio=10 tid=0x00007f035c0d4800
> >> >> > > nid=0x6ecb
> >> >> > > runnable [0x00007f039cc1a000]
> >> >> > > java.lang.Thread.State: RUNNABLE
> >> >> > > at java.util.HashMap.getEntry(HashMap.java:364)
> >> >> > > at java.util.HashMap.containsKey(HashMap.java:352)
> >> >> > > at
> >> >> > >
> >> >> > >
> >> >> > > org.seasar.mayaa.impl.cycle.script.rhino.PageAttributeScope.has(PageAttributeScope.java:83)
> >> >> > > at
> >> >> > >
> >> >> > >
> >> >> > > org.seasar.mayaa.impl.cycle.script.rhino.PageAttributeScope.findScope(PageAttributeScope.java:140)
> >> >> > > at
> >> >> > >
> >> >> > >
> >> >> > > org.seasar.mayaa.impl.cycle.script.rhino.PageAttributeScope.hasAttribute(PageAttributeScope.java:148)
> >> >> > > at
> >> >> > >
> >> >> > >
> >> >> > > org.seasar.mayaa.impl.cycle.CycleUtil.findStandardAttributeScope(CycleUtil.java:149)
> >> >> > > at
> >> >> > >
> >> >> > >
> >> >> > > org.seasar.mayaa.impl.cycle.script.rhino.NativeServiceCycle.get(NativeServiceCycle.java:75)
> >> >> > > at
> >> >> > >
> >> >> > >
> >> >> > > org.mozilla.javascript.ScriptableObject.getProperty(ScriptableObject.java:1617)
> >> >> > > at
> >> >> > >
> >> >> > >
> >> >> > > org.mozilla.javascript.ScriptRuntime.nameOrFunction(ScriptRuntime.java:1746)
> >> >> > > at
> >> >> > > org.mozilla.javascript.ScriptRuntime.name(ScriptRuntime.java:1697)
> >> >> > > at org.mozilla.javascript.gen.c83128._c0(☆☆☆.mayaa#attribute:83)
> >> >> > > at org.mozilla.javascript.gen.c83128.call(☆☆☆.mayaa#attribute)
> >> >> > > at
> >> >> > >
> >> >> > >
> >> >> > > org.mozilla.javascript.ContextFactory.doTopCall(ContextFactory.java:398)
> >> >> > > at
> >> >> > >
> >> >> > >
> >> >> > > org.mozilla.javascript.ScriptRuntime.doTopCall(ScriptRuntime.java:3065)
> >> >> > > at org.mozilla.javascript.gen.c83128.call(☆☆☆.mayaa#attribute)
> >> >> > > at org.mozilla.javascript.gen.c83128.exec(☆☆☆.mayaa#attribute)
> >> >> > > at
> >> >> > >
> >> >> > >
> >> >> > > org.seasar.mayaa.impl.cycle.script.rhino.TextCompiledScriptImpl.normalExecute(TextCompiledScriptImpl.java:126)
> >> >> > > at
> >> >> > >
> >> >> > >
> >> >> > > org.seasar.mayaa.impl.cycle.script.rhino.TextCompiledScriptImpl.execute(TextCompiledScriptImpl.java:166)
> >> >> > > at
> >> >> > >
> >> >> > >
> >> >> > > org.seasar.mayaa.impl.cycle.script.ComplexScript.execute(ComplexScript.java:55)
> >> >> > > at
> >> >> > >
> >> >> > >
> >> >> > > org.seasar.mayaa.impl.engine.processor.AttributeProcessor$ScriptWrapper.execute(AttributeProcessor.java:279)
> >> >> > > at
> >> >> > >
> >> >> > >
> >> >> > > org.seasar.mayaa.impl.engine.processor.AttributeProcessor$EscapableScript.execute(AttributeProcessor.java:209)
> >> >> > > at
> >> >> > >
> >> >> > >
> >> >> > > org.seasar.mayaa.impl.engine.processor.ElementProcessor.appendAttributeString(ElementProcessor.java:308)
> >> >> > > at
> >> >> > >
> >> >> > >
> >> >> > > org.seasar.mayaa.impl.engine.processor.ElementProcessor.writePart2(ElementProcessor.java:372)
> >> >> > > at
> >> >> > >
> >> >> > >
> >> >> > > org.seasar.mayaa.impl.engine.processor.ElementProcessor.writeStartElement(ElementProcessor.java:431)
> >> >> > > at
> >> >> > >
> >> >> > >
> >> >> > > org.seasar.mayaa.impl.engine.processor.AbstractAttributableProcessor.processEnd(AbstractAttributableProcessor.java:237)
> >> >> > > at
> >> >> > >
> >> >> > >
> >> >> > > org.seasar.mayaa.impl.engine.processor.ElementProcessor.processEnd(ElementProcessor.java:459)
> >> >> > > at
> >> >> > >
> >> >> > >
> >> >> > > org.seasar.mayaa.impl.engine.processor.AbstractAttributableProcessor.doEndProcess(AbstractAttributableProcessor.java:220)
> >> >> > > at
> >> >> > >
> >> >> > >
> >> >> > > org.seasar.mayaa.impl.engine.RenderUtil.renderTemplateProcessor(RenderUtil.java:158)
> >> >> > > at
> >> >> > >
> >> >> > >
> >> >> > > org.seasar.mayaa.impl.engine.RenderUtil.renderTemplateProcessorChildren(RenderUtil.java:209)
> >> >> > > at
> >> >> > >
> >> >> > >
> >> >> > > org.seasar.mayaa.impl.engine.RenderUtil.renderTemplateProcessor(RenderUtil.java:147)
> >> >> > > at
> >> >> > >
> >> >> > >
> >> >> > > org.seasar.mayaa.impl.engine.processor.ComponentRenderer.renderTemplate(ComponentRenderer.java:70)
> >> >> > > at
> >> >> > > org.seasar.mayaa.impl.engine.RenderUtil.renderP
> >> >
> >> >
> >> >
> >> > --
> >> > --
> >> > suga ( ko.suga @ gmail.com )
> >> >
> >> > _______________________________________________
> >> > mayaa-user mailing list
> >> > mayaa-user @ ml.seasar.org
> >> > https://ml.seasar.org/mailman/listinfo/mayaa-user
> >>
> >>
> >>
> >> --
> >> Susumu ISHIGAMI
> >> susumu.ishigami @ gmail.com
> >> _______________________________________________
> >> mayaa-user mailing list
> >> mayaa-user @ ml.seasar.org
> >> https://ml.seasar.org/mailman/listinfo/mayaa-user
> >
> > _______________________________________________
> > mayaa-user mailing list
> > mayaa-user @ ml.seasar.org
> > https://ml.seasar.org/mailman/listinfo/mayaa-user
>
>
>
> --
> Susumu ISHIGAMI
> susumu.ishigami @ gmail.com
> _______________________________________________
> mayaa-user mailing list
> mayaa-user @ ml.seasar.org
> https://ml.seasar.org/mailman/listinfo/mayaa-user
-------------- next part --------------
HTMLの添付ファイルを保管しました...
URL:
From [E-MAIL ADDRESS DELETED] Sat Apr 26 20:38:11 2014
From: [E-MAIL ADDRESS DELETED] (Susumu ISHIGAMI)
Date: Sat, 26 Apr 2014 20:38:11 +0900
Subject: [mayaa-user:1035] Re:
=?utf-8?q?XPathMatchesInjectionResolver=E3=81=AE=E9=AB=98?=
=?utf-8?b?6YCf5YyW44Gr44Gk44GE44Gm?=
In-Reply-To:
References:
Message-ID:
石上です。
XPathInjectionResolverの改善を私の扱っている案件で行いました。
extendによる拡張のみで対応ができたため、Mayaa本体のソースコードに手を加えておりません。
下記1から4までの対応によって、
私のPCで単体でビルドに5秒以上かかっていたテンプレートファイルのビルド時間が、
最短3.75秒に短縮されました。
これらのうち、3,4の対応を本体に取り込むことは難しいと思いますが、
1,2の対策はmayaa本体の改善に寄与する可能性がありますので、
もしよろしければ、本体に取り込む可能性をご検討いただければと思います。
また、本件のテスト中、別の問題として、ビルド時間にヒープに残サイズが影響することがわかりました。
GCを強制実行すると、直後のビルド時間が最短に近づきます。FullGC直前では12秒かかりました。
これはJavaVMのパラメータによって動作が変わる可能性がありますが、
何か改善の余地があるかもしれませんので、私の方で何かわかれば報告致します。
この問題があるため、速度向上に最も寄与したのが1から4のどれなのかわからない状態となってしまいました。
以下、詳細をご説明します。どなたかのご参考になれば幸いです。
ソースコードはタブの代わりに全角スペースを使用しています。
1.org.seasar.mayaa.impl.builder.injection.XPathMatchesInjectionResolver.getNode(SpecificationNode,
InjectionChain)の冒頭で、
不要なSpecificationNodeに対する処理をスキップ
ログを仕掛けてみると、第一パラメータに、QName = http://mayaa.seasar.org/characters など、私の理解では
XPathで処理する必要がないと思われるNodeが入ってきていました。
そこで、下記のif文を追加し、後続の処理を行わないようにしました。
// 処理不要なnodeを除外
if (qName.equals(QM_COMMENT)
|| qName.equals(QM_CHARACTERS)
|| qName.equals(QM_DOCTYPE)
|| qName.equals(QM_CDATA)) {
return chain.getNode(original);
}
この対策はEqualsIDInjectionResolverに対しても有効でしたので、私のところではこちらにも追記しました。
ただ、EqualsIDInjectionResolverの場合はすぐにgetIDの結果で弾かれてしまうため、効果は小さいと思われます。
2.getXPathNodes(mayaa, injectNodes);の結果をキャッシュしました。
もともとgetXPathNodesを呼んでいる箇所をgetXPathNodesWithCacheに変更し、
下記のように実装しました。
@SuppressWarnings({ "rawtypes", "unchecked" })
private void getXPathNodesWithCache(SpecificationNode mayaa, List
specificationNodes) {
List injectedNodes = getXPathNodesFromCache(mayaa);
specificationNodes.addAll(injectedNodes);
return;
}
@SuppressWarnings("rawtypes")
private List getXPathNodesFromCache(SpecificationNode mayaa) {
Map cache =
MyTemplateBuilderImpl.getXPathNodesCacheOfThisRequest();
List injectedNodes = cache.get(mayaa);
if (injectedNodes == null) {
injectedNodes = new ArrayList();
getXPathNodes(mayaa, injectedNodes);
cache.put(mayaa, injectedNodes);
}
return injectedNodes;
}
なお、MyTemplateBuilderImpl.getXPathNodesCacheOfThisRequest();は独自で作成したTemplateBuilderImplで、以下のように実装していています。
@Override
public void build(Specification specification) {
@SuppressWarnings("rawtypes")
Map cache = new HashMap();
CycleUtil.getRequestScope().setAttribute("xPathNodesCache", cache);
super.build(specification);
cache.clear();
CycleUtil.getRequestScope().removeAttribute("xPathNodesCache");
}
@SuppressWarnings({ "unchecked", "rawtypes" })
public static Map getXPathNodesCacheOfThisRequest() {
return (Map)
CycleUtil.getRequestScope().getAttribute("xPathNodesCache");
}
レイジーロードにしても良かったのですが、キャッシュの寿命を自分で管理したかったためこのようにしました。
3.getXPathNodesの実装を変更し不要な要素を辿らないようにしました。
@SuppressWarnings({ "rawtypes", "unchecked" })
@Override
protected void getXPathNodes(SpecificationNode node, List specificationNodes) {
if (node == null) {
throw new IllegalArgumentException();
}
for (Iterator it = node.iterateChildNode(); it.hasNext();) {
SpecificationNode child = (SpecificationNode) it.next();
if (QM_MAYAA.equals(node.getQName())) {
String xpath = SpecificationUtil.getAttributeValue(child,
QM_XPATH);
if (StringUtil.hasValue(xpath)) {
specificationNodes.add(child);
}
} else {
getXPathNodes(child, specificationNodes);
}
}
}
今のロジックでは、mayaaノード直下以外にxpathを記載した場合エラーメッセージを出力することができますが、
その機能がなくなる代わりに、mayaaファイル内でたどるノード数を減らしました。
4.XPathUtil.matchesを使用する手前で独自の条件分岐を行い、可能な限りxpath処理を行わないようにしました。
これは、html/head/titleなどほとんど決め打ちであることが多かったためです。
パフォーマンスを気にする状況で、一部のタグを決め打ちで書き換えたい場合は、
XPathを使わずに、このように独自のInjectionResolverを作成するアプローチもあり得ると思います。
2014年3月16日 19:21 suga :
> suga です。
>
>> mayaaファイル毎に、結果のリストをキャッシュして、
>> 2回目以降はキャッシュを利用するようにすれば高速化出来るのではないかと思われますが、
>> そのようなアプローチは可能でしょうか?
>
> XPath の処理回数を減らさないとあまり効果は無いかもしれません。
>
> MayaaのビルドはHTML側の要素を起点として.mayaa側を参照しに行くのですが、
> XPathとしてはその逆が本来のあり方ですので、処理速度を上げるには
>
> - XPathMatchesInjectionResolver 側のインスタンスでテンプレートをスキャン、
> - その結果に比較しに来たノードが含まれているかチェック
>
> という方向で作り替える必要があるかと思います。
>
> --
> suga ( ko.suga @ gmail.com )
>
>
> 2014-03-15 20:05 GMT+09:00 Susumu ISHIGAMI :
>> 石上です。
>>
>> mayaaを使用させて頂いているWebサイトで、
>> 複雑なテンプレートを扱うとテンプレートのビルドが遅くなる状況が発生しています。
>> プロファイラによって調べてみると下記の箇所が原因の一つではないかと思われてます。
>>
>> XPathMatchesInjectionResolver.getXPathNodes(SpecificationNode, List)
>>
>> 実際に、
>> org.seasar.mayaa.provider.ServiceProvider
>> を書き換えて
>>
>> をコメントアウトすると、ビルド時間が1/10に短縮されました。
>>
>> しかし実際にはmayaaファイルでm:xpathを使用してしまっておりますので、
>> 今更XPathMatchesInjectionResolverをやめるという選択肢はなく、
>> XPathMatchesInjectionResolverをある程度高速化出来ないかと検討しています。
>> (その際、多少の機能制限があってもしかたがないと思っています)
>>
>> getXPathNodes()
>> の実装を読ませていただきますと、
>> mayaaファイル全体をなめて再帰的に
>> getXPathNodes()
>> を呼び出しています。
>>
>> この呼出が、getNode()から呼ばれていますので、
>> テンプレートの全部の要素からgetXPathNodes()
>> の再帰ループが呼ばれているように見受けられます。
>>
>> mayaaファイル全体をなめるのであれば、
>> mayaaファイル毎に、結果のリストをキャッシュして、
>> 2回目以降はキャッシュを利用するようにすれば高速化出来るのではないかと思われますが、
>> そのようなアプローチは可能でしょうか?
>> _______________________________________________
>> mayaa-user mailing list
>> mayaa-user @ ml.seasar.org
>> https://ml.seasar.org/mailman/listinfo/mayaa-user
> _______________________________________________
> mayaa-user mailing list
> mayaa-user @ ml.seasar.org
> https://ml.seasar.org/mailman/listinfo/mayaa-user
--
Susumu ISHIGAMI
susumu.ishigami @ gmail.com
From [E-MAIL ADDRESS DELETED] Mon Apr 28 00:17:20 2014
From: [E-MAIL ADDRESS DELETED] (suga)
Date: Mon, 28 Apr 2014 00:17:20 +0900
Subject: [mayaa-user:1036] Re:
=?utf-8?q?XPathMatchesInjectionResolver=E3=81=AE=E9=AB=98?=
=?utf-8?b?6YCf5YyW44Gr44Gk44GE44Gm?=
In-Reply-To:
References:
Message-ID:
suga です。
ありがとうございます。
1. ですが、数量的におそらく効果があるのは characters くらいですかね。
一応既存と動きが変わってしまうので、パラメータで設定できるようにする形でしょうか。
2. はキャッシュする場所をどうするか検討します。
> 4.XPathUtil.matchesを使用する手前で独自の条件分岐を行い、可能な限りxpath処理を行わないようにしました。
> これは、html/head/titleなどほとんど決め打ちであることが多かったためです。
> パフォーマンスを気にする状況で、一部のタグを決め打ちで書き換えたい場合は、
> XPathを使わずに、このように独自のInjectionResolverを作成するアプローチもあり得ると思います。
そういえば以前、サンプルとしてタグ名のみでinjectionするものを書いたりしました。(確か日記?)
独自でルールを決められるのであれば、processor同様にどんどん作っても良いと思います。
# ドキュメントはちゃんと残さないといけませんが
http://www.seasar.org/source/browse/mayaa/branches/sandbox/mayaa-extensions/src/main/java/org/seasar/mayaa/impl/ex/builder/injection/ElementNameInjectionResolver.java?revision=3200&view=markup&pathrev=3239
--
suga ( ko.suga @ gmail.com )
2014-04-26 20:38 GMT+09:00 Susumu ISHIGAMI :
> 石上です。
>
> XPathInjectionResolverの改善を私の扱っている案件で行いました。
> extendによる拡張のみで対応ができたため、Mayaa本体のソースコードに手を加えておりません。
>
> 下記1から4までの対応によって、
> 私のPCで単体でビルドに5秒以上かかっていたテンプレートファイルのビルド時間が、
> 最短3.75秒に短縮されました。
>
> これらのうち、3,4の対応を本体に取り込むことは難しいと思いますが、
> 1,2の対策はmayaa本体の改善に寄与する可能性がありますので、
> もしよろしければ、本体に取り込む可能性をご検討いただければと思います。
>
> また、本件のテスト中、別の問題として、ビルド時間にヒープに残サイズが影響することがわかりました。
> GCを強制実行すると、直後のビルド時間が最短に近づきます。FullGC直前では12秒かかりました。
> これはJavaVMのパラメータによって動作が変わる可能性がありますが、
> 何か改善の余地があるかもしれませんので、私の方で何かわかれば報告致します。
> この問題があるため、速度向上に最も寄与したのが1から4のどれなのかわからない状態となってしまいました。
>
> 以下、詳細をご説明します。どなたかのご参考になれば幸いです。
> ソースコードはタブの代わりに全角スペースを使用しています。
>
> 1.org.seasar.mayaa.impl.builder.injection.XPathMatchesInjectionResolver.getNode(SpecificationNode,
> InjectionChain)の冒頭で、
> 不要なSpecificationNodeに対する処理をスキップ
>
> ログを仕掛けてみると、第一パラメータに、QName = http://mayaa.seasar.org/characters など、私の理解では
> XPathで処理する必要がないと思われるNodeが入ってきていました。
> そこで、下記のif文を追加し、後続の処理を行わないようにしました。
>
> // 処理不要なnodeを除外
> if (qName.equals(QM_COMMENT)
> || qName.equals(QM_CHARACTERS)
> || qName.equals(QM_DOCTYPE)
> || qName.equals(QM_CDATA)) {
> return chain.getNode(original);
> }
>
> この対策はEqualsIDInjectionResolverに対しても有効でしたので、私のところではこちらにも追記しました。
> ただ、EqualsIDInjectionResolverの場合はすぐにgetIDの結果で弾かれてしまうため、効果は小さいと思われます。
>
> 2.getXPathNodes(mayaa, injectNodes);の結果をキャッシュしました。
> もともとgetXPathNodesを呼んでいる箇所をgetXPathNodesWithCacheに変更し、
> 下記のように実装しました。
>
> @SuppressWarnings({ "rawtypes", "unchecked" })
> private void getXPathNodesWithCache(SpecificationNode mayaa, List
> specificationNodes) {
> List injectedNodes = getXPathNodesFromCache(mayaa);
> specificationNodes.addAll(injectedNodes);
> return;
> }
>
> @SuppressWarnings("rawtypes")
> private List getXPathNodesFromCache(SpecificationNode mayaa) {
> Map cache =
> MyTemplateBuilderImpl.getXPathNodesCacheOfThisRequest();
> List injectedNodes = cache.get(mayaa);
> if (injectedNodes == null) {
> injectedNodes = new ArrayList();
> getXPathNodes(mayaa, injectedNodes);
> cache.put(mayaa, injectedNodes);
> }
> return injectedNodes;
> }
>
> なお、MyTemplateBuilderImpl.getXPathNodesCacheOfThisRequest();は独自で作成したTemplateBuilderImplで、以下のように実装していています。
>
> @Override
> public void build(Specification specification) {
> @SuppressWarnings("rawtypes")
> Map cache = new HashMap();
> CycleUtil.getRequestScope().setAttribute("xPathNodesCache", cache);
> super.build(specification);
> cache.clear();
> CycleUtil.getRequestScope().removeAttribute("xPathNodesCache");
> }
>
> @SuppressWarnings({ "unchecked", "rawtypes" })
> public static Map getXPathNodesCacheOfThisRequest() {
> return (Map)
> CycleUtil.getRequestScope().getAttribute("xPathNodesCache");
> }
>
> レイジーロードにしても良かったのですが、キャッシュの寿命を自分で管理したかったためこのようにしました。
>
> 3.getXPathNodesの実装を変更し不要な要素を辿らないようにしました。
>
> @SuppressWarnings({ "rawtypes", "unchecked" })
> @Override
> protected void getXPathNodes(SpecificationNode node, List specificationNodes) {
> if (node == null) {
> throw new IllegalArgumentException();
> }
> for (Iterator it = node.iterateChildNode(); it.hasNext();) {
> SpecificationNode child = (SpecificationNode) it.next();
> if (QM_MAYAA.equals(node.getQName())) {
> String xpath = SpecificationUtil.getAttributeValue(child,
> QM_XPATH);
> if (StringUtil.hasValue(xpath)) {
> specificationNodes.add(child);
> }
> } else {
> getXPathNodes(child, specificationNodes);
> }
> }
> }
> 今のロジックでは、mayaaノード直下以外にxpathを記載した場合エラーメッセージを出力することができますが、
> その機能がなくなる代わりに、mayaaファイル内でたどるノード数を減らしました。
>
> 4.XPathUtil.matchesを使用する手前で独自の条件分岐を行い、可能な限りxpath処理を行わないようにしました。
> これは、html/head/titleなどほとんど決め打ちであることが多かったためです。
> パフォーマンスを気にする状況で、一部のタグを決め打ちで書き換えたい場合は、
> XPathを使わずに、このように独自のInjectionResolverを作成するアプローチもあり得ると思います。
>
> 2014年3月16日 19:21 suga :
>> suga です。
>>
>>> mayaaファイル毎に、結果のリストをキャッシュして、
>>> 2回目以降はキャッシュを利用するようにすれば高速化出来るのではないかと思われますが、
>>> そのようなアプローチは可能でしょうか?
>>
>> XPath の処理回数を減らさないとあまり効果は無いかもしれません。
>>
>> MayaaのビルドはHTML側の要素を起点として.mayaa側を参照しに行くのですが、
>> XPathとしてはその逆が本来のあり方ですので、処理速度を上げるには
>>
>> - XPathMatchesInjectionResolver 側のインスタンスでテンプレートをスキャン、
>> - その結果に比較しに来たノードが含まれているかチェック
>>
>> という方向で作り替える必要があるかと思います。
>>
>> --
>> suga ( ko.suga @ gmail.com )
>>
>>
>> 2014-03-15 20:05 GMT+09:00 Susumu ISHIGAMI :
>>> 石上です。
>>>
>>> mayaaを使用させて頂いているWebサイトで、
>>> 複雑なテンプレートを扱うとテンプレートのビルドが遅くなる状況が発生しています。
>>> プロファイラによって調べてみると下記の箇所が原因の一つではないかと思われてます。
>>>
>>> XPathMatchesInjectionResolver.getXPathNodes(SpecificationNode, List)
>>>
>>> 実際に、
>>> org.seasar.mayaa.provider.ServiceProvider
>>> を書き換えて
>>>
>>> をコメントアウトすると、ビルド時間が1/10に短縮されました。
>>>
>>> しかし実際にはmayaaファイルでm:xpathを使用してしまっておりますので、
>>> 今更XPathMatchesInjectionResolverをやめるという選択肢はなく、
>>> XPathMatchesInjectionResolverをある程度高速化出来ないかと検討しています。
>>> (その際、多少の機能制限があってもしかたがないと思っています)
>>>
>>> getXPathNodes()
>>> の実装を読ませていただきますと、
>>> mayaaファイル全体をなめて再帰的に
>>> getXPathNodes()
>>> を呼び出しています。
>>>
>>> この呼出が、getNode()から呼ばれていますので、
>>> テンプレートの全部の要素からgetXPathNodes()
>>> の再帰ループが呼ばれているように見受けられます。
>>>
>>> mayaaファイル全体をなめるのであれば、
>>> mayaaファイル毎に、結果のリストをキャッシュして、
>>> 2回目以降はキャッシュを利用するようにすれば高速化出来るのではないかと思われますが、
>>> そのようなアプローチは可能でしょうか?
>>> _______________________________________________
>>> mayaa-user mailing list
>>> mayaa-user @ ml.seasar.org
>>> https://ml.seasar.org/mailman/listinfo/mayaa-user
>> _______________________________________________
>> mayaa-user mailing list
>> mayaa-user @ ml.seasar.org
>> https://ml.seasar.org/mailman/listinfo/mayaa-user
>
>
>
> --
> Susumu ISHIGAMI
> susumu.ishigami @ gmail.com
> _______________________________________________
> mayaa-user mailing list
> mayaa-user @ ml.seasar.org
> https://ml.seasar.org/mailman/listinfo/mayaa-user