我正在尝试找出生产服务器上 Web 应用程序中的瓶颈。大约有 80 个站点在 ColdFusion 10 上运行,最新的 Java 8、Tomcat 7、IIS 8.5 在 Windows Server 2012 R2 上运行。请求随机峰值从平均 500-1000 毫秒到最多 30 秒,这意味着同一页面的 10 个请求中有 9 个在 1000 毫秒内完成,一个需要 20-30 秒。它似乎可以发生在几乎每个带有代码的页面/模板上。
网络应用特点:
- 大量的正则表达式和字符串操作
- 大量数据转换(列表到数组,重新创建数组,随机数据顺序,生成结构)
- 轻量级 SQL 查询(同一网络中的专用 SQL 服务器)
- 没有传出连接 (
<cfhttp>
)
我正在使用 FusionReactor 进行监控,并观察到以下情况:
- 服务器的流量非常低(平均每秒 6 个请求,最多 50 个)
- 请求没有排队
- 在 1-2 毫秒之间平均每秒 60 次 JDBC 查询,最高为每秒 250 次 JDBC 查询,最差的总时间约为 300 毫秒
- 堆最多为 10 GB(其中大部分是缓存/旧代,收集的伊甸园空间约为 2 GB,幸存者空间小于 200 MB)
- GC 年轻收集平均每 40 秒运行一次,大约 20 毫秒,最差时间是 140 毫秒
- 磁盘读/写平均低于 200 Kb/s,最高读取为 2 Mb/s,最高写入为 4 Mb/s
- 网络 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
实际上只是一个单行 Java 函数return 0;
(返回标记的access
属性<cffunction>
),所以我真的怀疑这个函数的执行需要 23 秒。我也没有看到任何锁定/等待。
虚拟机 ( 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
。
硬件
- 英特尔至强 E5-2650上的 HyperV 虚拟机
- 分配了 4 个物理核心,8 个逻辑核心
- 已分配 64 GB RAM
可能是什么原因?如何进一步检查问题?