前面章节我们已经谈了Linux网络数据包从应用进程如何一步步走到网卡物理层,以及可能存在的问题点。同时引出了网络排查最常用的几个命令:ss、ip、tc、ethtool ,今天来详细拆解一下这几个命令。
Linux性能优化:网络背后的数据流转和关键指标
当收到线上报警,例如nginx 的 upstream 大量超时,我们一般习惯性敲 netstat -anp | grep 80。光标卡了五秒才吐结果——然后发现机器没装 netstat。apt install net-tools,等安装完再跑,又是三秒。
其实这是运维人员非常头疼的问题 - 思路混乱。
真正的排查路径,是沿着协议栈一层一层往下走:ss 看连接,ip 看路径,tc 看排队,ethtool 看硬件。四把刀,从应用到物理。看完这篇,你再遇到网络问题,脑子里会有一条清晰的路线图。
一、ss:应用层的利器
ss 不是比 netstat 好一点——是一个数量级的差距。它在内核态直接读 socket 信息,不像 netstat 那样遍历 /proc 还要层层解析。
看监听端口:
ss -tuln
输出里有 LISTEN 就表示有人在听。例如:连不上 MySQL,可以先跑这条,确认 3306 确实还活着。
看连接状态:
ss -tan state establishedss -tan state time-waitss -tan '( sport = :80 or dport = :80 )'
TIME_WAIT 是 Web 服务器上的高频场景。成千上万是正常的,但配合 ss -s 看内存占用,就能判断这些连接是不是在空耗资源。
定位连接泄漏:
ss -tanp | grep 192.168.1.100 | wc -l
这个数字持续涨不回落,大概率是应用没关 socket。加上 -p,进程名和 PID 可以全带出来一一查看到底是哪个引起的。
应用层排查最常用这几个命令:
ss -sss -tanp state establishedss -tanp state time-wait
二、ip:网络层的核心
ip 是 iproute2 全家桶的核心,替代了 ifconfig、route、arp 三件套。写法更一致,信息也更完整。
查地址:
ip addr show eth0
IP、掩码、广播地址,都在。比 ifconfig 的输出清晰很多。
查路由:
ip route show
查默认路由走哪、到某个内网段走哪条路。如果想知道到底怎么出去的,可以用这个:
$ ip route get 8.8.8.88.8.8.8 via 192.168.1.1 dev eth0 src 192.168.1.100 uid 0
一条命令告诉你出口、源地址、出站网卡。
查邻居(ARP 表):
ip neigh show
如果邻居状态是 FAILED 或 INCOMPLETE,二层已经断了。这时候查路由、查 iptables 都是浪费时间。
策略路由的使用:
ip rule showip route show table 100
多网卡场景下,让 10.0.0.0/8 走 eth1,外网走 eth0。ip rule 加多张路由表,细粒度控制流量的走向。
一个隐藏技能:
ip monitor
路由变化、地址变化、邻居变化,实时输出。
三、tc:链路层
tc 是 Linux 最被低估的工具之一。它的工作位置在链路层——数据包离开内核、进入网卡之前,得先过它这一关。
先看:
tc qdisc show dev eth0
qdisc pfifo_fast 0: root refcnt 2 bands 3 priomap 1222 ...
这是 Linux 默认的出队策略 pfifo_fast,三个优先级 band,大部分场景不需要动。
模拟网络延迟:
tc qdisc add dev eth0 root netem delay 100mstc qdisc del dev eth0 root
一般用在测试弱网环境下的应用表现。
限速:
tc qdisc add dev eth0 root tbf rate 1mbit burst 32kbit latency 400ms
模拟低速链路,验证系统在带宽瓶颈下的表现。
需要注意的是: tc 控制的是出队,不是入队。流量方向是内核 → tc → 网卡。想控制进入的方向,需要在对端,或者在本机用 ingress qdisc 加 ifb 虚拟网卡做流量整理。
四、ethtool:物理层的检查
走到最底层,就是网卡和线缆。这层只有一个工具:ethtool。
看链路状态:
ethtool eth0
Speed、Duplex、Auto-negotiation、Link detected。这四行数据基本上筛掉一半的硬件问题。
最常见的问题:千兆网卡显示 100Mb/s。原因一般是网线质量差、两端协商失败、或者光模块老化。可以先查这个,别急着重装驱动。
看驱动和固件:
ethtool -i eth0
driver: ixgbeversion: 5.15.0firmware-version: 0x61b0d001bus-info: 0000:03:00.0
记得有一次环境线上丢包严重,查了一圈发现是网卡驱动太老,不支持新版内核的某些 offload。升级驱动后才恢复。没有 -i 排查起来就会费劲很多。
看硬件统计:
ethtool -S eth0
网卡驱动的黑匣子:
rx_dropped / tx_dropped — ring buffer 满了,内核来不及收rx_crc_errorsrx_fifo_errors
丢包排查流程:
发现丢包后,按这个顺序查:
ethtool -S eth0 | grep -i errorethtool -k eth0 | grep on — TSO/GRO 这些 offload 开没开(通常应该开着)ethtool -g eth0ethtool -m eth0
藏得比较深的参数:
ethtool --show-priv-flags eth0
有些网卡有私有标志,比如 Mellanox 的 rx_steering。
如果把这四层串起来的话,排查流程其实就比较清晰了:
ss 看连接 → 连没连上ip 看路径 → 路由对不对tc 看排队 → 被限速了没有ethtool 看硬件 → 网卡坏了没有
从应用到物理,从逻辑到信号。每一层确认完了再往下走,不用再一步步的猜了。