linux丢包排查
网卡#
查看网卡接口基本信息
netstat {-i | --interface} | column -t
Iface MTU RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR Flg
docker0 1500 0 0 0 0 0 0 0 0 BMU
ens33 1500 316789 0 0 0 105365 0 0 0 BMRU
ens37 1500 631 0 0 0 44 0 0 0 BMRU
lo 65536 3725115 0 0 0 3725115 0 0 0 LRU
网卡 ring buffer
ethtool {-g|--show-ring} ens33
Ring parameters for ens33:
Pre-set maximums:
RX: 4096
RX Mini: 0
RX Jumbo: 0
TX: 4096
Current hardware settings:
RX: 256
RX Mini: 0
RX Jumbo: 0
TX: 256
其它查看网卡信息的命令
ethtool -S ens33
cat /proc/net/dev
column -t /proc/net/dev
ifconfig ens33
ip -s link show ens33
内核#
TCP三次握手

半连接队列#
半连接队列,也称 SYN 队列,服务端收到客户端发起的 SYN 请求后,内核会把该连接存储到半连接队列,并向客户端响应 SYN+ACK,客户端会返回 ACK,服务端收到第三次握手的 ACK 后,内核会把连接从半连接队列移除,然后创建新的完全的连接,并将其添加到 accept 队列
查看TCP半连接队列长度
netstat -ant|grep SYN_RECV | wc -l
可以使用hping3工具模拟SYN攻击
查看半连接溢出情况累计值,可以隔几秒执行查看
netstat -s | grep -i "listen"
9 SYNs to LISTEN sockets dropped
半连接队列需要查看内核源码来确定长度,一般和以下参数相关:
- 是否开启 tcp_syncookies
- somaxconn
- backlog,应用配置
- max_syn_backlog
全连接队列#
全连接队列,也称 accept 队列,等待进程调用 accept 函数时把连接取出,服务端可以使用 ss 命令,来查看 TCP 全连接队列的情况,需要注意 ss 命令获取的 Recv-Q/Send-Q 在「LISTEN 状态」和「非 LISTEN 状态」所表达的含义是不同。
LISTEN 状态:
- Recv-Q:当前全连接队列的大小,也就是当前已完成三次握手并等待服务端 accept() 的 TCP 连接;
- Send-Q:当前全连接最大队列长度;
非LISTEN 状态:
- Recv-Q:已收到但未被应用进程读取的字节数;
- Send-Q:已发送但未收到确认的字节数;
队列长度和以下参数相关:
- somaxconn
- backlog,应用配置 查看连接溢出情况
netstat -s | grep overflowed
Read other posts