spring 配置 embedded tomcat的acceptCount与maxConnections

Posted 风来了

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了spring 配置 embedded tomcat的acceptCount与maxConnections相关的知识,希望对你有一定的参考价值。

一、tomcat设置

1. acceptCount

The maximum queue length for incoming connection requests when all possible request processing threads are in use. Any requests received when the queue is full will be refused. The default value is 100.

 

2. maxConnections

The maximum number of connections that the server will accept and process at any given time. When this number has been reached, the server will accept, but not process, one further connection. This additional connection be blocked until the number of connections being processed falls below maxConnections at which point the server will start accepting and processing new connections again. Note that once the limit has been reached, the operating system may still accept connections based on the acceptCount setting. The default value varies by connector type. For BIO the default is the value of maxThreads unless an Executor is used in which case the default will be the value of maxThreads from the executor. For NIO the default is 10000. For APR/native, the default is 8192.

 

3. spring 设置

server.tomcat.max-connections=10
server.tomcat.accept-count=10



@Configuration  
public class WebServerConfiguration  {  
    @Bean  
    public EmbeddedServletContainerFactory createEmbeddedServletContainerFactory()  {  
        TomcatEmbeddedServletContainerFactory tomcatFactory = new TomcatEmbeddedServletContainerFactory();  
        tomcatFactory.setPort(8081);  
        tomcatFactory.addConnectorCustomizers(new MyTomcatConnectorCustomizer());  
        return tomcatFactory;  
    }  
}  
class MyTomcatConnectorCustomizer implements TomcatConnectorCustomizer  {  
    public void customize(Connector connector)  {  
        Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();  
        //设置最大连接数  
        protocol.setMaxConnections(2000);  
        //设置最大线程数  
        protocol.setMaxThreads(2000);  
        protocol.setConnectionTimeout(30000);  
    }  
}

 

 

二、系统设置

/etc/sysctl.conf优化配置

 1 #优化TCP
 2 vi /etc/sysctl.conf
 3 #禁用包过滤功能 
 4 net.ipv4.ip_forward = 0  
 5 #启用源路由核查功能 
 6 net.ipv4.conf.default.rp_filter = 1  
 7 #禁用所有IP源路由 
 8 net.ipv4.conf.default.accept_source_route = 0  
 9 #使用sysrq组合键是了解系统目前运行情况,为安全起见设为0关闭
10 kernel.sysrq = 0  
11 #控制core文件的文件名是否添加pid作为扩展
12 kernel.core_uses_pid = 1  
13 #开启SYN Cookies,当出现SYN等待队列溢出时,启用cookies来处理
14 net.ipv4.tcp_syncookies = 1  
15 #每个消息队列的大小(单位:字节)限制
16 kernel.msgmnb = 65536  
17 #整个系统最大消息队列数量限制
18 kernel.msgmax = 65536  
19 #单个共享内存段的大小(单位:字节)限制,计算公式64G*1024*1024*1024(字节)
20 kernel.shmmax = 68719476736  
21 #所有内存大小(单位:页,1页 = 4Kb),计算公式16G*1024*1024*1024/4KB(页)
22 kernel.shmall = 4294967296  
23 #timewait的数量,默认是180000
24 net.ipv4.tcp_max_tw_buckets = 6000  
25 #开启有选择的应答
26 net.ipv4.tcp_sack = 1  
27 #支持更大的TCP窗口. 如果TCP窗口最大超过65535(64K), 必须设置该数值为1
28 net.ipv4.tcp_window_scaling = 1  
29 #TCP读buffer
30 net.ipv4.tcp_rmem = 4096 131072 1048576
31 #TCP写buffer
32 net.ipv4.tcp_wmem = 4096 131072 1048576   
33 #为TCP socket预留用于发送缓冲的内存默认值(单位:字节)
34 net.core.wmem_default = 8388608
35 #为TCP socket预留用于发送缓冲的内存最大值(单位:字节)
36 net.core.wmem_max = 16777216  
37 #为TCP socket预留用于接收缓冲的内存默认值(单位:字节)  
38 net.core.rmem_default = 8388608
39 #为TCP socket预留用于接收缓冲的内存最大值(单位:字节)
40 net.core.rmem_max = 16777216
41 #每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包的最大数目
42 net.core.netdev_max_backlog = 262144  
43 #web应用中listen函数的backlog默认会给我们内核参数的net.core.somaxconn限制到128,而nginx定义的NGX_LISTEN_BACKLOG默认为511,所以有必要调整这个值 44 net.core.somaxconn = 262144
45 #系统中最多有多少个TCP套接字不被关联到任何一个用户文件句柄上。这个限制仅仅是为了防止简单的DoS攻击,不能过分依靠它或者人为地减小这个值,更应该增加这个值(如果增加了内存之后) 46 net.ipv4.tcp_max_orphans = 3276800
47 #记录的那些尚未收到客户端确认信息的连接请求的最大值。对于有128M内存的系统而言,缺省值是1024,小内存的系统则是128 48 net.ipv4.tcp_max_syn_backlog = 262144
49 #时间戳可以避免序列号的卷绕。一个1Gbps的链路肯定会遇到以前用过的序列号。时间戳能够让内核接受这种“异常”的数据包。这里需要将其关掉 50 net.ipv4.tcp_timestamps = 0
51 #为了打开对端的连接,内核需要发送一个SYN并附带一个回应前面一个SYN的ACK。也就是所谓三次握手中的第二次握手。这个设置决定了内核放弃连接之前发送SYN+ACK包的数量 52 net.ipv4.tcp_synack_retries = 1 53 #在内核放弃建立连接之前发送SYN包的数量 54 net.ipv4.tcp_syn_retries = 1 55 #开启TCP连接中time_wait sockets的快速回收 56 net.ipv4.tcp_tw_recycle = 1 57 #开启TCP连接复用功能,允许将time_wait sockets重新用于新的TCP连接(主要针对time_wait连接) 58 net.ipv4.tcp_tw_reuse = 1 59 #1st低于此值,TCP没有内存压力,2nd进入内存压力阶段,3rdTCP拒绝分配socket(单位:内存页) 60 net.ipv4.tcp_mem = 94500000 915000000 927000000 61 #如果套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2状态的时间。对端可以出错并永远不关闭连接,甚至意外当机。缺省值是60 秒。2.2 内核的通常值是180秒,你可以按这个设置,但要记住的是,即使你的机器是一个轻载的WEB服务器,也有因为大量的死套接字而内存溢出的风险,FIN- WAIT-2的危险性比FIN-WAIT-1要小,因为它最多只能吃掉1.5K内存,但是它们的生存期长些。 62 net.ipv4.tcp_fin_timeout = 15 63 #表示当keepalive起用的时候,TCP发送keepalive消息的频度(单位:秒) 64 net.ipv4.tcp_keepalive_time = 30 65 #对外连接端口范围 66 net.ipv4.ip_local_port_range = 2048 65000 67 #表示文件句柄的最大数量 68 fs.file-max = 102400

 

 

tcp_abort_on_overflow 是个跟应用程序更相关的参数,当被设置为 1 时,如果应用程序处理速度比较慢,来不及接受新的连接,系统就直接丢弃这个连接,给对端发个 RST。

/proc/sys/net/core/somaxconn跟 tcp_max_syn_backlog 参数的意义是基本一样的,指定用于保存已完成三次握手等待 accept 的队列长度,somaxconn 是 backlog 可以设置的最大值。当在应用程序里设置 backlog 的值大于 somaxconn 参数时,系统也会默默地把 backlog 减小为 somaxconn 指定的值。

 

 参考:

segmentfault: tomcat的acceptCount与maxConnections

spring: howto-embedded-servlet-containers

noodles: 对 Linux TCP 的若干疑点和误会

helloDog: sysctl.conf学习和调优











以上是关于spring 配置 embedded tomcat的acceptCount与maxConnections的主要内容,如果未能解决你的问题,请参考以下文章

Embedded Jetty 无法识别 Spring MVC 安全性

聊聊springboot session timeout参数设置

使用 spring RestTemplate 消耗 json+hal _embedded 资源的问题

使用 Spring Embedded Database 的 JPA 未找到记录

Spring Boot 启动失败,描述/Description: Cannot determine embedded database driver class for database type

Failed to configure a DataSource: 'url' attribute is not specified and no embedded datasourc