multithreading - Tomcat 响应时间不一致
问题描述
我的 Tomcat(8.5.8,落后于 Apache HTTPD)有时(< 1%)有很长的等待时间(来自Glowroot的结果)。
JVM Thread Stats
CPU time: 422.3 milliseconds
Blocked time: 0.0 milliseconds
Waited time: 26,576.0 milliseconds
Allocated memory: 73.3 MB
提供的堆栈跟踪显示 Tomcat 正在等待闩锁。那个时候我的Tomcat主机内存、CPU、磁盘IO、垃圾回收看起来都不错。我尝试发出相同的请求并返回相同的数据(压缩大小为 2.5MB,原始大小约为 25MB)。大多数时候都还好(< 2 秒),但有几次需要很长时间(> 20 秒)。
com.fasterxml.jackson.core.json.UTF8JsonGenerator.writeString(UTF8JsonGenerator.java:432)
com.fasterxml.jackson.core.json.UTF8JsonGenerator._writeStringSegments(UTF8JsonGenerator.java:1148)
com.fasterxml.jackson.core.json.UTF8JsonGenerator._flushBuffer(UTF8JsonGenerator.java:2003)
org.springframework.security.web.context.OnCommittedResponseWrapper$SaveContextServletOutputStream.write(OnCommittedResponseWrapper.java:540)
org.apache.catalina.connector.CoyoteOutputStream.write(CoyoteOutputStream.java:96)
org.apache.catalina.connector.OutputBuffer.write(OutputBuffer.java:369)
org.apache.catalina.connector.OutputBuffer.writeBytes(OutputBuffer.java:391)
org.apache.catalina.connector.OutputBuffer.append(OutputBuffer.java:713)
org.apache.catalina.connector.OutputBuffer.flushByteBuffer(OutputBuffer.java:808)
org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:351)
org.apache.coyote.Response.doWrite(Response.java:517)
org.apache.coyote.ajp.AjpProcessor$SocketOutputBuffer.doWrite(AjpProcessor.java:1469)
org.apache.coyote.ajp.AjpProcessor.access$900(AjpProcessor.java:54)
org.apache.coyote.ajp.AjpProcessor.writeData(AjpProcessor.java:1353)
org.apache.tomcat.util.net.SocketWrapperBase.write(SocketWrapperBase.java:361)
org.apache.tomcat.util.net.SocketWrapperBase.writeBlocking(SocketWrapperBase.java:419)
org.apache.tomcat.util.net.SocketWrapperBase.doWrite(SocketWrapperBase.java:670)
org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper.doWrite(NioEndpoint.java:1259)
org.apache.tomcat.util.net.NioSelectorPool.write(NioSelectorPool.java:157)
org.apache.tomcat.util.net.NioBlockingSelector.write(NioBlockingSelector.java:114)
org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper.awaitWriteLatch(NioEndpoint.java:1109)
org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper.awaitLatch(NioEndpoint.java:1106)
java.util.concurrent.CountDownLatch.await(CountDownLatch.java:277)
java.util.concurrent.locks.AbstractQueuedSynchronizer.tryAcquireSharedNanos(AbstractQueuedSynchronizer.java:1328)
java.util.concurrent.locks.AbstractQueuedSynchronizer.doAcquireSharedNanos(AbstractQueuedSynchronizer.java:1037)
java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:215)
sun.misc.Unsafe.park(Native Method)
TIMED_WAITING
等待是由于什么原因?客户端之间的连接问题?客户端慢?Apache HTTPD 和 Tomcat 之间的连接问题?没有足够的文件描述符?
这里的闩锁是什么?
解决方案
推荐阅读
- c# - WebService 不会将信息填充到 Winform 上的文本字段中
- vba - 从与特定日期匹配的列表中提取值 - Excel VBA循环
- python - python 存储数组切片 a[n:m] b[n:m]
- swift - 任何人都可以举出使用 MVC swift IOS 进行依赖注入的例子吗?
- javascript - 如何在 JavaScript 中以 lodash 的 wrap 样式构建过滤器链?
- vba - 访问 - 更新导入的数据
- php - 如何在 FPDF 中的单元格函数内包装文本?
- vba - 更改切片器项目时,宏会触发 50% 的时间
- javascript - 如何从给定的字符串中清除?
- xpath - 元素中不常见的第二个 URL 属性的 XPath 公式