実動サーバー上の Web アプリケーションのボトルネックを突き止めようとしています。Windows Server 2012 R2 で最新の Java 8、Tomcat 7、IIS 8.5 を搭載した ColdFusion 10 で実行されているサイトは約 80 あります。リクエストは、平均 500 ~ 1000 ミリ秒から最大 30 秒までランダムにピークに達します。つまり、同じページの 10 件のリクエストのうち 9 件が 1000 ミリ秒以内に完了し、1 件に 20 ~ 30 秒かかります。コードを含むほぼすべてのページ/テンプレートで発生する可能性があるようです。
ウェブアプリの特徴:
- 多くの正規表現と文字列操作
- 大量のデータ変換 (リストから配列へ、配列の再作成、データ順序のランダム化、構造体の生成)
- 軽量 SQL クエリ (同じネットワーク内の専用 SQL サーバー)
- 発信接続がありません (
<cfhttp>
)
FusionReactor を使用して監視していますが、次のことを観察しました。
- サーバーのトラフィックが非常に少ない (平均で 1 秒あたり 6 リクエスト、最高で 50 リクエスト)
- リクエストはキューに入れられません
- 1 ~ 2 ミリ秒で 1 秒あたり平均 60 JDBC クエリ、最高は 1 秒あたり 250 JDBC クエリ、最悪の合計時間は約 300 ミリ秒
- ヒープはせいぜい 10 GB です (そのほとんどはキャッシュ/古い世代であり、eden スペースは約 2 GB で収集され、サバイバー スペースは 200 MB 未満です)
- GC の若いコレクションは 40 秒ごとに実行され、平均で約 20 ミリ秒、最悪の時間は 140 ミリ秒です。
- ディスクの読み取り/書き込みは平均で 200 Kb/秒未満、最大読み取りは 2 Mb/秒、最大書き込みは 4 Mb/秒
- ネットワーク IO: 平均で 200 b/s TX、400 b/s RX
- CPU は 20% から 60% の負荷で実行されます
- 20 ~ 30 秒のピークが発生するたびに、JIT 時間グラフにスパイクが表示される
遅いリクエストのスタックトレース
注: これは単なる例です。その他の保留中の要求は、他の機能のギャップを示しています。パターンはないようです。クエリを含む関数である場合もあれば、単なる である<cfinclude>
場合もあれば、単純な出力である場合もあります。
スレッドの CPU 時間は 2500 ミリ秒で、実行時間は 29727 ミリ秒です。TTFB と TTLB は 29726 ミリ秒で、ストリームは 2 ミリ秒前に開き、1 ミリ秒後に閉じました。クエリの合計時間は 76 ミリ秒 (19 クエリ) でした。
funcCONSTRUCTFOOTER.getAccess
が実際には 1 行の Java 関数(タグの属性をreturn 0;
返す) にすぎないことに注意してください。したがって、この関数の実行に 23 秒かかったとは思えません。ただし、ロック/待機も表示されません。access
<cffunction>
JVM ( Java HotSpot(TM) 64-Bit Server VM, 1.8.0_121
)
-server
-Xms24G
-Xmx48G
-Xss4m
-XX:MaxMetaspaceSize=2G
-XX:+TieredCompilation
-XX:ReservedCodeCacheSize=2G
-XX:+UseCompressedOops
-XX:+UseG1GC
-XX:MaxGCPauseMillis=100
-Xbatch
ColdFusion ( 10.0.22.283922
、アップデート 22)
Maximum number of simultaneous Template requests: 40
Maximum number of cached templates: 40000 (~14500 cached according to monitor)
Trusted cache: true
Cache template in request: true
Component cache: true
Save class files: true
コネクタ
<Connector port="8012" protocol="AJP/1.3" redirectPort="8445" tomcatAuthentication="false" maxThreads="500" connectionTimeout="60000" />
worker.list=cfusion
worker.cfusion.type=ajp13
worker.cfusion.host=localhost
worker.cfusion.port=8012
worker.cfusion.connection_pool_size=500
worker.cfusion.max_reuse_connections=250
worker.cfusion.connection_pool_timeout=60
metrics.log
35 から 75 スレッドの範囲の平均。ビジー カウントは値の約 90% ですMax threads: 500 Current thread count: 70 Current thread busy: 64
。
ハードウェア
- Intel Xeon E5-2650上の HyperV VM
- 4 つの物理コアが割り当てられ、8 つの論理コアが割り当てられています
- 64 GB RAM を割り当て
その理由は何ですか?問題をさらに調べるにはどうすればよいですか?