有熟悉 TCP4 次挥手的么?请教一个昨天遇到的问题

2018-12-18 09:51:20 +08:00
 a663

当时忙是旁边小哥遇到处理的,但是最后问题原理 他也没说不明白 问题情形: 一个应用要使用 3006 端口,发现端口已被占用,使用 netstat -atnlp |grep 3006,发现一直 3006 端口的 TIME_WAITE。 是 4 次挥手时,Client 端等待 2ML 时间的等待。 原来是这里的某些服务需要连接另外一台 Redis 服务器,这边 Client 端打开打端口恰好打开了 3006,然后 netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'一查,TIME_WAITE 有 3 万多个,而且持续观察 2 个小时内 3006 端口一直是 TIME_WAITE

处理:旁边小哥先是调了内核参数 net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_syncookies = 1 都不行之后,加了一个限制 TIME_WAITE 的参数 net.ipv4.tcp_max_tw_buckets = 1024 ###原默认值很大,具体忘了 ###这里 TIME_WAITE 多于该数值,会被抛弃

我的猜测是,服务器 Client 端这边有大量请求需要主动连接 redis,3006 端口刚 TIME_WAITE 结束又进入新的 TIME_WAITE,而不是“一直” TIME_WAITE

问题: 1.上面描述的这种情形的原理是什么? 2.处理方法( net.ipv4.tcp_max_tw_buckets = 1024 )会有什么坑留下?

4331 次点击
所在节点    程序员
22 条回复
liuxu
2018-12-18 15:43:37 +08:00
@90928yao 嗯,是有办法减少资源占用,我遇到的是 php 到 mysql 链接太多导致的
petelin
2018-12-18 16:32:00 +08:00
基本上服务端总是主动断掉链接, 都是代码没写好 /库有问题, 链接服务, 都是 http 长链接之类的吧, 那会创建一个请求一下,然后关掉(我能想到的只有及特殊的爬虫会这样).

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/518496

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX