TCP并发请求溺出网络
调优:系统开启某个监听端口后,当多个TCP请求链接监听端后,会把多个请求交给backlog的默认监听队列由socket server一并处理,backlog有本身的队列长度默认128,当机器处理能力较慢且并发请求值较高时就要考虑对backlog队列进行调优。数据结构
注:backlog就是socket的监听队列,当一个请求还没有被处理或创建时,他会进入backlog。并发
注:socket server能够一次性处理backlog中的全部请求,处理后的请求再也不位于监听队列中。当server处理请求较慢,以致于监听队列被填满后,新来的请求会被拒绝。socket
TCP内核参数修改 调优tcp
修改文件:/etc/sysctl.conf函数
生效命令:sysctl -p /etc/sysctl.conf性能
# 用于设置内核没法及时处理网络接口收到的数据包时容许发送到队列的最大数据包数目,默认为128。 net.core.netdev_max_backlog = 32768 # 用来限制监听(LISTEN)队列最大数据包的数量,超过这个数量就会致使连接超时或者触发重传机制 net.core.somaxconn= 32768
# 表示SYN队列的长度,默认值为1024,此处加大队列长度为65535,能够容纳更多等待链接的网络链接数。
net.ipv4.tcp_max_syn_backlog=65535
注:根据机器性能调试并发数调优。大数据
somaxconn与tcp_max_syn_backlog区别spa
socket接收的全部链接都是存放在队列类型的数据结构中,关键问题是这种队列有两个,并且其长度都是能够设置的。.net
/proc/sys/net/ipv4/tcp_max_syn_backlog /proc/sys/net/core/somaxconn
注:tcp_max_syn_backlog是指定所能接受SYN同步包的最大客户端数量,即半链接上限。
注:somaxconn是指服务端所能accept即处理数据的最大客户端数量,即完成链接上限。
tcp_max_syn_backlog>=somaxconn
答:somaxconn是内核里的参数,listen函数有个参数backlog,若是在listen方法里面指定该参数大于somaxconn的值,从新编译并启动程序,服务端所能接收的完整的链接数上限是backlog呢仍是somaxconn?
答案:listen方法指定的backlog是在用户态指定的,内核态的参数优先级高于用户态的参数,因此即便在listen方法里面指定backlog是一个大于somaxconn的值,socket在内核态运行时还会检查一次somaxconn,若是链接数超过somaxconn就会等待。就至关于主人指定了能有多少座位没用,客人到了现场,准备入座时,还要看酒店的客户经理判断能有多少个座位。