• ベストアンサー

Tomcat上Webアプリで徐々にレスポンス低下

現在、Tomcat上のWebアプリケーションの負荷試験を実施しておりますが、 レスポンスが徐々に遅くなる事象が発生しています。 遅くなる事象が発生すると単独のリクエストに対するレスポンスも遅くなりますが、 Tomcatの再起動およびJConsoleのGCにてフルGCを実施するとレスポンスは復活します。 (数時間の間隔をあけても、自動復活の確認はできていません。) JVMの基本的なメモリチューニングをいくつか試みましたが、徐々に遅くなる事象の解消には至ることができていません。 原因調査のポイントがありましたら、ご教授お願いいたします。

  • Java
  • 回答数3
  • ありがとう数4

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

フル GC を実行してレスポンスが回復するのであればマイナー GC が頻発しているのではないでしょうか。 Java 7 以降であれば G1GC を使うと改善するかもしれませんが、根本的に負荷に対して CPU コア数と処理速度、メモリ量が不足していると思います。

higashida1901
質問者

お礼

ご回答有難うございました。 Java7を利用していますので、G1GCの利用を検証していきたいと思います。 一時的な負荷増大に対するレスポンス悪化は許容範囲と認識しておりますが、その後の軽量アクセスに対してもレスポンス悪化が継続されてしまう点が課題となっております。 フルGC(Jconsoleから手動で実施)で解放されるメモリ(レスポンス悪化の要因)に対して、自動解放の方法が見いだせればと思っています。

higashida1901
質問者

補足

*解決いたしました。 Spring3.1.1からSpring3.2.11にバージョンUP(関連ライブラリ含め)したところ、レスポンス悪化を解消することができました。 対象のWebアプリケーションはDI/AOPを多用しており、aspectjweaverのバージョンUPによりパフォーマンス改善したと判断しています。

その他の回答 (2)

  • root139
  • ベストアンサー率60% (488/809)
回答No.3

フルGCで改善されるという事を考えると、メモリリークではなさそうですね・・・。 参照は外れてまだGCされていないオブジェクトが何か悪さをしているとは考えられないでしょうか? 例えば、メモリ以外の何らかのリソースを使用するオブジェクトが頻繁に作られているなど。 いずれにせよ、GCログなど、実行時の状況に関するデータを出来るだけ集めることが先決かと。 下記の記事なども参考になるかと思います。 http://www.atmarkit.co.jp/ait/articles/0703/22/news138.html http://itpro.nikkeibp.co.jp/article/COLUMN/20061102/252525/ 早急に対策が必要な場合は、応急措置として一定のリクエスト数毎に java.lang.System.gc を実行するようなServletフィルタ等を作成するのも手かも知れません。 かなり場当たり的ですが・・・。

higashida1901
質問者

お礼

ご回答ありがとうございました。 状況の情報収集で参考にさせて頂きます。

higashida1901
質問者

補足

Tomcat7のStuckThreadDetectionValveを仕掛けたところ、 レスポンスが遅くなるタイミングで下記のトレース情報を取得することができました。 DI/AOP回りの設定等の不備を想定して見直しを進めておりますが、 その他の情報がご教授頂ければと思い、発信させていただきました。 Webアプリの構成 ・Tomcat7.0.47 ・Struts2.3.16.2 ・Spring3.1.1 --- 2 13, 2015 1:01:19 午後 org.apache.catalina.valves.StuckThreadDetectionValve notifyStuckThreadDetected 警告: Thread "http-bio-8080-exec-13" (id=45) has been active for 17,359 milliseconds (since 15/02/13 13:01) to serve the same request for http://localhost:8080/SyanaiShinseiWorkflow/ql/qlo005 and may be stuck (configured threshold for this StuckThreadDetectionValve is 5 seconds). There is/are 14 thread(s) in total that are monitored by this Valve and may be stuck. java.lang.Throwable at org.aspectj.weaver.ReferenceType.addDependentType(ReferenceType.java:117) at org.aspectj.weaver.ReferenceType.<init>(ReferenceType.java:97) at org.aspectj.weaver.TypeFactory.createParameterizedType(TypeFactory.java:43) at org.aspectj.weaver.ResolvedType.parameterize(ResolvedType.java:2439) at org.aspectj.weaver.ReferenceType.getSuperclass(ReferenceType.java:925) at org.aspectj.weaver.ResolvedType.getDirectSupertypes(ResolvedType.java:83) at org.aspectj.weaver.patterns.TypePattern.matchesSubtypes(TypePattern.java:178) at org.aspectj.weaver.patterns.ExactTypePattern.matchesSubtypes(ExactTypePattern.java:74) at org.aspectj.weaver.patterns.TypePattern.matchesStatically(TypePattern.java:130) at org.aspectj.weaver.patterns.KindedPointcut.fastMatch(KindedPointcut.java:130) at org.aspectj.weaver.patterns.NotPointcut.fastMatch(NotPointcut.java:52) at org.aspectj.weaver.patterns.AndPointcut.fastMatch(AndPointcut.java:47) at org.aspectj.weaver.internal.tools.PointcutExpressionImpl.couldMatchJoinPointsInType(PointcutExpressionImpl.java:84) at org.springframework.aop.aspectj.AspectJExpressionPointcut.matches(AspectJExpressionPointcut.java:249) at org.springframework.aop.support.AopUtils.canApply(AopUtils.java:209) at org.springframework.aop.support.AopUtils.canApply(AopUtils.java:263) at org.springframework.aop.support.AopUtils.findAdvisorsThatCanApply(AopUtils.java:295) at org.springframework.aop.framework.autoproxy.AbstractAdvisorAutoProxyCreator.findAdvisorsThatCanApply(AbstractAdvisorAutoProxyCreator.java:117) at org.springframework.aop.framework.autoproxy.AbstractAdvisorAutoProxyCreator.findEligibleAdvisors(AbstractAdvisorAutoProxyCreator.java:87) at org.springframework.aop.framework.autoproxy.AbstractAdvisorAutoProxyCreator.getAdvicesAndAdvisorsForBean(AbstractAdvisorAutoProxyCreator.java:68) at org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.wrapIfNecessary(AbstractAutoProxyCreator.java:359) at org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.postProcessAfterInitialization(AbstractAutoProxyCreator.java:322) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsAfterInitialization(AbstractAutowireCapableBeanFactory.java:407) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1461) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:519) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:313) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193) at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.resolvedCachedArgument(AutowiredAnnotationBeanPostProcessor.java:442) at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.access$0(AutowiredAnnotationBeanPostProcessor.java:435) at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredField ---

回答No.1

何かメモリリーク起こしてるとか、 何らかのオブジェクトの解放漏れとか オープンしたけど閉じてないとかね

higashida1901
質問者

お礼

早速の回答をありがとうございました。 おっしゃる通り、アプリケーションのメモリリークを疑ってみてはみましたが、 待ち時間発生箇所がリクエスト送信からTomcatがアプリケーション(Struts2のAction)を呼び出すまでの間であることが判明しています。 アプリケーションのメモリリークやオブジェクト解放漏れの場合でも、このような事象が発生するのあれば、アプリケーションのメモリリークを疑って調査を進めたいと思います。

関連するQ&A

  • Tomcat高負荷時の設定について

    現在、JMeterを使用してTomcat上で動作するAPに負荷を掛けた際のパフォーマンスを測定しております。 負荷を掛けずにブラウザで処理を実行した際には1秒程度でレスポンスが返却されてくるのですが、 以下の条件で負荷を掛けるとレスポンス速度が段々と遅く(8秒~500秒程度)なって行ってしまいます。 また、かなりの頻度でConnectionタイムアウトが返却されてしまいます。 [負荷条件] スレッド数:1000 Ramp-Up期間:60秒 ループ回数 :無限ループ ※ スレッド数を500くらいにするとConnectionタイムアウトは発生しないのですが、 処理時間はやはりかなり遅くなってしまいます。 最初はJVMのFullGCの頻発が原因かと思い、GCの状況を確認しましたが、 パフォーマンスに影響を与えそうなFullGCは特に発生していませんでした。 [JVM オプション] "-server -Xmx1024m -Xms1024m -XX:MaxPermSize=128m -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+UseTLAB -XX:+CMSIncrementalMode -XX:+CMSIncrementalPacing -XX:CMSIncrementalDutyCycleMin=0 -XX:CMSIncrementalDutyCycle=10 -XX:MaxTenuringThreshold=0 -XX:SurvivorRatio=256 -XX:+PrintGCDetails -Xloggc:/usr/local/tomcat/logs/gc.txt" 次にTomcatのserver.xmlでの最大thread数がデフォルトの状態だったので、 maxthreadsの値をとりあえず「2000」まで増やしてみたのですが状況は変わらずでした。 [server.xml] <Connector className="org.apache.coyote.tomcat4.CoyoteConnector" port="8123" maxHttpHeaderSize="8192" minProcessors="5" maxProcessors="1000" maxThreads="2000" minSpareThreads="25" maxSpareThreads="1000" enableLookups="false" acceptCount="100" debug="0" connectionTimeout="60000" useURIValidationHack="false" disableUploadTimeout="false" /> また、topを確認してもロードアベレージが高くなっているのが少し気になりますが(5.0~7.0程度を推移)、 Swap領域等は使用されている訳でもありませんでした。 Tomcatの経験もほとんど無いため何がボトルネックとなっているのかが分からずに困っております。 皆さまの経験から、推奨される設定、どこを調査した方が良いか、または参考となるサイト等が御座いましたらご教授願えないでしょうか。 [環境] CentOS release 4.7  メモリ:4G  CPU  :Intel(R) Xeon(R) CPU 2.00GHz X 2 jdk1.5.0_14 Tomcat 5.5

  • Apache、Tomcat連携時のチューニングについて

    よろしくお願いします。 質問ですが、Apache、Tomcatを連携させてイントラのWebを構築したのですが、アクセス数が増えるにしたがって、レスポンスが遅くなり、アクセス数が100未満にもかかわらず、クライアントのWeb画面が固まってしまう現象が起きました。 私はApache、Tomcatのチューニング(主にJVMのメモリ増加設定)である程度は解決するのでは、と思っていますが、この他にチューニングの方法はあるのでしょうか? もし、他の方法がありましたら、詳しく教えて頂けたらと思います。 ちなみに、Javaで開発を行い、OSにはMIRACLE LINUX、DBはORACLEを用いていますが、ORACLEはステータス管理程度にしか使用していないので、今回の件に関しては、特に関係はないと思います。 どなたかご教授ください。よろしくお願いします。

    • ベストアンサー
    • Java
  • HTTPリクエスト

    ブラウザで画面操作を行うことによって、サーバへのREQUEST/RESPONSEが発生しますが、 その画面操作とは別に同じWindowで一定間隔かつ自動でサーバにREQUEST(※)を投げることは できますか? 上の※のRESPONSEのどこかの値を参照し、条件に一致した場合に別のREQUESTをサーバに 投げるようなことはできますか?JavaScriptを使えばできますでしょうか? よろしくお願いします。

  • Oracle11gのレスポンス障害について

    社内WEBアプリのレスポンス障害が発生しました。 現在障害は解消されてい(特に何もしていない)ます。 障害の経緯ですが 突然社内WEBアプリからのレスポンスが返って(非常に遅い)こなくなる。 タスクマネージャーでサーバーのcpu負荷とメモリ負荷を確認するが問題無し。 Apacheのレスポンスは問題無し。 サーバーからSQL/PLUSを使用しconnectする。connectに問題無し。 10カラム1レコードのデータをsqlplusから索引するも20秒程度かかる。 一旦サーバーを再起動するが10分程度使用した所で同様の現象が発生しoracleが遅くなる。 取りあえず業務を停止し2~3時間放置。 なぜか問題無く使用出来る様になり今にいたる。 結果、サーバーの再起動を一回行った程度で何も行っていないのですが現在レスポンスに問題は無く社内WEBアプリも快適に使用出来ています。 alert_rocl.logも見てみたのですが特に問題は無いような気がしますが 正直あまりよく解りません。 3年程このシステムは問題無く稼働していたのですが、この様な現象は初めてです。 原因不明となると問題なので何か手がかりの様なものは無いでしょうか? 以下環境となります。 Windows2008 Server R2 Enterprise Oracle Database 11g Release 11.2.0.1.0 - 64bit Production httpd 2.2.20 PHP 5.2.14 OracleにはOci8を使用して接続しています。 よろしくお願い致します。

  • 複数の処理でTomcatが停止する

    Javaのシステムを運用しています。 1台のサーバー(CentOS5.0)に、Apache-Tomcat5.0-PostgreSQL8.1-アプリケーション(顧客ごと(10社))がインストールされています。 アプリケーションの切り分けはTomcatのconf/catalina/localhost/コンテキスト.xml で定義しています。(コンテキスト1~10を作成) 昨年秋から以下の障害が発生していますが、未だに原因がわからない状況です。 Javaの知識、Tomcatの知識、PostgreSQLの知識など乏しく、ログも取れていない状況です。 どうか、疑わしい原因、調査方法など教えていただきたく存じます。 障害状況 日付  現象                         回復 11/6 A画面でB画面への遷移ボタンをした時に   Tomcat再起動し、再実行したところ      サーバーのB画面作成処理が中断       正常に処理できた。 11/16 TOPメニューからC画面を選択したが、     約10時間後、中断していたC画面処理      サーバーのC画面作成処理が中断       が再開された。その後正常に処理。 12/26  D画面でE画面への遷移ボタンをした時に   Tomcat再起動し、再実行したところ      サーバーのE画面作成処理が中断       正常に処理できた。 1/6   F画面でG画面への遷移ボタンをした時に   Tomcat再起動し、再実行したところ      サーバーのG画面作成処理が中断       正常に処理できた。 1/8   F画面でH画面への遷移ボタンをした時に    約45分後、中断していたH画面処理      サーバーのH画面作成処理が中断       が再開された。その後正常に処理。      ・他のユーザーがその顧客のシステムを      使うと、E画面処理、G画面処理、H画面      処理で中断する。      ・他の顧客のシステムは、同じ処理を行      っても正常に処理できる。(レスポンス      も正常) 中断した処理では、データベースのアクセスは読込み(SELECT文)のみです。 プログラムではThreadクラスは使っていません。 Tomcatの設定でセッションタイムアウト時間を無制限(-1)に設定していました。 Tomcatの設定でコネクションプールの最大値は100に設定しています。 障害発生時は、ログインユーザーは一人だけでした。 その後、GCログの出力、ヒープメモリ使用状況のログ出力、PostgreSqlのログ出力の設定を行いました。 また、セッションタイムアウト時間を30分に設定しました。 本日(1/29)まで障害は発生しておりません。 よろしくご教授ください。

  • こんにちは。

    こんにちは。 javaにて、webアプリを開発中です。 500エラーが発生して困っています。 <環境> OS:windows server 2003 R2 アプリケーションサーバ:tomcat webサーバ:IIS6 開発言語:java ブラウザ:IE8 <事象> webブラウザからの情報をServletにて受け取り、解析、DBアクセス等の処理をおこないjspを経由し、ブラウザへ表示しています。 servletでの処理時間が長くなった場合に、webブラウザに500エラーが飛んできます。 ブラウザでsubmitしてから、500エラーを受信するまでの時間は、常に15秒です。 リクエストのタイムアウト設定を疑い、tomcat、IIS、ブラウザ等の設定を調査しましたが、解決策が見い出せません。 また、問題の切り分けとして、ローカル環境にてtomcatへアクセスした場合は、同事象は再現しません。 firefox等、ブラウザを変更しても、同事象は再現します。 良い解決案がございましたら、ご教授をお願いいたします。

  • doGetの引数に「入るモノ」について

    サーブレットにおけるクラスのdoGetメソッドについて 質問です(Tomcat3.2.1 + JDK1.3)。 public void doGet(HttpServletRequest request, HttpServletResponse response) 理屈で考えると、このdoGetメソッドの2つの仮引数 (request, response)には、 「インターフェースHttpServletRequestをimplements したクラス」のインスタンス ‥‥と、 「インターフェースHttpServletRequestをimplements したクラス」のインスタンス の2つのインスタンスが入れられるハズですよね。 そこで疑問なのが、 1. それら2つのクラスの名前はなんというのでしょう? (というのはインターフェースHttpServletRequestや インターフェースHttpServletResponseを 実装したクラスのメソッドの処理内容の定義を 見たいのです‥) 2. 誰がそのクラスをインスタンス化しているのでしょう? (サーブレットコンテナのTomcat? JRE? JVM?‥ いったい誰が?‥‥用語の区別も曖昧なのですが) 補足すると、 Javaアプリケーションのmainメソッドでは、 public static void main(String[] args) として、コマンドラインの引数がそのまま仮引数argsに 入る。じゃあ、サーブレットの場合はどうなのか? といった感じです。 2.のほうはトンチンカンな質問かもしれませんが、 1.の質問は切実です。 ご存知の方、教えてください。

    • ベストアンサー
    • Java
  • 自宅で発生する不可解な事象について

    ちょうど3年前に現在の住居に引っ越しました。千葉市の大規模な戸建建売団地で、南方に深い森が広がる静かで環境の良い場所だと思います。 ところが、引っ越し後3週間ほど経過してから次のような不可解な事象が発生します。 1.両脚、腹、頭内部がじりじりと振動しているような感覚がする  ・就寝中以外にも横になったり、ソファで静かにしていると感じることもある  ・この感覚で目覚めた後、寝返りを打ったり、寝室を変更すると治まるが、数分程度で再現する  ・再現時は、徐々に振動が近づき最高点に達するとそれが保持されるような感覚である 2.「コツ、プチッ」と石ころが壁に当たったような軽い音から、「バン」と壁をたたくような音まで妙な音がする 3.「ウィーン」とモーターが回転しているような音や、「プチ、プチ」とクリック音がする  ・耳栓では防げず、直接頭の中で響いている  ・就寝中に1.の事象で目覚めた時に聞こえる 4.背がじりじりと太陽光を浴びたような熱感覚を受ける  ・西側に背を向けているとこの感覚がする 5.体が不意に収縮する  ・就寝中に一瞬の衝撃を覚え、しゃっくりのように腹筋が収縮する 発生時間帯および場所は、当初はすべて深夜~早朝の就寝中の寝室でしたが、1.および2.についてはここ1年くらいは不定期に、それも各居室で発生します。 また、自宅以外(職場、帰省先や旅行先など)では上記の事象は発生しません。 これまでに実施した調査と結果は次のとおりです。 a.ブレーカーを落とし、就寝する→事象は解消しない b.東電による柱上トランスからの電磁波測定→問題なしとのこと c.ハウスメーカーによる定期点検時に家屋調査を依頼→設備上の異常はなし d.振動計による振動自己測定→事象発生中も振動はなし e.業者による低周波音測定→事象発生中も低周波音の成分はなし f.トリフィールドメーター100XEによる電磁波(低周波)自己測定→事象発生中も針は振れず g.高周波3磁界軸電磁波測定器TM-196による電磁波(マイクロ波)自己測定  →通常20mV/m、事象発生時35mV/mを測定するも、有意な差とは考えにくい   (携帯電話、電子レンジの方がはるかに高位を示す) h.方位磁針による静磁場の乱れ→事象発生中も針は振れず i.近隣住民へのヒアリング→そのような事象はないとのこと まずは何が原因なのか客観的に把握したいのですが、他に調査すべき項目をアドバイスいただけるでしょうか?医学、工学に精通している方からのアドバイスを希望し ます。 よろしくお願いします。 私はほぼ間違いなく西側隣家に何らかの原因があると考えています。 以下は状況証拠と私の主観なので、参考程度にご覧ください。 あ)入居当時、その隣家しか住人がいなかった(他の区画は建設中、売り出し中だった) い)その隣家が泊まりがけで留守の場合は事象は発生しない う)その隣家に事象の原因に心当たりがないか問合せたところ激高し、その後事象がひどくなった え)e.の調査時、その隣家から何か物を移動する物音が聞こえ、その後一週間程度は事象が発生しなかった  ・何らかの機器を使用しており、調査を察知してその機器を移動し一時的に隠匿した可能性がある お)動く物体を検知する防犯グッズを用いて調査したところ、深夜早朝にその隣家でたびたび動きがある  ・事象を感じる時間帯とほぼ一致していることから、何らかの行為をもって事象を発生たらしめている可能性がある 上記をもって警察、弁護士に相談しましたが、客観的な証拠が必要だとのことでした。何を示せば客観的な証拠になるのか、皆様のアドバイスを頂けたらと思いますの でよろしくお願いします。

  • apacheの送信バイト数について

    お世話になります。 現在、GETリクエストに対してファイルの内容を返すサーブレットを作成しております。 対象ファイルの内容をレスポンスに設定しているのですが、apacheのログの送信バイト数 を見ると実ファイルのバイト数より減少している場合があり、調査しております。 tomcatのログでは、送信バイト数=実ファイルバイト数になるのですが、apacheのログでは 送信バイト数<実ファイルバイト数になっております。(以下のログの{}内がサイズです。) 【tomcat】 xxx.xxx.xxx.xxx - - [01/Oct/2012:08:58:22 +0900] 200 {123213} 【apache】 xxx.xxx.xxx.xxx - - [01/Oct/2012:08:58:23 +0900] 200 {40960} "-" "Test" どのような状態で上記の様な現象が発生するのかわからず原因/解決策をご存知の方がいましたらご教授をお願いできますでしょうか。 サーブレットを開発している環境は、以下となります。 OS:CentOS 5.5 x86_64 apache:httpd-2.2.3-63 tomcat:apache-tomcat-5.5.30 JRE:jre-1.6.0_21-fcs.x86_64 お手数お掛け致しますが、よろしくお願い致します。

  • 拠点からのHTTPリクエストのレスポンスなし

    IEでおきた現象です。 本社のイントラを見るうえで変な不具合が発生しました。 東京からはHPが閲覧できるのに、拠点からではことごとくできないのです。 urlをIPで指定してもだめです。 OS環境はまったく同じものを使ってもだめでした。 本社は海外にあり、拠点は一度専用線経由で東京にを通って本社へパケットを飛ばします。 OK)東京→海外本社 NG)大阪→東京→海外本社 ただし、ログを見る限り  大阪からのリクエストは正常  本社から大阪へのレスポンスが「timeout」になります。 東京から本社へのtracert  192.168.1.6    192.168.1.1  192.168.*.*   --firewall--  本社LAN 大阪から本社へのtracert  192.168.2.6  192.168.2.1  192.150.4.1 ※  192.168.*.*   --firewall--  本社LAN 大阪と東京の違いは、traceする時に、大阪は 一度B(二番目の3桁)がことなるセグメントを経由していることだけです。 ベンダーさんにいろいろ情報提供していますが、先方も調査中で回答が得られません。 この類の情報に詳しい方の推論や、また、追跡上のアドバイスなどありましたらご指摘下さい。