当时忙是旁边小哥遇到处理的,但是最后问题原理 他也没说不明白 问题情形: 一个应用要使用 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 )会有什么坑留下?
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.