对于这个测试,我有一个简单的Java servlet,它读入数据并为其计算CRC32。当每个串行请求512MB时,我得到大约600MB /秒。这是有道理的,因为我不能使用所有可用的24个核来计算CRC。驱动此I / O的程序位于本地盒子上,以消除网络问题的可能性。我使用OpenJDK 64位服务器VM(版本25.45-b02,混合模式)在FreeBSD上运行Tomcat 8.0.24.0。
接下来,我尝试使用6个并发请求进行相同的测试,期望每个请求的性能可能低于600MB /秒,但所有6个请求的总体性能会显着提高。
我看到的是CPU始终有一些空闲时间(因此我不会出现我受CPU限制的情况)。我还看到Tomcat中的所有处理线程都按预期同时运行。但是,看起来我总共只能达到800MB /秒左右。 Tomcat中的线程花费大部分时间等待从套接字读取,如下所示。
我很感激有关如何提高Tomcat吞吐量的任何想法/为什么花费这么多时间等待更多数据(我假设这是在下面发生的事情)。
at sun.misc.Unsafe.park(Native Method)
at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:215)
at java.util.concurrent.locks.AbstractQueuedSynchronizer.doAcquireSharedNanos(AbstractQueuedSynchronizer.java:1037)
at java.util.concurrent.locks.AbstractQueuedSynchronizer.tryAcquireSharedNanos(AbstractQueuedSynchronizer.java:1328)
at java.util.concurrent.CountDownLatch.await(CountDownLatch.java:277)
at org.apache.tomcat.util.net.NioEndpoint$KeyAttachment.awaitLatch(NioEndpoint.java:1386)
at org.apache.tomcat.util.net.NioEndpoint$KeyAttachment.awaitReadLatch(NioEndpoint.java:1388)
at org.apache.tomcat.util.net.NioBlockingSelector.read(NioBlockingSelector.java:185)
at org.apache.tomcat.util.net.NioSelectorPool.read(NioSelectorPool.java:251)
at org.apache.tomcat.util.net.NioSelectorPool.read(NioSelectorPool.java:232)
at org.apache.coyote.http11.InternalNioInputBuffer.fill(InternalNioInputBuffer.java:133)
at org.apache.coyote.http11.InternalNioInputBuffer$SocketInputBuffer.doRead(InternalNioInputBuffer.java:177)
at org.apache.coyote.http11.filters.IdentityInputFilter.doRead(IdentityInputFilter.java:110)
at org.apache.coyote.http11.AbstractInputBuffer.doRead(AbstractInputBuffer.java:416)
at org.apache.coyote.Request.doRead(Request.java:469)
at org.apache.catalina.connector.InputBuffer.realReadBytes(InputBuffer.java:342)
at org.apache.tomcat.util.buf.ByteChunk.substract(ByteChunk.java:395)
at org.apache.catalina.connector.InputBuffer.read(InputBuffer.java:367)
at org.apache.catalina.connector.CoyoteInputStream.read(CoyoteInputStream.java:190)
...