SynDrop是Linux内核中代表半连接队列溢出丢包的精确指标,记录因SYN队列满而静默丢弃的SYN包总数,需用awk直接解析/proc/net/snmp获取,该值只增不减且不受tcp_syncookies=1影响判断。

直接读 /proc/net/snmp 里的 SynDrop 字段
Linux 内核不写日志,只累积计数。真正代表半连接队列(SYN queue)溢出丢包的指标是 SynDrop,它记录的是因队列满而被静默丢弃的 SYN 包数量。
执行这行命令就能拿到当前值:
awk '/^TcpExt/ {for(i=1;i<=NF;i++) if($i=="SynDrop") print $(i+1)}' /proc/net/snmp
- 输出为纯数字,比如
42,说明已丢 42 个 SYN - 该值只增不减,重启网络子系统或机器才会归零
- 如果值长期不增长,不代表没压力,可能
tcp_syncookies=1已启用,内核改用 Cookie 机制绕过队列,此时SynDrop不会增加但仍有性能开销
别信 netstat -s | grep listen overflows
这个命令输出的 ListenOverflows 实际对应全连接队列(accept queue)溢出,不是半连接队列。老版本 netstat(如 net-tools 1.60)甚至根本不解析 SynDrop,只显示模糊字段,极易误判。
-
netstat -s解析的是同一份/proc/net/snmp,但字段映射不全、版本差异大 - 看到 “SYNs to LISTEN sockets dropped” 并不等于
SynDrop;它可能是SynsToListenDrops(仅在tcp_syncookies=0时有效) - 生产环境排查必须绕过
netstat,直取原始数据源
配合 ss -n state syn-recv 看实时堆积
SynDrop 是历史丢包总数,而 ss -n state syn-recv | wc -l 能告诉你此刻有多少连接卡在 SYN_RECV 状态——这是半连接队列是否濒临溢出的实时水位尺。
- 执行
ss -n state syn-recv | wc -l,再对比cat /proc/sys/net/ipv4/tcp_max_syn_backlog - 若前者接近或等于后者,说明队列已满,新 SYN 正在被丢(即使
SynDrop暂未跳变,也可能刚发生) - 注意:该命令需 root 权限才能看到所有监听端口的
syn-recv连接;普通用户只能看到自己进程相关的
检查 dmesg 有没有触发防护
当半连接队列持续压满且 tcp_syncookies=0 时,内核可能判定为潜在 SYN Flood,并打印提示。这不是溢出本身,而是溢出引发的防御响应。
- 运行
dmesg | grep -i "possible SYN flooding" - 出现该日志,基本可确认半连接压力已到临界点,哪怕
SynDrop数值还低 - 但要注意:该日志可能被 ring buffer 刷掉,建议提前配置
dmesg -w或定期采集
SynDrop 增长、syn-recv 数量逼近上限、dmesg 出现 flood 提示,三者任一出现都值得干预;但单独依赖任何一个,都会漏掉关键上下文。


















