Java 高并发Apache HTTP服务器SSL问题

Java 高并发Apache HTTP服务器SSL问题,java,ssl,nio,apache-httpclient-4.x,Java,Ssl,Nio,Apache Httpclient 4.x,我有一个HTTP服务器应用程序,它在正常HTTP流量(约10k个请求/秒)下正常工作,但当流量变得更大时,它会在一段时间内(约30秒到1分钟)无响应,没有任何AV或任何其他提示来指示问题。在这段时间之后,它正在恢复并开始正常工作,直到再次“入睡”。从应用程序日志来看,问题似乎出在SSL流量上,在进行SSL握手后,当我的服务器响应时,需要几秒钟才能将下一个包发送到HAProxy: 当服务器无响应时超过30秒(在本例中为1分钟半): 如何创建连接池: //create the SSL Conte

我有一个HTTP服务器应用程序,它在正常HTTP流量(约10k个请求/秒)下正常工作,但当流量变得更大时,它会在一段时间内(约30秒到1分钟)无响应,没有任何AV或任何其他提示来指示问题。在这段时间之后,它正在恢复并开始正常工作,直到再次“入睡”。从应用程序日志来看,问题似乎出在SSL流量上,在进行SSL握手后,当我的服务器响应时,需要几秒钟才能将下一个包发送到HAProxy:

当服务器无响应时超过30秒(在本例中为1分钟半):

如何创建连接池:

//create the SSL Context for the connection factory
    SSLContext sslContext = null;
    try{
            sslContext=SSLContext.getDefault();                            
            
    }catch(NoSuchAlgorithmException e){
            logger.error(e.getMessage(),e);
    }         

    BasicNIOConnFactory connFactory=new BasicNIOConnFactory(sslContext,null,ConnectionConfig.DEFAULT);

    clientConnectionPool=new BasicNIOConnPool(requestsReactor,connFactory,0);
    clientConnectionPool.setDefaultMaxPerRoute(30000);
    clientConnectionPool.setMaxTotal(30000); 
以及HttpAsyncRequester客户端,该客户端将请求转发给HAProxy:

private HttpAsyncRequester initializeHttpClientForCalls(final ConnectingIOReactor ioReactor)
            throws IOReactorException {
        // Create HTTP protocol processing chain
        HttpProcessor httpproc = HttpProcessorBuilder.create()
                // Use standard client-side protocol interceptors
                .add(new RequestContent(true)).
                 add(new RequestTargetHost()).
                 add(new RequestConnControl())
                .add(new RequestExpectContinue(true)).
                 build();

        // Create HTTP requester
        HttpAsyncRequester requester = new HttpAsyncRequester(httpproc);
        // Create client-side HTTP protocol handler
        HttpAsyncRequestExecutor protocolHandler = new HttpAsyncRequestExecutor();
        // Create client-side I/O event dispatch
        final IOEventDispatch ioEventDispatch =
                new DefaultHttpClientIODispatch<>(protocolHandler, ConnectionConfig.DEFAULT);
 
        // Run the I/O reactor in a separate thread
        new Thread(new Runnable() {

            @Override
            public void run() {
                try {
                    // Ready to go!
                    ioReactor.execute(ioEventDispatch);
                } catch (InterruptedIOException ex) {
                    logger.error("Interrupted", ex);
                } catch (IOException e) {
                    logger.error("I/O error", e);
                }
                 catch (Exception e){
                     logger.error("Exception encountered in Client ", e.getMessage(), e);
                 }
                logger.info("Client calls shutdown");
            }

        }, "Client for calls").start();
        return requester;
    }
在部署应用程序的服务器上连接Java VisualVM,并针对该应用程序运行一批aprox 400 SSL请求,表明对请求的自定义处理不会造成时间损失:

Java版本:

openjdk version "1.8.0_181"
OpenJDK Runtime Environment (build 1.8.0_181-b13)
OpenJDK 64-Bit Server VM (build 25.181-b13, mixed mode)
使用最新的org.apache.httpcomponents


我知道这个问题,并且可能阅读了关于这个主题的所有问题,但它并不能解决我的问题。有没有提高SSL性能的方法?

这是关于您发布的代码中使用的Apache Commons HTTP实现的问题?如果是,请相应地标记:是关于Apache httpd的。如果您的问题确实是关于ApacheHTTPD的,那么它似乎与配置相关,并且比stackoverflow更适合serverfault(请参见标记描述)。(即,问题标题谈到“ApacheHTTP服务器”,但问题谈到的是haproxy)移动部件太多。您是否有可能使用独立的测试应用程序重现此问题?
            IOReactorConfig requestsConfig = IOReactorConfig.
                    custom().
//                  setSoLinger(0).
                    setSoReuseAddress(true).
                    setIoThreadCount(16).
                    build();

            // Create server-side I/O reactor
            requestsIoReactor = new DefaultListeningIOReactor(requestsConfig);
openjdk version "1.8.0_181"
OpenJDK Runtime Environment (build 1.8.0_181-b13)
OpenJDK 64-Bit Server VM (build 25.181-b13, mixed mode)