10

「中」の Amazon EC2 インスタンスの Ubuntu で CF 9.0.1 を実行しています。CF は断続的に上昇しています (1 日に数回...ただし、特にピーク時の使用時間には分離されていません)。そのようなときにtopを実行すると、これ (または同様のもの) が得られます。

PID     USER    PR  NI  VIRT    RES     SHR S   %CPU    %MEM    TIME+COMMAND
15855   wwwrun  20  0   1762m   730m    20m S   99.3    19.4    13:22.96 coldfusion9

したがって、明らかにサーバー リソースのほとんどを消費しています。次のエラーは、各発作の前に私の cfserver.log に表示されています。

java.lang.RuntimeException: Request timed out waiting for an available thread to run. You may want to consider increasing the number of active threads in the thread pool.

/opt/coldfusion9/bin/coldfusion statusを実行すると、次のようになります。

Pg/Sec  DB/Sec  CP/Sec  Reqs  Reqs  Reqs  AvgQ   AvgReq AvgDB  Bytes  Bytes 
Now Hi  Now Hi  Now Hi  Q'ed  Run'g TO'ed Time   Time   Time   In/Sec Out/Sec
0   0   0   0   -1  -1  150   25    0     0      -1352560      0      0

管理者の[サーバー設定] > [リクエストの調整]で、同時テンプレート リクエストの最大数の設定は 25 です。この種の負荷スパイクをカバーするために、スレッド プールを増やすだけで済みます。200 にすることができました (これはテストとして行ったところです)。

ただし、このファイル/opt/coldfusion9/runtime/servers/coldfusion/SERVER-INF/jrun.xmlもあります。そして、そこにある設定のいくつかは競合しているようです。たとえば、次のように書かれています。

<service class="jrunx.scheduler.SchedulerService" name="SchedulerService">
  <attribute name="bindToJNDI">true</attribute>
  <attribute name="activeHandlerThreads">25</attribute>
  <attribute name="maxHandlerThreads">1000</attribute>
  <attribute name="minHandlerThreads">20</attribute>
  <attribute name="threadWaitTimeout">180</attribute>
  <attribute name="timeout">600</attribute>
</service>

a) アクティブなスレッドが少ない (これはどういう意味ですか?)、および b) 管理者で設定された同時リクエスト制限を超える最大スレッドがあるのはどれですか。よくわかりません。手動で一致させる必要があるこれらの独立した構成はありますか? それとも、jrun.xmlファイルは、変更が行われたときに CF 管理者によって書き込まれることになっていますか? うーん。しかし、おそらく CF スケジューラは利用可能なすべてのスレッドのサブセットのみを使用する必要があるため、これは異なるのではないでしょうか? これもそこにあります:

<service class="jrun.servlet.http.WebService" name="WebService">
  <attribute name="port">8500</attribute>
  <attribute name="interface">*</attribute>
  <attribute name="deactivated">true</attribute>
  <attribute name="activeHandlerThreads">200</attribute>
  <attribute name="minHandlerThreads">1</attribute>
  <attribute name="maxHandlerThreads">1000</attribute>
  <attribute name="mapCheck">0</attribute>
  <attribute name="threadWaitTimeout">300</attribute>
  <attribute name="backlog">500</attribute>
  <attribute name="timeout">300</attribute>
</service>

これは、CF 管理者の設定を変更したときに変更されたように見えます...多分...しかし、新しい最大同時要求設定に一致するのはactiveHandlerThreadsです... maxHandlerThreadsではなく、再びそれを超えています。最後に、これがあります:

<service class="jrun.servlet.jrpp.JRunProxyService" name="ProxyService">
  <attribute name="activeHandlerThreads">200</attribute>
  <attribute name="minHandlerThreads">1</attribute>
  <attribute name="maxHandlerThreads">1000</attribute>
  <attribute name="mapCheck">0</attribute>
  <attribute name="threadWaitTimeout">300</attribute>
  <attribute name="backlog">500</attribute>
  <attribute name="deactivated">false</attribute>
  <attribute name="interface">*</attribute>
  <attribute name="port">51800</attribute>
  <attribute name="timeout">300</attribute>
  <attribute name="cacheRealPath">true</attribute>
</service>

そのため、これらのどれを (もしあれば) 変更する必要があり、最大リクエスト数と最大スレッド数の正確な関係はわかりません。また、これらのいくつかはmaxHandlerThreadsを 1000 とリストしているので、最大同時リクエストを 1000 に設定するべきかどうか疑問に思っています。使用可能なサーバー リソースに依存する上限があるはずです...それは実稼働環境であるため、実際にいじりたくありません。

この問題に関係があるかどうかはわかりませんが、ps aux |を実行すると grep coldfusion次の結果が得られます。

wwwrun   15853  0.0  0.0   8704    760    pts/1     S   20:22   0:00 /opt/coldfusion9/runtime/bin/coldfusion9 -jar jrun.jar -autorestart -start coldfusion
wwwrun   15855  5.4 18.2   1678552 701932 pts/1     Sl  20:22   1:38 /opt/coldfusion9/runtime/bin/coldfusion9 -jar jrun.jar -start coldfusion

常にこれら 2 つのプロセスがあり、これら 2 つ以上のプロセスはありません。したがって、プロセスとスレッドの間に 1 対 1 の関係があるようには見えません。長年維持してきた MX 6.1 のインストールから、追加の CF プロセスがプロセス リストに表示されていたことを思い出します。当時、各スレッドにプロセスがあるように見えました...バージョン 9 では、25 の実行中のリクエストが報告され、これら 2 つのプロセスしか表示されないため、間違っているか、何かがまったく異なります。1 つのプロセスがバックグラウンドで複数のスレッドを持つことができる場合、なぜ 1 つではなく 2 つのプロセスがあるのか​​疑問に思うことはありますか? ...ちょっと興味があります。

とにかく、私はこの投稿を作成しながら実験を続けてきました。上記のように、最大​​同時リクエスト数を 200 に調整しました。これで問題が解決することを期待していましたが、CF が再びクラッシュしました (むしろ、遅くなり、リクエストがタイムアウトし始めたので、効果的に「クラッシュ」しました)。今回は、top は同じように見えましたが (まだ CPU の 99% 以上を消費しています)、CF ステータスは異なっていました。

Pg/Sec  DB/Sec  CP/Sec  Reqs  Reqs  Reqs  AvgQ   AvgReq AvgDB  Bytes  Bytes
Now Hi  Now Hi  Now Hi  Q'ed  Run'g TO'ed Time   Time   Time   In/Sec Out/Sec
0   0   0   0   -1  -1  0     150   0     0      0      0      0      0

明らかに、同時リクエストの最大数を増やしたので、より多くのリクエストを同時に実行できるようになりましたが、それでもサーバー リソースを使い果たしていました。

さらに実験を行ったところ (CF を再起動した後)、約 30 ~ 35 回の "Reqs Run'g" の後、サーバーが使用不能なほど遅くなり、追加のすべての要求が必然的なタイムアウトに向かうことがわかりました。

Pg/Sec  DB/Sec  CP/Sec  Reqs  Reqs  Reqs  AvgQ   AvgReq AvgDB  Bytes  Bytes
Now Hi  Now Hi  Now Hi  Q'ed  Run'g TO'ed Time   Time   Time   In/Sec Out/Sec
0   0   0   0   -1  -1  0     33    0     0      -492   0      0      0

したがって、同時リクエストの最大数を増やしても効果がないことは明らかです。結局のところ、これは次のことだと思います:何がそんなに苦労しているのか?これらのスパイクはどこから来ていますか? トラフィックのバースト?どのページで?常にどのようなリクエストが実行されていますか? トラブルシューティングを続けるには、もっと情報が必要だと思います。実行時間の長いリクエストやその他の問題がある場合、ログには表示されません (ただし、管理者でそのオプションをチェックしています)。どのリクエストがこれらのスパイクの原因であるかを正確に知る必要があります。どんな助けでも大歓迎です。ありがとう。

〜日

4

5 に答える 5

5

私は多くの「本番環境での高CPU」タイプのバグを抱えており、私が常にそれらに対処してきた方法は次のとおりです。

  1. jstack PID >> stack.logを使用して、5秒間隔で5つのスタックトレースをダンプします。トレースの数とタイミングは重要ではありません。

  2. サムライでログを開きます。ダンプを実行するたびに、スレッドのビューが表示されます。コードを処理するスレッドは、Apache / IISを介して着信するリクエストの場合はweb-(組み込みサーバーを使用するリクエストの場合)およびjrpp-を開始します。

  3. 各スレッドの履歴を読みます。各ダンプで非常に類似しているスタックを探しています。スレッドが常に同じリクエストを処理しているように見える場合、上部付近で変化するビットは、無限ループが発生している場所を示します。

オンラインのどこかにスタックトレースをダンプして、それを指定してください。

何が起こっているのかを理解するために私が使用した他の手法は、apacheのhttpd.confを変更して、かかった時間をログに記録することです。データを使用していくつかの優れた統計/グラフを作成するには(LogParserを使用して数値をクランチしてCSVに出力し、次にExcelを使用してデータをグラフ化します):

LogFormat "%h %l %u %t "%r" %>s %b %D %{jsessionid}" customAnalysis
CustomLog logs/analysis_log customAnalysis

私が今覚えているもう1つの手法は、CFメトリックを有効にすることです。これにより、ハングアップの準備段階でサーバーが何をしていたかをある程度測定できます。これを10秒ごとにログに記録し、形式をCSVに変更するように設定しました。これにより、イベントログからメトリックをgrepし、Excelで実行して、クラッシュするまでのサーバーの負荷をグラフ化できます。

バーニー

于 2012-06-06T07:30:14.587 に答える
2

procs を最大限に活用しているものを見つけるには、システムの「内部」にある多くの情報が必要です。キューに入れられたリクエストなどを外部から見るのは難しいです。1 つ確かなことは、同時リクエストの設定を非常に高い数に変更してもうまくいかないということです :) 保持するように設計されたものを削除するだけです。 CF が過大なプロセッサ上でグローミングするのを防ぎます。

CPU使用率を最大化するもののリストを次に示します。

  • レジストリ内のクライアント変数。この問題がどこからともなく発生する理由について、いくつかの優れた記事があります。私のブログ (coldfusion muse) をチェックしてください。
  • データベースへの接続で断続的な問題が発生します。これは実際には、ネットワークと帯域幅使用の制限が DB への接続を「スロットル」する可能性があるクラウドでは少し悪化します。ほとんどの CF アプリは DB を多用します。何かが接続を妨害したり遅くしたりすると、その同時接続数に達するまで接続数が増加し、要求がキューに入れられますが、この問題は必ずしも CF 自体に関連しているわけではありません。これは症状です。
  • JVM の問題 - JVM をチューニングしてガベージ コレクションを処理したり、十分な New および Perm gen スペースを確保したりすることは非常に重要です。

これが発生する理由は他にもたくさんあります。その中には (ご想像のとおり)、特定のスクリプトが実行されたときに発生するコードの問題があります。長時間実行されるリクエスト、ファイルのアップロード、重労働のスケジュールされたタスク、トラフィックを生成するインデックス ボット トラフィック、またはあまりにも多くのセッションの生成....リストは続きます。

うまくいけば、私が提供したこのリストの何かがあなたを可能な限り襲うでしょう. 幸運を。

(もちろん、FR モニターや CF モニターでさえ、これらすべてを理解するのに役立つ優れたツールです :)。

于 2012-06-06T03:15:21.120 に答える
0

数週間前、私はJRunプロセスのCPU使用率を最大化し続け、定期的に再起動するサーバーを持っていましたが、24時間以内に100%に戻っただけでした。私もJVM設定などに夢中になり、ついにコードの無限ループを発見するまで、恥ずかしい驚きを覚えました。必ず満たされることのない条件を持つWHILEループがありました。おっと。

したがって、コードに単純な間違いを犯した可能性がありますが、それはサーバー構成fwiwとは何の関係もありません。

FusionReactorデモの場合は+1。それは少なくともあなたにいくつかの手がかりを与えるでしょう。

于 2012-06-05T21:38:15.750 に答える
0

アクティブなスレッド プールのサイズを増やす必要があります。以下のリンクを確認してください

http://www.talkingtree.com/blog/index.cfm/2005/11/28/Request-timed-out-waiting-for-an-available-thread-to-run

http://helpx.adobe.com/coldfusion/kb/coldfusion-mx-6-1-request.html

ハッピーコーディング!!!

于 2012-06-06T12:31:02.393 に答える
0

Coldfusion に付属の ColdFusion Server モニターを使用してみましたか?

于 2013-12-30T00:59:12.053 に答える