javaee / grizzly

Writing scalable server applications in the Java™ programming language has always been difficult. Before the advent of the Java New I/O API (NIO), thread management issues made it impossible for a server to scale to thousands of users. The Grizzly NIO framework has been designed to help developers to take advantage of the Java™ NIO API.
https://javaee.github.io/grizzly/
Other
222 stars 60 forks source link

Noticed high CPU usage when testing HTTP/2. Found threads in a loop #1930

Closed rlubke closed 7 years ago

rlubke commented 7 years ago

Stacktrace:

at org.glassfish.grizzly.http2.DefaultOutputSink.addOutputQueueRecord(DefaultOutputSink.java:666)
    at org.glassfish.grizzly.http2.DefaultOutputSink.writeDownStream(DefaultOutputSink.java:451)
    - locked <0x000000076b885910> (a org.glassfish.grizzly.http2.DefaultOutputSink)
    at org.glassfish.grizzly.http2.Http2ServerFilter.processOutgoingHttpHeader(Http2ServerFilter.java:854)
    at org.glassfish.grizzly.http2.Http2BaseFilter.handleWrite(Http2BaseFilter.java:661)
    at org.glassfish.grizzly.filterchain.ExecutorResolver$8.execute(ExecutorResolver.java:111)
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:284)
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:201)
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:133)
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:112)
    at org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:77)
    at org.glassfish.grizzly.filterchain.FilterChainContext.write(FilterChainContext.java:890)
    at org.glassfish.grizzly.filterchain.FilterChainContext.write(FilterChainContext.java:743)
    at org.glassfish.grizzly.http.server.FileCacheFilter.handleRead(FileCacheFilter.java:126)
    at org.glassfish.grizzly.filterchain.ExecutorResolver$9.execute(ExecutorResolver.java:119)
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:284)
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:201)
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:133)
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:112)
    at org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:77)
    at org.glassfish.grizzly.http2.Http2Session.sendMessageUpstream(Http2Session.java:1284)
    at org.glassfish.grizzly.http2.Http2Session.sendMessageUpstream(Http2Session.java:1260)
    at org.glassfish.grizzly.http2.Http2BaseFilter.sendUpstream(Http2BaseFilter.java:784)
    at org.glassfish.grizzly.http2.Http2ServerFilter.processInRequest(Http2ServerFilter.java:821)
    at org.glassfish.grizzly.http2.Http2ServerFilter.processCompleteHeader(Http2ServerFilter.java:744)
    at org.glassfish.grizzly.http2.Http2BaseFilter.processHeadersFrame(Http2BaseFilter.java:622)
    at org.glassfish.grizzly.http2.Http2BaseFilter.processInFrame(Http2BaseFilter.java:441)
    at org.glassfish.grizzly.http2.Http2BaseFilter.processFrames(Http2BaseFilter.java:177)
    at org.glassfish.grizzly.http2.Http2ServerFilter.handleRead(Http2ServerFilter.java:532)
rlubke commented 7 years ago

To reproduce: h2spec generic/2/3 -h localhost -p 8080

rlubke commented 7 years ago

Test case sets the initial window size to zero which causes the DefaultOutputSink to spin trying to send a response.