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