<div dir="ltr">水野さま<div><br></div><div><span style="color:rgb(33,33,33)">&gt; 2. これらのsynchronizedブロックについて、並列性を向</span><span style="color:rgb(33,33,33)">上させる方法はありますでしょうか?</span><br style="color:rgb(33,33,33)"></div><div><br></div><div>ひとまず、単純に synchronized を削ったものを作って、パフォーマンスにどの程度の差が出るかを計測してみてはいかがでしょうか。</div><div>その結果工数をかける効果があると判断したならちゃんとした実装を考えるということで良いと思います。</div><div><br></div><br><div class="gmail_quote"><div dir="ltr">2017年8月4日(金) 17:55 Mizuno Ken &lt;<a href="mailto:mizuno.ken@interfactory.co.jp">mizuno.ken@interfactory.co.jp</a>&gt;:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">お世話になっております。水野です。<br>
<br>
先日の質問では、suga様に丁寧な回答をいただきありがとうございました。おかげさまで目的通りの修正ができました。<br>
<br>
さて、今回は高負荷時のパフォーマンスに関するご相談です。<br>
現在、弊社サービスにおける高負荷時のパフォーマンスチューニングを行っております。<br>
その中でスレッドダンプを取得して調査していたところ、下記のようなダンプが多数記録されていました。<br>
<br>
===<br>
Thread 14609: (state = BLOCKED)<br>
 - org.seasar.mayaa.impl.engine.PageImpl.getTemplateFromFixedSuffix(java.lang.String,<br>
java.lang.String) @bci=24, line=139 (Compiled frame)<br>
 - org.seasar.mayaa.impl.engine.PageImpl.getTemplate(java.lang.String,<br>
java.lang.String) @bci=29, line=162 (Compiled frame)<br>
 - org.seasar.mayaa.impl.engine.RenderUtil.getTemplate(java.lang.String,<br>
org.seasar.mayaa.engine.Page, java.lang.String, java.lang.String)<br>
@bci=92, line=299 (Compiled frame)<br>
...<br>
<br>
Thread 13378: (state = BLOCKED)<br>
 - org.seasar.mayaa.impl.engine.processor.ComponentRenderer.findDoRender(org.seasar.mayaa.engine.Template[],<br>
java.lang.String) @bci=5, line=100 (Compiled frame)<br>
 - org.seasar.mayaa.impl.engine.processor.ComponentRenderer.renderTemplate(org.seasar.mayaa.engine.Page,<br>
org.seasar.mayaa.engine.Template[]) @bci=27, line=59 (Compiled frame)<br>
 - org.seasar.mayaa.impl.engine.RenderUtil.renderPage(boolean,<br>
org.seasar.mayaa.engine.TemplateRenderer, java.util.Map,<br>
org.seasar.mayaa.engine.Page, java.lang.String, java.lang.String)<br>
@bci=175, line=349 (Compiled frame)<br>
 - org.seasar.mayaa.impl.engine.processor.InsertProcessor.doStartProcess(org.seasar.mayaa.engine.Page)<br>
@bci=286, line=327 (Compiled frame)<br>
 - jp.co.interfactory.ebisu.common.mayaa.processor.EbisuInsertProcessor.doStartProcess(org.seasar.mayaa.engine.Page)<br>
@bci=2, line=16 (Compiled frame)<br>
 - org.seasar.mayaa.impl.engine.RenderUtil.renderTemplateProcessor(org.seasar.mayaa.engine.Page,<br>
org.seasar.mayaa.engine.processor.TemplateProcessor) @bci=60, line=134<br>
(Compiled frame)<br>
...<br>
<br>
Thread 13336: (state = BLOCKED)<br>
 - org.seasar.mayaa.impl.engine.EngineImpl.build(boolean) @bci=3,<br>
line=264 (Compiled frame)<br>
 - org.seasar.mayaa.impl.engine.EngineImpl.build() @bci=2, line=260<br>
(Compiled frame)<br>
 - org.seasar.mayaa.impl.engine.EngineImpl.doPageService(org.seasar.mayaa.cycle.ServiceCycle,<br>
java.util.Map, boolean) @bci=1, line=350 (Compiled frame)<br>
 - org.seasar.mayaa.impl.engine.EngineImpl.doService(java.util.Map,<br>
boolean) @bci=36, line=481 (Compiled frame)<br>
 - org.seasar.mayaa.impl.MayaaServlet.doService(javax.servlet.http.HttpServletRequest,<br>
javax.servlet.http.HttpServletResponse) @bci=25, line=107 (Compiled<br>
frame)<br>
 - org.seasar.mayaa.impl.MayaaServlet.doPost(javax.servlet.http.HttpServletRequest,<br>
javax.servlet.http.HttpServletResponse) @bci=3, line=95 (Compiled<br>
frame)<br>
 - javax.servlet.http.HttpServlet.service(javax.servlet.http.HttpServletRequest,<br>
javax.servlet.http.HttpServletResponse) @bci=149, line=643 (Compiled<br>
frame)<br>
...<br>
===<br>
<br>
これらはいずれもPageImplクラスのインスタンスに対するsynchronizedブロックとなっています。<br>
ここについて何かしらの性能チューニングの余地がないか調査したいのですが、すみませんがソースを読んだだけでは下記について十分理解できなかったため、教えていただけますでしょうか。<br>
<br>
1. これらのsynchronizedブロックは、どのリソースを保護するためのものでしょうか?<br>
候補として、<br>
- EngineImple#build() にて、_defaultSpecification フィールドへの読み書きが発生しているため、これの保護<br>
- PageImple#getTemplateFromFixedSuffix() からの呼び出し先にて_specCache を参照しているため、これの保護<br>
を行っているように見えますが、上記2つ以外にもありますでしょうか?あるいは、上記2つのうちこのsynchronizedブロックと無関係のものはありますでしょうか?<br>
<br>
2. これらのsynchronizedブロックについて、並列性を向上させる方法はありますでしょうか?<br>
read-writeロックを使う、concurrentHashMapを使う等の一般的な手法で改善できそうな箇所について、もし候補があればお知らせいただけますでしょうか。<br>
<br>
<br>
--<br>
株式会社インターファクトリー   水野 謙<br>
<a href="mailto:mizuno.ken@interfactory.co.jp" target="_blank">mizuno.ken@interfactory.co.jp</a><br>
<br>
〒102-0071<br>
東京都千代田区富士見2-10-2 飯田橋グラン・ブルーム4階<br>
TEL:03-5211-0056 / FAX:03-5211-0059<br>
<a href="http://www.interfactory.co.jp" rel="noreferrer" target="_blank">http://www.interfactory.co.jp</a><br>
_______________________________________________<br>
mayaa-user mailing list<br>
<a href="mailto:mayaa-user@ml.seasar.org" target="_blank">mayaa-user@ml.seasar.org</a><br>
<a href="https://ml.seasar.org/mailman/listinfo/mayaa-user" rel="noreferrer" target="_blank">https://ml.seasar.org/mailman/listinfo/mayaa-user</a><br>
</blockquote></div></div>