- - PR -
Tomcat の CPU 使用率が 99.9% になる
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2007-05-28 21:56
いつもお世話になっております。
Linux 上で Apache + Tomcat + PostgreSQL を使用した Web アプリケーションが動作しており、 一ヶ月くらい前より Tomcat の CPU 使用率が 99.9% になる現象が発生しております。 環境は以下の通りです。 OS : Redhat Linux 9 APPServer : Tomcat 5.0.28 HTTPServer : Apache 2.0.48 mod_jk2 2.0.2 DBServer : PostgreSQL8.4 JDK : JDK 1.4.2_13 FrameWork : Struts 1.1 (サーバ自体は日々再起動を実施しております) なお、これまでの経緯は以下のスレッドを参照ください。 http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?mode=viewtopic&topic=35295&forum=12&start=0 今回発生した現象は top コマンドで確認すると tomcat (java) プロセスが 99.9% になっており、 30分経っても正常値に戻らず、 Tomcat を再起動せざるを得ない状況になります。 (Tomcat の再起動で復旧) なお、前回のように FULL GC が頻発しているわけでもありません。 (OutOfMemory も発生していない) http://syo.cocolog-nifty.com/freely/2006/11/apache22tomcat5.html 上記サイトにて tomcat の server.xml の port=8080 部分と同じ記述を port=8009 部分に記述すると直るということが書いてありましたが 直りませんでした。 スレッドダンプ(x5)を取得しましたが dead lock も検出されません。 スレッドダンプで以下の3つの内容が若干多く出力されておりました。 関係ありますでしょうか。 "TP-Processor58" daemon prio=1 tid=0x084b4628 nid=0xf9d runnable [0x6f721000..0x6f721cd4] at java.net.SocketInputStream.socketRead0(Native Method) at java.net.SocketInputStream.read(SocketInputStream.java:129) at java.io.BufferedInputStream.fill(BufferedInputStream.java:183) at java.io.BufferedInputStream.read1(BufferedInputStream.java:222) at java.io.BufferedInputStream.read(BufferedInputStream.java:277) - locked <0x58fd6018> (a java.io.BufferedInputStream) at org.apache.jk.common.ChannelSocket.read(ChannelSocket.java:598) at org.apache.jk.common.ChannelSocket.receive(ChannelSocket.java:535) at org.apache.jk.common.ChannelSocket.processConnection(ChannelSocket.java:663) at org.apache.jk.common.SocketConnection.runIt(ChannelSocket.java:866) at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:683) at java.lang.Thread.run(Thread.java:534) "TP-Processor50" daemon prio=1 tid=0x08075018 nid=0xce5 in Object.wait() [0x6ef11000..0x6ef11cd4] at java.lang.Object.wait(Native Method) - waiting on <0x569de3b0> (a org.apache.tomcat.util.threads.ThreadPool$ControlRunnable) at java.lang.Object.wait(Object.java:429) at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:655) - locked <0x569de3b0> (a org.apache.tomcat.util.threads.ThreadPool$ControlRunnable) at java.lang.Thread.run(Thread.java:534) "TP-Processor49" daemon prio=1 tid=0x08073e98 nid=0xce4 runnable [0x6ee8f000..0x6ee90cd4] at java.util.HashMap.get(HashMap.java:325) at org.apache.catalina.session.StandardSession.getAttribute(StandardSession.java:978) at org.apache.catalina.session.StandardSessionFacade.getAttribute(StandardSessionFacade.java:113) at org.apache.jasper.runtime.PageContextImpl.doFindAttribute(PageContextImpl.java:469) at org.apache.jasper.runtime.PageContextImpl.findAttribute(PageContextImpl.java:454) at org.apache.struts.util.RequestUtils.lookup(RequestUtils.java:874) at org.apache.struts.taglib.logic.EmptyTag.condition(EmptyTag.java:121) at org.apache.struts.taglib.logic.NotEmptyTag.condition(NotEmptyTag.java:94) at org.apache.struts.taglib.logic.ConditionalTagBase.doStartTag(ConditionalTagBase.java:218) at org.apache.jsp.xxxxx.xxxxx.xxxxxxx.xxxxxxxxxx_jsp._jspService(xxxxxxxxxx_jsp.java:326) at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:94) at javax.servlet.http.HttpServlet.service(HttpServlet.java:802) at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:324) at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:292) at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:236) at javax.servlet.http.HttpServlet.service(HttpServlet.java:802) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:237) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157) at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:704) at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:474) at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:409) at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:312) at org.apache.struts.action.RequestProcessor.doForward(RequestProcessor.java:1069) at org.apache.struts.action.RequestProcessor.processForwardConfig(RequestProcessor.java:455) at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:279) at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1482) at org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:507) at javax.servlet.http.HttpServlet.service(HttpServlet.java:689) at javax.servlet.http.HttpServlet.service(HttpServlet.java:802) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:237) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157) at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:704) at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:474) at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:409) at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:312) at org.apache.struts.action.RequestProcessor.doForward(RequestProcessor.java:1069) at org.apache.struts.action.RequestProcessor.processForwardConfig(RequestProcessor.java:455) at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:279) at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1482) at org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:507) at javax.servlet.http.HttpServlet.service(HttpServlet.java:689) at javax.servlet.http.HttpServlet.service(HttpServlet.java:802) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:237) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157) at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:704) at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:474) at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:409) at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:312) at org.apache.struts.action.RequestProcessor.doForward(RequestProcessor.java:1069) at org.apache.struts.action.RequestProcessor.processForwardConfig(RequestProcessor.java:455) at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:279) at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1482) at org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:507) at javax.servlet.http.HttpServlet.service(HttpServlet.java:689) at javax.servlet.http.HttpServlet.service(HttpServlet.java:802) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:237) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157) at xxx.xxx.xxxxx.online.presentation.web.filter.MultipartFilter.doFilter(MultipartFilter.java:49) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:186) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157) at xxx.xxx.xxxxx.online.presentation.web.filter.AuthFilter.doFilter(AuthFilter.java:156) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:186) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157) at xxx.xxx.xxxxx.online.presentation.web.filter.ExceptionHandlingFilter.doFilter(ExceptionHandlingFilter.java:62) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:186) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157) at xxx.xxx.xxxxx.online.presentation.web.filter.CounterManagingFilter.doFilter(CounterManagingFilter.java:49) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:186) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157) at xxx.xxx.xxxxx.online.presentation.web.filter.CharactorEncodingFilter.doFilter(CharactorEncodingFilter.java:57) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:186) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:214) at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520) at org.apache.catalina.core.StandardContextValve.invokeInternal(StandardContextValve.java:198) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:152) at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:137) at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:118) at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:102) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520) at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:929) at org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:160) at org.apache.jk.server.JkCoyoteHandler.invoke(JkCoyoteHandler.java:300) at org.apache.jk.common.HandlerRequest.invoke(HandlerRequest.java:374) at org.apache.jk.common.ChannelSocket.invoke(ChannelSocket.java:743) at org.apache.jk.common.ChannelSocket.processConnection(ChannelSocket.java:675) at org.apache.jk.common.SocketConnection.runIt(ChannelSocket.java:866) at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:683) at java.lang.Thread.run(Thread.java:534) 不定期に発生するため、非常に困っております。 ご教授ください。 | ||||
|
投稿日時: 2007-05-28 22:11
>"TP-Processor58" daemon prio=1 tid=0x084b4628 nid=0xf9d runnable [0x6f721000..0x6f721cd4]
>at java.net.SocketInputStream.socketRead0(Native Method) クライアントからのリクエストを読み込んでいる状態です。 >"TP-Processor50" daemon prio=1 tid=0x08075018 nid=0xce5 in Object.wait() [0x6ef11000..0x6ef11cd4] > at java.lang.Object.wait(Native Method) >- waiting on <0x569de3b0> (a org.apache.tomcat.util.threads.ThreadPool$ControlRunnable) スレッドプール内でヒマをもてあましているスレッドです。 >"TP-Processor49" daemon prio=1 tid=0x08073e98 nid=0xce4 runnable [0x6ee8f000..0x6ee90cd4] >at java.util.HashMap.get(HashMap.java:325) >at org.apache.catalina.session.StandardSession.getAttribute(StandardSession.java:978) HttpSession から値を取得しているところです。 どのスレッドが特に CPU を消費しているのか確認しましょう。 以下のサポートパターンが参考になると思います。 ・BEA トラブルシューティング ガイド > サポート診断パターン > WLS での予期しない高い CPU 使用率 http://www.beasys.co.jp/cs/support_news/product_troubleshooting/High_CPU_Usage_Pattern.html#Linux RedHat9なら恐らくスレッド一つ一つに対応するプロセスがあるはずですのでどのスレッドが問題になっているのか top で確認できると思います。 | ||||
|
投稿日時: 2007-06-08 15:53
ご回答ありがとうございます。
以下、top、pstree の実行結果です。 [root@server root]# top PID USER PRI NI SIZE RSS SHARE STAT %CPU %MEM TIME CPU COMMAND 675 webadmin 25 0 469M 441M 2824 S 99.9 11.6 44:38 2 java 17535 postgres 15 0 84984 82M 83272 S 4.7 2.1 0:06 0 postmaster 17515 postgres 15 0 84752 82M 83276 S 4.3 2.1 0:06 3 postmaster 17534 postgres 15 0 84960 82M 83368 S 3.9 2.1 0:09 3 postmaster 17691 postgres 19 0 10104 9.8M 8792 S 2.5 0.2 0:00 2 postmaster 17687 webadmin 15 0 1384 1384 900 R 0.3 0.0 0:00 0 top [root@server root]# pstree -p init(1)-+-aacraid(23) |-atd(946) |-bdflush(15) |-cannaserver(825) |-crond(836) |-cupsd(847) |-gpm(783) |-java(675)---java(716)-+-java(717) | |-java(718) | |-java(719) | |-java(720) | |-java(721) | |-java(722) | |-java(723) | |-java(724) | |-java(725) 本現象発生時は java プロセス(上記で言うと pid=675)の CPU 使用率が 99.9% になっておりました。 pid=675 は java の親プロセスのような気がします。(pstree 実行結果参照) こういった場合、top で java プロセスのどのスレッドが特にCPUを消費しているかを 確認する方法はございますでしょうか。 ご教授ください。 ちなみに pid=675 を原因のスレッドだと仮定した場合、 教えていただきました URL を参考にスレッドダンプを確認しましたところ、 次のように出力されておりました。 "main" prio=1 tid=0x08058578 nid=0x29f runnable [0xbfffb000..0xbfffc0c8] at java.net.PlainSocketImpl.socketAccept(Native Method) at java.net.PlainSocketImpl.accept(PlainSocketImpl.java:353) - locked <0x561a0d38> (a java.net.PlainSocketImpl) at java.net.ServerSocket.implAccept(ServerSocket.java:448) at java.net.ServerSocket.accept(ServerSocket.java:419) at org.apache.catalina.core.StandardServer.await(StandardServer.java:513) at org.apache.catalina.startup.Catalina.await(Catalina.java:619) at org.apache.catalina.startup.Catalina.start(Catalina.java:579) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:324) at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:287) at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:425) [ メッセージ編集済み 編集者: ひじき 編集日時 2007-06-08 16:49 ] |
1