[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 メーリングリストの案内