[mayaa-user:1084] PageImplのsynchronizedブロックに関する質問

Mizuno Ken mizuno.ken @ interfactory.co.jp
2017年 8月 4日 (金) 17:54:50 JST


お世話になっております。水野です。

先日の質問では、suga様に丁寧な回答をいただきありがとうございました。おかげさまで目的通りの修正ができました。

さて、今回は高負荷時のパフォーマンスに関するご相談です。
現在、弊社サービスにおける高負荷時のパフォーマンスチューニングを行っております。
その中でスレッドダンプを取得して調査していたところ、下記のようなダンプが多数記録されていました。

===
Thread 14609: (state = BLOCKED)
 - org.seasar.mayaa.impl.engine.PageImpl.getTemplateFromFixedSuffix(java.lang.String,
java.lang.String) @bci=24, line=139 (Compiled frame)
 - org.seasar.mayaa.impl.engine.PageImpl.getTemplate(java.lang.String,
java.lang.String) @bci=29, line=162 (Compiled frame)
 - org.seasar.mayaa.impl.engine.RenderUtil.getTemplate(java.lang.String,
org.seasar.mayaa.engine.Page, java.lang.String, java.lang.String)
@bci=92, line=299 (Compiled frame)
...

Thread 13378: (state = BLOCKED)
 - org.seasar.mayaa.impl.engine.processor.ComponentRenderer.findDoRender(org.seasar.mayaa.engine.Template[],
java.lang.String) @bci=5, line=100 (Compiled frame)
 - org.seasar.mayaa.impl.engine.processor.ComponentRenderer.renderTemplate(org.seasar.mayaa.engine.Page,
org.seasar.mayaa.engine.Template[]) @bci=27, line=59 (Compiled frame)
 - org.seasar.mayaa.impl.engine.RenderUtil.renderPage(boolean,
org.seasar.mayaa.engine.TemplateRenderer, java.util.Map,
org.seasar.mayaa.engine.Page, java.lang.String, java.lang.String)
@bci=175, line=349 (Compiled frame)
 - org.seasar.mayaa.impl.engine.processor.InsertProcessor.doStartProcess(org.seasar.mayaa.engine.Page)
@bci=286, line=327 (Compiled frame)
 - jp.co.interfactory.ebisu.common.mayaa.processor.EbisuInsertProcessor.doStartProcess(org.seasar.mayaa.engine.Page)
@bci=2, line=16 (Compiled frame)
 - org.seasar.mayaa.impl.engine.RenderUtil.renderTemplateProcessor(org.seasar.mayaa.engine.Page,
org.seasar.mayaa.engine.processor.TemplateProcessor) @bci=60, line=134
(Compiled frame)
...

Thread 13336: (state = BLOCKED)
 - org.seasar.mayaa.impl.engine.EngineImpl.build(boolean) @bci=3,
line=264 (Compiled frame)
 - org.seasar.mayaa.impl.engine.EngineImpl.build() @bci=2, line=260
(Compiled frame)
 - org.seasar.mayaa.impl.engine.EngineImpl.doPageService(org.seasar.mayaa.cycle.ServiceCycle,
java.util.Map, boolean) @bci=1, line=350 (Compiled frame)
 - org.seasar.mayaa.impl.engine.EngineImpl.doService(java.util.Map,
boolean) @bci=36, line=481 (Compiled frame)
 - org.seasar.mayaa.impl.MayaaServlet.doService(javax.servlet.http.HttpServletRequest,
javax.servlet.http.HttpServletResponse) @bci=25, line=107 (Compiled
frame)
 - org.seasar.mayaa.impl.MayaaServlet.doPost(javax.servlet.http.HttpServletRequest,
javax.servlet.http.HttpServletResponse) @bci=3, line=95 (Compiled
frame)
 - javax.servlet.http.HttpServlet.service(javax.servlet.http.HttpServletRequest,
javax.servlet.http.HttpServletResponse) @bci=149, line=643 (Compiled
frame)
...
===

これらはいずれもPageImplクラスのインスタンスに対するsynchronizedブロックとなっています。
ここについて何かしらの性能チューニングの余地がないか調査したいのですが、すみませんがソースを読んだだけでは下記について十分理解できなかったため、教えていただけますでしょうか。

1. これらのsynchronizedブロックは、どのリソースを保護するためのものでしょうか?
候補として、
- EngineImple#build() にて、_defaultSpecification フィールドへの読み書きが発生しているため、これの保護
- PageImple#getTemplateFromFixedSuffix() からの呼び出し先にて_specCache を参照しているため、これの保護
を行っているように見えますが、上記2つ以外にもありますでしょうか?あるいは、上記2つのうちこのsynchronizedブロックと無関係のものはありますでしょうか?

2. これらのsynchronizedブロックについて、並列性を向上させる方法はありますでしょうか?
read-writeロックを使う、concurrentHashMapを使う等の一般的な手法で改善できそうな箇所について、もし候補があればお知らせいただけますでしょうか。


-- 
株式会社インターファクトリー   水野 謙
mizuno.ken @ interfactory.co.jp

〒102-0071
東京都千代田区富士見2-10-2 飯田橋グラン・ブルーム4階
TEL:03-5211-0056 / FAX:03-5211-0059
http://www.interfactory.co.jp


mayaa-user メーリングリストの案内