github:https://github.com/doukoi-BDB
今日主题:
1、仓库代码更新(详见公告)
2、服务端tcp 连接出现大量time_wait (问题)
3、github活动参与持续进行
一、仓库代码 更新公告🪧
1、新增 4个demo 案列&类库 代码:
1)发送邮件demo案例,邮件类库;
2)发送短信demo案例,短信类库;
3)导出excel 表格demo案例;
4)数据导出pdf 案例,类库;
注意事项:代码均可优化,因我写的为了结合案例,未曾使用框架,可替换内容,可自行优化。
链接🔗:https://github.com/doukoi-BDB
二、服务端tcp连接出现大量time_wait
上述问题分为 3块来思考:
Q1、大量的time_wait 状态tcp 连接存在,其本质原因是什么?
Q2、会对业务产生影响吗?
Q3、解决方式是什么?
先来回答第一个问题:
解答:高并发场景时候,会有大量短连接场景,特别是在http请求头中,如果connection 头部被设置为 close时,基本都由【服务端】发起主动关闭连接。
而 tcp 四次挥手关闭连接机制中,为了保证 ack 重发和丢弃延迟数据,设置time_wait 为 2倍的 msl(报文最大存活时间)。
其次回答第二个问题:
解答:每一个time_wait 状态,都会占用一个本地端口,上限为65535(16bit),当大量连接处于 time_wait 时,新的tcp建立连接就会【报错】,报错信息:address already in use :connect 异常 。
tips: tcp 本地端口数量,上限65535(6.5w),这是因为 tcp头部使用16bit存储端口号,因此约束上限。
最后回答第三个问题:
解答:3种解决方式,分别是:
1)客户端的http请求头部,connection 设置为 keep-alive,保持存活时间。2)服务端缩减time_wait时间,设置为1 msl(即,2min)。
3)更新内核参数,编辑文件:/etc/sysctl.conf 。调整参数如下:
net.ipv4.tcp_syncookies = 1 net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_tw_recycle = 1 net.ipv4.tcp_fin_timeout = 30
然后执行 /sbin/sysctl -p 让参数生效。
注意⚠️⚠️⚠️: