ss -tm
显示每个 TCP 会话的详细内存信息。我发现有些 tcp 会话显示sock_drop
,下面是其中一个:
ESTAB ***** some irrelevant info here ****
skmem:(r0,rb3446699,t0,tb87040,f0,w0,o0,bl0,d222)
d222
在 skmem 中,根据手册页,是 sock_drop 号码。
但ip -s link
(或ifconfig
)两者都显示 0 数据包丢失
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000
link/ether 52:54:00:d9:fb:52 brd ff:ff:ff:ff:ff:ff
RX: bytes packets errors dropped missed mcast
79371129016 110948258 0 0 0 0
TX: bytes packets errors dropped carrier collsns
78030205763 96204113 0 0 0 0
ip -s link
所以我的问题是: 中显示的数据包丢失和 中显示的 sock_drop有什么区别ss -tm
? 导致数据包丢失和 sock_drop 的可能原因有哪些? sock_drop 是否与 tcp 重传有关?
dropped
中的计数器是ip -s
OS 范围的计数器,用于计数内核由于 CRC + 校验和错误等原因丢弃的以太网帧。此外还有 IP 片段重组失败等其他原因。那里的计数器
d222
是每个套接字的计数器。尝试ss -pntm
查看拥有它的进程。这意味着操作系统尝试将数据包传送到用户空间程序,但由于接收缓冲区 (rb3446699
) 已满而失败。这通常表明软件无法足够快地从中读取。显示r0
运行时它是空的,ss
所以可能是暂时错误?这些每个套接字的丢弃不会显示在 中ip -s
。增加
rmem_max
和的rmem_default
值sysctl
可以帮助软件克服此类瞬态错误,但会牺牲内存使用率(如果您服务大量连接)和延迟。注意:如果您运行,
nstat
您将看到更具体的操作系统计数器列表,其中一些是套接字级错误的总和,例如 UDP 和 TCP 的错误总和。