[Seasar-user:21228] Re: アプリケーションサーバのCPU高騰
Koichi Kobayashi
[E-MAIL ADDRESS DELETED]
2011年 12月 22日 (木) 18:00:21 JST
小林 (koichik) です.
> SubApplicationScopeHandlerImplのsaveValueToScopeは複数のスレッドから利用され
> てしまうことは有り得るのでしょうか。
SubApplicationScope は基本的にセッション情報なのであり得ます。
が、Teeda では同じスコープに属するリクエストが並行に
動作することには対応していません。
Teeda 自身で排他制御を行ってはいるのですが、十分に防ぐことは
できていないので、アプリ側で回避して頂く必要があります。
まずは HTTP のアクセスログや requestDumpFilter 等で並行している
リクエストを特定してください。
おそらく <iframe> や Ajax 等によってリクエストが重なっている
可能性が高いと思います。
それらについては URL のリクエストパラメータに newwindow=true を
加えてください。
http://teeda.seasar.org/ja/extension/reverse/link.html#新しいウィンドウを開くには
> また基本的なことかもしれませんが、「自分でスレッド起動して確認する」とは、
「自分でスレッド起動して HttpServletRequest を渡したりしていないか」
を確認してみてください、という意味でした。
# 「自分で起動したスレッドに HttpServletRequest を渡したりしていないか」
# の方が明確だったかも?
しかし、HttpRequest で問題が発生していないのならその必要は
ありません。
Date: Thu, 22 Dec 2011 17:17:01 +0900
From: 市川 尚也 <[E-MAIL ADDRESS DELETED]>
Subject: [Seasar-user:21226] Re: アプリケーションサーバのCPU高騰
> お世話になっております。
> n_ichikawa2000です。
> 前回のご回答から期間があいてしまい申し訳ありません。
> 先日、当該事象が再度発生し、スレッドダンプの再取得を行いました。
>
> 前回のHttpServletRequestとは別のクラスで、CPU使用率が高いことがスレッドダン
> プ上、確認できました。
> SubApplicationScopeHandlerImplのsaveValueToScopeは複数のスレッドから利用され
> てしまうことは有り得るのでしょうか。
>
> また基本的なことかもしれませんが、「自分でスレッド起動して確認する」とは、
> 具体的にどのようなやり方で確認を行えばいいのでしょうか。
>
> 以下、CPU使用率が高いスレッドのスレッドダンプです。
>
> "AJPRequestHandler-RMICallHandler-180" prio=10 tid=0x82e8d800 nid=0xfe0
> runnable [0x828fe000]
> java.lang.Thread.State: RUNNABLE
> at java.util.HashMap.put(HashMap.java:374)
> at
> org.seasar.teeda.extension.html.impl.SubApplicationScopeHandlerImpl.saveValu
> eToScope(SubApplicationScopeHandlerImpl.java:63)
> at
> org.seasar.teeda.extension.html.impl.SubApplicationScopeHandlerImpl.toScope(
> SubApplicationScopeHandlerImpl.java:45)
> at
> org.seasar.teeda.extension.html.impl.HtmlViewHandler.renderView(HtmlViewHand
> ler.java:165)
> at
> org.seasar.teeda.extension.html.impl.HtmlViewHandler.renderView(HtmlViewHand
> ler.java:141)
> at
> org.seasar.teeda.core.lifecycle.impl.RenderResponsePhase.executePhase(Render
> ResponsePhase.java:38)
> at
> org.seasar.teeda.core.lifecycle.AbstractPhase.execute(AbstractPhase.java:57)
> at
> org.seasar.teeda.core.lifecycle.LifecycleImpl.render(LifecycleImpl.java:131)
> at javax.faces.webapp.FacesServlet.service(FacesServlet.java:95)
> at
> com.evermind.server.http.ResourceFilterChain.doFilter(ResourceFilterChain.ja
> va:64)
> at
> jp.co.lifecard.webdesk.framework.filter.WebDeskTrimFilter.doFilter(WebDeskTr
> imFilter.java:27)
> at
> com.evermind.server.http.EvermindFilterChain.doFilter(EvermindFilterChain.ja
> va:15)
> at
> jp.co.lifecard.webdesk.framework.filter.WebDeskSessionFilter.doFilter(WebDes
> kSessionFilter.java:32)
> at
> com.evermind.server.http.EvermindFilterChain.doFilter(EvermindFilterChain.ja
> va:17)
> at
> org.seasar.framework.container.hotdeploy.HotdeployFilter.doFilter(HotdeployF
> ilter.java:69)
> at
> com.evermind.server.http.EvermindFilterChain.doFilter(EvermindFilterChain.ja
> va:17)
> at
> org.seasar.framework.container.filter.S2ContainerFilter.doFilter(S2Container
> Filter.java:64)
> at
> com.evermind.server.http.EvermindFilterChain.doFilter(EvermindFilterChain.ja
> va:17)
> at
> org.apache.myfaces.component.html.util.ExtensionsFilter.doFilter(ExtensionsF
> ilter.java:122)
> at
> com.evermind.server.http.EvermindFilterChain.doFilter(EvermindFilterChain.ja
> va:17)
> at
> org.seasar.extension.filter.EncodingFilter.doFilter(EncodingFilter.java:69)
> at
> com.evermind.server.http.ServletRequestDispatcher.invoke(ServletRequestDispa
> tcher.java:642)
> at
> com.evermind.server.http.ServletRequestDispatcher.forwardInternal(ServletReq
> uestDispatcher.java:391)
> at
> com.evermind.server.http.HttpRequestHandler.doProcessRequest(HttpRequestHand
> ler.java:908)
> at
> com.evermind.server.http.HttpRequestHandler.processRequest(HttpRequestHandle
> r.java:458)
> at
> com.evermind.server.http.AJPRequestHandler.run(AJPRequestHandler.java:313)
> at
> com.evermind.server.http.AJPRequestHandler.run(AJPRequestHandler.java:199)
> at
> oracle.oc4j.network.ServerSocketReadHandler$SafeRunnable.run(ServerSocketRea
> dHandler.java:260)
> at
> com.evermind.util.ReleasableResourcePooledExecutor$MyWorker.run(ReleasableRe
> sourcePooledExecutor.java:303)
> at java.lang.Thread.run(Thread.java:662)
>
>
> -----Original Message-----
> From: [E-MAIL ADDRESS DELETED]
> [mailto:[E-MAIL ADDRESS DELETED]]On Behalf Of Koichi Kobayashi
> Sent: Thursday, December 15, 2011 3:25 AM
> To: [E-MAIL ADDRESS DELETED]
> Subject: [Seasar-user:21210] Re: アプリケーションサーバのCPU高騰
>
>
> 小林 (koichik) です.
>
> > スレッドダンプを確認したところ、
> > EvermindHttpServletRequest.setAttribute、
> > EvermindHttpServletRequest.getAttribute
> > が繰り返しコールされているスレッドが多数ありました。
>
> HttpServletRequest は通常スレッド固有のものなので
> 同期化されませんが,複数のスレッドから利用することも
> ないはずです.
>
> 本当に HttpServletRequest の get/setAttribute() で
> CPU 高騰が発生しているなら,HttpServletRequest 自体の
> 使い方に問題があることになりますね.
> 自分でスレッド起動して HttpServletRequest を渡したり
> していないか確認してみては?
>
>
> On Wed, 14 Dec 2011 18:38:45 +0900, 市川 尚也 <[E-MAIL ADDRESS DELETED]>
> wrote:
>
> > お世話になっております。
> > n_ichikawa2000と申します。
> >
> > タイトルの件の問題が発生しており、
> > 何かしら情報が得られればと思い投稿致します。
> > こちらで質問するのは的外れかもしれませんが、宜しくお願いします。
> >
> > 【使用バージョン】
> > s2-framework-2.4.17.jar
> > s2-extension-2.4.17.jar
> > s2-dao-1.0.46.jar
> > teeda-core-1.0.11-SP1.jar
> > teeda-extention-1.0.11-SP1.jar
> >
> > 【問題】
> > 本番運用中に、OracleApplicationServerにて、CPU100%となりサーバがダウン
> してしまう問題が発生。
> > スレッドダンプを確認したところ、
> > EvermindHttpServletRequest.setAttribute、
> > EvermindHttpServletRequest.getAttribute
> > が繰り返しコールされているスレッドが多数ありました。
> >
> > ※スレッドダンプ自体はネットワークを繋げられる環境ではない為、一文のみ記載
> しておきます。
> >
> > "AJPRequestHandler-RMICallHandler-620" prio=10 tid=0x5552
> runnable[0x80c95000]
> > java.lang.Thread.State:RUNNABLE
> > at java.util.HashMap.get(HashMap.java:303)
> > at
> com.evermind.server.http.EvermindHttpServletRequest.getAttribute(EvermindHtt
> pServletRequst.java:3226)
> > at
> javax.servlet.ServletRequestWrapper.getAttribute(ServletRequestWrapper.java:
> 127)
> > at
> org.seaser.framework.container.external.servlet.ServletRequestMap.getAttribu
> te(ServletRequestMap.java:46)
> > at
> org.seaser.framework.container.external.AbstractExternalContextMap.put(Abstr
> actExternalContextMap.java:97)
> >
> > 【検証状況】
> > サポートからは、HashMapの使い方がスレッドセーフであるか確認して欲しいとの
> 回答がありました。
> > 当方で使用しているHashMapを洗い出しましたが、Collections.synchronizedMapで
> 宣言しており、
> > スレッドセーフであると言えると思われます。
> > そのほかの発生原因には何が考えられますでしょうか。
> > またそのほか、足りない情報があれば指摘して頂きたいです。
> >
> > 宜しくお願いします。
> >
> > _______________________________________________
> > Seasar-user mailing list
> > [E-MAIL ADDRESS DELETED]
> > https://ml.seasar.org/mailman/listinfo/seasar-user
>
>
> --
> {
> name: "Koichi Kobayashi",
> mail: "[E-MAIL ADDRESS DELETED]",
> blog: "http://d.hatena.ne.jp/koichik/",
> twitter: "@koichik"
> }
>
> _______________________________________________
> Seasar-user mailing list
> [E-MAIL ADDRESS DELETED]
> https://ml.seasar.org/mailman/listinfo/seasar-user
>
> _______________________________________________
> Seasar-user mailing list
> [E-MAIL ADDRESS DELETED]
> https://ml.seasar.org/mailman/listinfo/seasar-user
--
{
name: "Koichi Kobayashi",
mail: "[E-MAIL ADDRESS DELETED]",
blog: "http://d.hatena.ne.jp/koichik/",
twitter: "@koichik"
}
Seasar-user メーリングリストの案内