jetty服务器低负载高延迟处理记录

jetty服务器上线后发现处理请求延迟非常高。

用POST MAN随便跑了一条GET HTTPS请求后发现,先卡在了SSL Handshake阶段。

jetty服务器低负载高延迟处理记录_第1张图片

随后再尝试了一次直连服务器IP的HTTP请求,延迟依旧非常高,卡在了Transfer Start阶段。

甚至服务器curl localhost请求都非常的慢

jetty服务器低负载高延迟处理记录_第2张图片

但是登录服务器查看工作状态,CPU和内存占用都非常低,打开request和response的log,每条请求的处理都很快。于是猜测是请求并没有及时的被处理,大量请求处于等待处理的状态。

首先查看了网络状态发现出现了许多状态异常的TCP,存在大量的LAST_ATK和FIN_WAIT2

netstat -nat |awk '{print $6}'|sort|uniq -c
netstat -anp | grep 端口

让服务器更早的关闭这些TCP

#更快关闭不需要的TCP连接
echo "#close error TCP" >> /etc/sysctl.conf
echo "net.ipv4.tcp_fin_timeout=2" >> /etc/sysctl.conf
echo "net.ipv4.tcp_keepalive_time=1800" >> /etc/sysctl.conf
echo "net.ipv4.tcp_orphan_retries=3" >> /etc/sysctl.conf
echo "net.ipv4.tcp_keepalive_intvl=15" >> /etc/sysctl.conf
echo "net.ipv4.tcp_retries2=5" >> /etc/sysctl.conf
echo "net.ipv4.tcp_max_syn_backlog = 8192" >> /etc/sysctl.conf
sysctl -p

尝试后发现并没有明显的好转,大量请求后,虽然TCP大部分都是ESTABLISHED,延迟还是会高,处理还是不及时。

从jetty优化开始尝试。主要针对acceptor和threadPool

旧版本代码:

SslSocketConnector selectChannelConnectorSsl = new SslSocketConnector(sslContextFactory);
selectChannelConnectorSsl.setPort(8082);
selectChannelConnectorSsl.setAcceptors(Math.max(1, Runtime.getRuntime().availableProcessors()  - 1));
Connector[] connectors = new Connector[]{selectChannelConnectorSsl}

QueuedThreadPool threadPool = new QueuedThreadPool();
threadPool.setMaxThreads(500);
...
Server server = new Server();
server.setConnectors(connectors);
server.setThreadPool(threadPool);
server.setHandler(handlerList);
server.start();
server.join();

修改后如下:

...
//SslSocketConnector换成SslSelectChannelConnector(同步阻塞IO缓存异步阻塞IO,调用上并没有发现不同)
SslSelectChannelConnector selectChannelConnectorSsl = new SslSelectChannelConnector(sslContextFactory);
selectChannelConnectorSsl.setPort(8082);
//从Runtime.getRuntime().availableProcessors()-1扩大为Runtime.getRuntime().availableProcessors() * 2)
selectChannelConnectorSsl.setAcceptors(Math.max(1,   Runtime.getRuntime().availableProcessors() * 2));
Connector[] connectors = new Connector[]{selectChannelConnectorSsl}

QueuedThreadPool threadPool = new QueuedThreadPool();
//从500扩大为5000(默认只有200,具体最大可以根据服务器性能调整)
threadPool.setMaxThreads(5000);
...

Server server = new Server();
server.setConnectors(connectors);
server.setThreadPool(threadPool);
server.setHandler(handlerList);
server.start();
server.join();

参考文档:


Jetty嵌入式开发及参数设置

jetty8 的io模型

Java实战之从同步阻塞IO到NIO

官方API文档

延伸:

jetty架构及工作原理

一个线程池引发的悲剧

Jetty 服务器架构分析(上)

Jetty 服务器架构分析(中)

Jetty 服务器架构分析(下)

修改jetty后,类似请求情况下没有再出现响应慢的情况。等待后续更大量的测试。

你可能感兴趣的:(java,linux,运维)