4

我正在尝试找出生产服务器上 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 进行监控,并观察到以下情况:

慢请求的堆栈跟踪

注意:这只是一个例子。其他挂起请求显示其他功能的差距。似乎没有模式,有时它是一个包含查询的函数,有时它只是一个<cfinclude>,有时它只是简单的输出。

堆栈跟踪

线程 CPU 时间为 2500 毫秒,而执行时间为 2972​​7 毫秒。TTFB 和 TTLB 为 2972​​6 毫秒,流在 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

可能是什么原因?如何进一步检查问题?

4

0 回答 0