一、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学习和调优