请求时间高峰,如何找到瓶颈

时间:2017-02-11 16:11:48

标签: java coldfusion jvm fusionreactor

我试图弄清楚生产服务器上的Web应用程序中的瓶颈。 ColdFusion 10上大约有80个站点在Windows Server 2012 R2上运行最新的Java 8,Tomcat 7,IIS 8.5。请求从平均500-1000毫秒到最多30秒随机峰值,这意味着同一页面的10个请求中的9个在1000毫秒内完成,一个需要20-30秒。它似乎可以在包含代码的每个页面/模板上发生。

网络应用特征:

  • 许多正则表达式和字符串操作
  • 大量数据转换(列表到数组,重新创建数组,随机化数据顺序,生成结构)
  • 轻量级SQL查询(同一网络中的专用SQL服务器)
  • 没有传出连接(<cfhttp>

我使用FusionReactor进行监控,并观察了以下事项:

缓慢请求的堆栈跟踪

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

stacktrace

线程CPU时间为2500毫秒,执行时间为29727毫秒。 TTFB和TTLB为29726 ms,流在2 ms之前打开,之后1 ms关闭。查询总时间为76毫秒(19个查询)。

注意funcCONSTRUCTFOOTER.getAccess实际上只是一行Java函数return 0;(返回access标记的<cffunction>属性,所以我真的怀疑执行这个功能花了23秒。我不会看到任何锁定/等待。

更多例子: stacktrace stacktrace stacktrace

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

可能是什么原因?我怎样才能进一步检查这个问题?

0 个答案:

没有答案