检查方法:ss-lnt|grep${listeningport},第三列(Send-Q)即是对应监听端口的acceptqueue的队列长度.
设置方法:依赖两个配置,Linux内核会取他们的较小值最为最终的acceptqueue队列长度
a)Linux内核参数net.core.somaxconn
b)应用层面配置的backlog长度,该配置方法根据应用程序的不同而各有差异
PS.关于acceptqueue队列长度具体应该设置多少,需要根据不同的业务形态差异化的定制,以下值供参考:
a)Linux内核net.core.somaxconn设置的值为128
b)Nginx缺省的backlog为511
应用配置
nginx配置文件:/usr/local/nginx/conf/nginx.conf
server {
listen 80 backlog=8191;
server_name localhost;
系统配置:
net.ipv4.tcp_max_syn_backlog=8192
net.core.somaxconn=8192
date;netstat -s |grep -iE 'overflow|backlog|drop'
关于参数调整和布置监控accept的脚本,如下:
1. 参数调整
1)sysctl -a | grep somaxconn
echo "net.core.somaxconn = 4096" >> /etc/sysctl.conf
sysctl -p
2) 调整应用backlog (tomcat)
全局
server.xml
设置acceptCount="4096"
如果有application级别的
application.properties
设置server.tomcat.accept-count=4096
重启应用,敲ss -tanl | grep 81验证,第三列变成4096说明生效。
2. 验证大并发时TCP accept queue有没有丢包的shell。
在一台机器中,将如下shell的输出周期性的重定向到一个输出文件,可用crontab每隔2秒执行一次。
echo "=====================";date; ss -tanl | grep 81; netstat -st | egrep -i "drop|reject|overflowed|listen|filter"