故障现象
客户反馈A测试平台服务异常,F12查看接口/request/api/view/info返回502错误,日志如下
caused by : org.redisson.RedissonshutdownException :Redisson is shutdown
错误为Redission is shutdown,初步怀疑为Redis 异常。
通过测试 Redis 6329 端口并执行key 查询操作,一切正常。问题仍不定期复现,增加了故障排查难度。
通过开启 A 服务的调试日志,进一步追踪发现日志
PortInUseException: Port 20004 is already in use
20004
端口被占用,导致返回信息错误。
通过ss 命令分析发现,20004 端口被系统上B服务进程占用。
图片
问题根因和解决措施
检查Linux的操作系统内核参数net.ipv4.ip_local_port_range
[root@localhost ~]# sysctl -a | grep ip_local_port_range
net.ipv4.ip_local_port_range = 10000 64999
问题清楚了,系统默认的随机端口范围被扩展到 10000-65000,从而导致占用了服务使用的端口号。
内核参数net.ipv4.ip_local_port_range详解
net.ipv4.ip_local_port_range定义了系统分配给客户端TCP或UDP套接字的临时端口范围(即随机端口)。
随机端口通常用于服务之间的短连接,比如在HTTP请求、数据库交互等场景中,当客户端发起请求但未指定端口号时,系统会在此范围内分配一个可用端口。
调优
默认范围
32768 到 60999(RFC 标准推荐)。
调优场景
当服务对外请求或短连接过多时,随机端口可能耗尽,需要合理扩展范围,通常调整到32768-65535。
解决方案
1、查看当前配置:
sysctl net.ipv4.ip_local_port_range
2、临时生效:
sysctl -w net.ipv4.ip_local_port_range="32768 65535"
3、永久生效(编辑/etc/sysctl.conf):
net.ipv4.ip_local_port_range = 32768 65535
4、执行sysctl -p生效
通过以上措施,故障解决,修改Linux内核参数还是要谨慎,否者可能会导致各种意想不到的问题