TIME_WAIT数量太多 造成SocketTimeoutException

本文探讨了在用户端下单场景中,如何通过配置长连接和Linux Net参数来解决5倍压力下的高并发问题,重点在于减少TIME_WAIT状态,提升连接效率。通过调整keepalive参数和TCP定时器设置,结合JMeter压测验证效果。
1、压测问题

用户端下单流程”场景,5倍压力,tcp_time_wait打满6000
在这里插入图片描述

2 、方案1【配置长连接】

出现大量TIME_WAIT的情况:

  • keepalive_requests设置比较小,高并发下超过此值后
    nginx会强制关闭和客户端保持的keepalive长连接;
  • keepalive设置的比较小(空闲数太小),导致高并发下nginx
    会频繁出现连接数震荡(超过该值会关闭连接),不停的关闭、开启和
    后端server保持的keepalive长连接;
http {
   
   
   // 全局配置
   // 长连接响应timeout
  keepalive_timeout 60s; 
  // 与Client连接的"一个长连接"送达的最大请求数(默认是100)
  // 当送达的请求数超过该值后,该连接就会被关闭。
    keepalive_requests 8192; 
  
    upstream servers {
   
   
        server 
```markdown 你执行 `netstat -an | grep 6379` 的输出如下: ``` tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN tcp 0 0 127.0.0.1:45686 127.0.0.1:6379 TIME_WAIT tcp6 0 0 ::1:6379 :::* LISTEN ``` --- ### 🔍 错误分析 这些信息说明: ✅ Redis 服务 **已启动** ❌ 但只监听了本地回环地址: - `127.0.0.1:6379` - `::1:6379`(IPv6 的 localhost) 👉 **Redis 当前仅允许本机访问,不允许外部连接!** 这正是导致 Flink 报错: ``` Caused by: java.net.SocketTimeoutException: connect timed out ``` 的原因 —— 外部客户端(你的本地 IDEA)根本连不上 `node01` 上的 Redis。 --- ### ✅ 解决方案:让 Redis 监听所有网络接口 #### 第一步:修改 Redis 配置文件 编辑配置: ```bash vim /export/servers/redis/redis.conf ``` 找到以下三项并修改: ##### 1. 修改 bind 地址 原内容: ```conf bind 127.0.0.1 ``` 改为: ```conf bind 0.0.0.0 ``` > 允许所有 IP 连接(生产环境建议限制 IP,测试环境可用) ##### 2. 关闭保护模式 原内容: ```conf protected-mode yes ``` 改为: ```conf protected-mode no ``` > 如果 `bind` 不是 `127.0.0.1` 或有密码,可以开启;否则必须关掉,否则仍拒绝外连。 ##### 3. 确保端口正常 ```conf port 6379 ``` 保持不变即可。 --- #### 第二步:重启 Redis 服务 先杀死旧进程: ```bash pkill redis-server ``` 重新启动: ```bash cd /export/servers/redis/ ./bin/redis-server ./redis.conf ``` --- #### 第三步:再次检查监听状态 ```bash netstat -an | grep 6379 ``` ✅ 正确输出应为: ``` tcp 0 0 0.0.0.0:6379 0.0.0.0:* LISTEN ``` 或 ``` tcp6 0 0 :::6379 :::* LISTEN ``` 这表示 Redis 已经对外监听,可以从外部连接! --- #### 第四步:在本地测试连接(Windows CMD) ```cmd telnet node01 6379 ``` 如果出现空白界面(或能输入字符),说明连接成功! > ❌ 如果提示“无法打开到主机的连接”,请检查: > - 服务器防火墙是否开放 6379 端口 > - 本地 `C:\Windows\System32\drivers\etc\hosts` 是否添加了 `node01` 映射 > ``` > 192.168.xx.xx node01 > ``` --- ### 🧪 最终验证 运行完 Flink 程序后,在远程服务器执行: ```bash ./bin/redis-cli -h node01 get totalprice ``` 🎯 预期输出: ``` "88" ``` --- ### 总结 | 当前状态 | 问题 | 解决方法 | |--------|------|-----------| | `127.0.0.1:6379` 监听 | Redis 仅本地可访问 | 修改 `bind 0.0.0.0` | | `protected-mode yes` | 即使改了 bind 也拒绝外连 | 改为 `no` | | 外部连接超时 | 网络不通或未重启服务 | 重启 Redis 并测试 telnet | 📌 **关键命令回顾**: ```bash # 修改配置 sed -i 's/bind .*/bind 0.0.0.0/' ./redis.conf sed -i 's/protected-mode yes/protected-mode no/' ./redis.conf # 重启 Redis pkill redis-server ./bin/redis-server ./redis.conf # 验证监听 netstat -an | grep 6379 ``` ✅ 完成后,Flink 即可成功写入 Redis! ```
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值