[ 
https://issues.apache.org/jira/browse/HTTPCORE-483?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16141423#comment-16141423
 ] 

ASF subversion and git services commented on HTTPCORE-483:
----------------------------------------------------------

Commit 9caf4e6376c447591a6725e9d34f3b94e262d87a in httpcomponents-core's branch 
refs/heads/4.4.x from [~olegk]
[ https://git-wip-us.apache.org/repos/asf?p=httpcomponents-core.git;h=9caf4e6 ]

HTTPCORE-483: back-ported SSL session termination bug fix from 5.x


> High CPU usage after enabling chunked https responses
> -----------------------------------------------------
>
>                 Key: HTTPCORE-483
>                 URL: https://issues.apache.org/jira/browse/HTTPCORE-483
>             Project: HttpComponents HttpCore
>          Issue Type: Bug
>          Components: HttpCore NIO
>    Affects Versions: 4.4.6
>         Environment: Centos 7
>            Reporter: Nick Cabatoff
>         Attachments: fg1-initial-unchunked.svg, fg2-initial-chunked.svg, 
> fg3-patched-unchunked.svg, fg4-patched-chunked.svg
>
>
> I wanted persistent connections with keep-alives, and I discovered that the 
> reason I wasn't getting them was because my responses didn't have a 
> content-length or transfer-encoding: chunked.  So I did body.setChunked( true 
> ), passed that to response.setEntity(), and it worked.  But I noticed that my 
> app was pegged at 100% CPU in top.  I found that the app was fine when it 
> started, but after servicing a single HTTPS request with chunked responses, 
> it got stuck in this 100% cpu state.  It turns out that the reactor thread 
> was busy looping:  despite there being no connections open after servicing 
> that one request, in AbstractIOReactor.execute() the selector.select() call 
> continued to return non-zero, and processEvent() always found a key that was 
> writable.  Stepping through the code I noticed that 
> SSLIOSession.updateEventMask() wasn't closing the session:
> {noformat}
>         // Graceful session termination
>         if (this.status == CLOSING && this.sslEngine.isOutboundDone()
>                 && (this.endOfStream || this.sslEngine.isInboundDone())) {
>             this.status = CLOSED;
>         }
> {noformat}
> The status was CLOSING and endOfStream was true, but 
> sslEngine.isOutboundDone() returned false.  
> I looked at httpcore 5 and found that a new check had been added just above:
> {noformat}
> diff --git 
> a/httpcore-nio/src/main/java/org/apache/http/nio/reactor/ssl/SSLIOSession.java
>  
> b/httpcore-nio/src/main/java/org/apache/http/nio/reactor/ssl/SSLIOSession.java
> --- 
> a/httpcore-nio/src/main/java/org/apache/http/nio/reactor/ssl/SSLIOSession.java
> +++ 
> b/httpcore-nio/src/main/java/org/apache/http/nio/reactor/ssl/SSLIOSession.java
> @@ -371,6 +371,11 @@
>  
>      private void updateEventMask() {
>          // Graceful session termination
> +        if (this.status == CLOSING && !this.outEncrypted.hasData()) {
> +            this.sslEngine.closeOutbound();
> +        }
> +
> +        // Graceful session termination
>          if (this.status == CLOSING && this.sslEngine.isOutboundDone()
>                  && (this.endOfStream || this.sslEngine.isInboundDone())) {
>              this.status = CLOSED;
> {noformat}
> I applied this patch to my httpcore 4.4.6 and the problem went away.  Now 
> after servicing a request with chunked responses the session gets closed 
> properly and the reactor is properly idle. 
> There's still another problem outstanding though.  Request processing now 
> consumes way more CPU than it used to.  Doing one request per second without 
> chunked responses, my app consumes ~20% of one core; with chunked responses 
> it's closer to 100%.  
> I'm attaching flame graphs (see 
> [http://www.brendangregg.com/FlameGraphs/cpuflamegraphs.html]): (1) my 
> starting point without chunked respones; (2) with chunked respones; (3) after 
> applying the above patch, without chunked responses; (4) after applying 
> patch, with chunked responses.  Note the similarity between (2) and (4): in 
> both cases, much of the Java code (green) is mostly consumed with epoll calls.



--
This message was sent by Atlassian JIRA
(v6.4.14#64029)

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@hc.apache.org
For additional commands, e-mail: dev-h...@hc.apache.org

Reply via email to