Ubuntu 18.04服务器端口未释放引发多组件异常的排查方向与解决方案咨询
Ubuntu 18.04服务器端口未释放引发多组件异常的排查方向与解决方案咨询
Hey David,你的这个推测非常合理——端口耗尽/未及时释放确实有可能同时触发你遇到的这三类问题:毕竟Kamailio用的MySQL TCP连接、Asterisk的RTP UDP端口,都受系统端口池的统一管控。我给你整理了几个实用的排查方向和解决思路,供你参考:
一、先验证端口未释放的推测是否成立
- 检查当前端口占用情况:
用ss -tulpn命令(比netstat更高效)列出所有正在使用的TCP/UDP端口、关联进程和连接状态。重点关注:- 大量处于
TIME_WAIT状态的TCP连接(这是端口未及时回收的典型信号) - UDP端口的占用密度,尤其是Asterisk配置的RTP端口范围
- 大量处于
- 查看系统端口相关参数:
执行sysctl net.ipv4.ip_local_port_range确认系统默认的本地端口范围(Ubuntu 18.04一般是32768-60999);同时检查TCP回收参数:sysctl net.ipv4.tcp_fin_timeout:控制TIME_WAIT连接的保留时长,默认60秒sysctl net.ipv4.tcp_tw_reuse/sysctl net.ipv4.tcp_tw_recycle:控制是否复用TIME_WAIT连接,前者更安全,后者在NAT环境下可能出问题
- MySQL连接专项排查:
登录MySQL执行SHOW PROCESSLIST;,看看是否有大量Sleep状态的闲置连接,或者是否真的触达了max_user_connections上限。同时检查Kamailio的数据库连接池配置,确认是否存在连接未主动关闭导致的泄漏情况。
二、如果确认是端口问题,这些方案可以尝试
- 调整系统端口参数优化回收:
- 扩大本地端口范围:编辑
/etc/sysctl.conf,添加/修改net.ipv4.ip_local_port_range = 1024 65535(注意1024以下是特权端口,需确保应用无相关限制),执行sysctl -p生效 - 缩短TIME_WAIT超时:修改
net.ipv4.tcp_fin_timeout = 30,让闲置连接更快被回收 - 开启TIME_WAIT复用:设置
net.ipv4.tcp_tw_reuse = 1(推荐开启,兼容性好),非NAT环境可尝试net.ipv4.tcp_tw_recycle = 1,但NAT场景下谨慎使用
- 扩大本地端口范围:编辑
- 优化应用层面的连接/端口管理:
- Kamailio:检查
db_mysql模块的max_db_conns参数是否合理,确认是否开启连接池回收机制,确保空闲连接被主动关闭;同时配合调整MySQL的wait_timeout和interactive_timeout,让MySQL主动回收闲置连接 - Asterisk:检查
rtp.conf的rtpstart/rtpend参数,确保RTP端口范围足够大;用lsof -i UDP:[你的RTP端口范围]排查是否有僵尸进程占用端口;开启Asterisk的端口回收机制,确保会话结束后及时释放RTP端口
- Kamailio:检查
- 排查进程异常:
查看Kamailio、Asterisk的系统日志(/var/log/kamailio/、/var/log/asterisk/、/var/log/syslog),检查是否有进程崩溃、异常重启的记录——这类情况可能导致端口被占用无法正常释放;同时用ps aux查看进程状态,排查是否存在内存泄漏导致的进程异常。
备注:内容来源于stack exchange,提问作者David Cunningham




