这是典型的 orphaned socket 现象:连接断开后应用未显式关闭且进程已退出,内核尚未完成四次挥手或 TIME_WAIT 回收,socket 仍驻留内存占用缓冲区但不归属任何进程,故 RSS 正常而 ss -m 显示虚高。

为什么 ss -m 显示 TCP 内存远超进程 RSS?
这是典型的 orphaned socket(孤儿套接字)现象:连接已断开、应用层未显式关闭,且对应进程已退出或失去文件描述符引用,但内核尚未完成四次挥手或 TIME_WAIT 回收,socket 仍驻留在内存中,占用 sk_buff 和缓冲区。这些 socket 不归属任何用户进程,ps 或 top 看不到它们,所以 RSS 正常;但 ss -m 的 rmem/wmem 会把它们全算进去,导致总量虚高。
如何用 ss 快速定位 orphaned socket?
ss -i -n state all 是关键命令,配合过滤能直接揪出问题 socket:
- 加
-i显示内部信息(含ino—— inode 号),orphaned socket 的uid字段为空,pid为 0,ino有效但无进程映射 - 加
-n避免 DNS 解析拖慢输出 - 用
awk '$1 ~ /^(tcp|udp)/ && $6 == "0" && $7 == "0"' | head -20快速筛选 uid/pid 均为 0 的条目 - 重点关注
state为TIME-WAIT、CLOSE-WAIT或FIN-WAIT-2且ino非零的行 —— 这些最可能 orphaned
内核参数能否自动清理?
不能依赖“自动”,但可收紧回收条件,降低堆积风险:
-
net.ipv4.tcp_fin_timeout:默认 60 秒,可设为 30,缩短 FIN-WAIT-2 超时时间 -
net.ipv4.tcp_tw_reuse:设为 1,允许 TIME-WAIT socket 在安全条件下被重用(需开启net.ipv4.tcp_timestamps) -
net.ipv4.tcp_max_tw_buckets:硬上限,超限后内核强制回收 oldest TIME-WAIT,建议按内存比例设(如 16GB 内存设为 262144) - ⚠️ 注意:
tcp_tw_recycle已在 4.12+ 内核移除,且早年就因 NAT 环境下不安全而弃用,切勿配置
紧急情况下如何手动触发清理?
没有“一键删除 orphaned socket”的接口,但可通过重置连接状态间接促使其释放:
- 写入
echo 1 > /proc/sys/net/ipv4/tcp_fin_timeout后立刻改回原值,可触发内核扫描并加速超时 socket 回收 - 对特定端口快速复位:用
ss -K dst(需 kernel ≥ 4.10),向对端发送 RST,强制结束僵死连接IPdport =PORT - 最稳妥方式仍是排查源头:检查应用是否漏调
close()、是否 fork 后子进程未处理 socket、是否有 SIGPIPE 导致异常退出而未清理
orphaned socket 本身不损坏系统,但长期堆积会耗尽 socket inode、sk_buff 内存池,甚至触发 OOM killer —— 它们安静,但很固执。










