在本人短暂的IT开发生涯当中,面试过一些程序员(主要集中在2年-3年)。或多或小的都会问及在并发系统业务逻辑中的优化及实现,大部分的回答都是集群,主从,NOSQL 使用。对于这些个人并不反对,但是我有话要说!这些都是一些大方向,还有狠多狠多细节是需要我们IT技术人员了解的,这些细节是我们在并发数据处理过程中对我们的系统将有很大的提升。(本人技术有限,如果不对的地方请大家提出,欢迎大家指正,内容来自在工作过程中自己学习笔记)

优化重点TCP/IP协议的优化

1:对TCP/IP 协议的三次握手的优化,话不多说直接上图


并发系统架构优化细节_LINUX

当客户主机发起连接请求ACK,服务器主机接收到ACK并且返回ACK,并为客户主机分配资源。客户端在收到ACK 报文后,也会发送确认ACK报文给服务器主机,这样就建立起TCP/IP连接。

优化参数:tcp_max_syn_backlog: TCP 三次握手建立阶段接受SYN,请求列队的最大长度.默认1024,讲其设置大一些可以使出现NGINX繁忙来不及accept新连接的情况下,LINUX 不至于STOP客户的连接请求


2:TCP/IP 协议的四次挥手

并发系统架构优化细节_LINUX_02

第一次挥手:客户端发送FIN+ACK包(序号为seq=a,确认序号ack=b)给服务端,用来关闭客户端到服务端的数据传送,客户端进入FIN_WAIT_1状态

第二次挥手:服务端收到FIN+ACK包后,发送ACK包给客户端进行确认,服务端进入CLOSE_WAIT状态客户端收到ACK包进入FIN_WAIT_2状态。到这里,关闭一个单向通道。

第三次挥手:服务端发送FIN+ACK包给客户端,服务端进入LAST_ACK状态

第四次挥手:客户端收到FIN+ACK包后,发送ACK包给服务端进行确认,客户端进入TIME_WAIT状态,在等待30秒(可修改)后进入CLOSED状态服务端收到ACK包后进入CLOSED状态,关闭另一个单向通道。

优化参数:tcp_fin_timeout:当服务器主动关闭的时候,SOCKET 保持在FIN_WAIT_2状态的最长时间.默认为60秒,我一般设置为10秒

解释:在存在大量短链接的情况下,LINUX 的TCP 一般会生成大量的time_wait的状态的SOCKET

netstat -aut|grep -i time_wait|wc -l

tcp_tw_resuse:这个参数设置为1,表示允许讲time_wait状态的SOCKET重新用于新的TCP 连接

tcp_max_tw_buckets:表示运行time_wait套接字数量的最大值,如果超过这个数字,会立刻清除并打印警告信息

tcp_keepalive_time:这个参数表示当keepalive启用的时候,TCP 发送keepalive 消息的频度,设置小一些可以更快d清理无效的连接

file_max:表示进程,可以同时打开的最大的句柄数

netdev_max_backlog:当服务器网卡处理的请求连接的速度大于LINUX 内核处理速度的时候,LINUX 就会把来不及处理的请求加入一个请求列队(这接下来的博文中讲会讲述队列的数据结构)

还有一些其他的LINUX TCP/IP 优化参数,在工作中使用不多