用 ethtool -s eth0 查 rx_missed_errors(ring溢出)、rx_crc_errors(链路干扰)、tx_aborted_errors(重传失败);ss -i 的 retransmits 不等于丢包,可能因ack延迟、乱序或接收窗口为0;tc 限速应选 fq_codel/cake 并合理设参数;perf 需加载 vmlinux 符号才能定位内核网络栈热点。

怎么看实时网卡丢包和错包?ethtool 是最直接的工具,它读取驱动层统计,比 ifconfig 或 ip -s link 更准——后者只反映内核协议栈收发计数,不包含物理层丢弃。运行 ethtool -S eth0 后重点看 rx_missed_errors(Ring Buffer 溢出)、rx_crc_errors(物理链路干扰)、tx_aborted_errors(驱动或硬件重传失败)。
-
rx_missed_errors 持续增长,大概率是 net.core.netdev_max_backlog 太小或中断聚合没开
-
rx_crc_errors 高,先换网线、查交换机端口,别急着调内核参数
-
tx_aborted_errors 在高吞吐下出现,检查是否启用了 TSO/GSO:ethtool -k eth0 | grep tso,关闭后可能降低单包延迟但增加 CPU 开销
为什么 ss -i 显示 retransmits 却没丢包?ss -i 中的 retransmits 计数来自 TCP 重传定时器触发次数,不等于实际网络丢包。它可能是:
- 对端 ACK 延迟到达(比如接收方软中断处理慢),导致本地误判超时
- 网络路径存在乱序,Linux 默认 tcp_reordering 设为 3,稍一乱序就触发快速重传
- 接收窗口长期为 0(ss -i 里 wscale 为 0 或 rcv_wnd 长期 0),应用没及时 recv()
- 查真实丢包用
tcptrace -r /path/to/capture.pcap 分析重传类型;线上没抓包就用 netstat -s | grep -A 5 "Tcp:" 看 TcpRetransSegs 和 TcpOutRsts 比值
- 调大
net.ipv4.tcp_reordering 到 6–12 可缓解乱序误重传,但会略微增加恢复延迟
- 如果
ss -i 里 rcv_wnd 长期为 0,优先查应用 recv 缓冲区是否阻塞,而不是调 net.ipv4.tcp_rmem
tc qdisc 限速后延迟突增,怎么调?tc qdisc 的默认队列是 pfifo_fast,无主动管理,满就丢包;换成 fq_codel 或 cake 才能控延迟。但直接套模板容易翻车:
-
tc qdisc add dev eth0 root fq_codel limit 1024 target 5ms interval 100ms:limit 太小(默认 1024)在千兆口上撑不过 10ms 就开始丢,target 应设为预期基线延迟(如内网 2ms,跨 IDC 20ms)
-
cake 对多流友好,但需内核 ≥ 5.3,且 tc qdisc add dev eth0 root cake bandwidth 1gbit 必须显式指定带宽,否则按 100Mbit 限速
- 不要对 loopback 或容器 veth 口限速:这些路径不走物理队列,
tc 会引入非必要延迟,用 cgroups v2 的 net_cls + net_prio 更合适
perf record 抓不到网络栈热点?
默认 perf record -e syscalls:sys_enter_sendto,syscalls:sys_exit_sendto 只能看系统调用进出,真正耗时在 tcp_transmit_skb、dev_hard_start_xmit 这些内核函数里。必须加内核符号支持:
- 先确认
/lib/modules/$(uname -r)/build 存在,再装 linux-image-extra-$(uname -r)(Ubuntu)或 kernel-debuginfo(CentOS)
- 用
perf record -e 'skb:kfree_skb' --call-graph dwarf -a sleep 10 抓内存释放路径,配合 perf script | stackcollapse-perf.pl | flamegraph.pl 定位丢包点
- 如果
perf report 里全是 [unknown],说明没有 vmlinux 符号:用 perf buildid-list -F 核对 build-id,再用 perf buildid-cache -v --add /usr/lib/debug/lib/modules/$(uname -r)/vmlinux 注入
rx_missed_errors 持续增长,大概率是 net.core.netdev_max_backlog 太小或中断聚合没开rx_crc_errors 高,先换网线、查交换机端口,别急着调内核参数tx_aborted_errors 在高吞吐下出现,检查是否启用了 TSO/GSO:ethtool -k eth0 | grep tso,关闭后可能降低单包延迟但增加 CPU 开销ss -i 显示 retransmits 却没丢包?ss -i 中的 retransmits 计数来自 TCP 重传定时器触发次数,不等于实际网络丢包。它可能是:
- 对端 ACK 延迟到达(比如接收方软中断处理慢),导致本地误判超时
- 网络路径存在乱序,Linux 默认 tcp_reordering 设为 3,稍一乱序就触发快速重传
- 接收窗口长期为 0(ss -i 里 wscale 为 0 或 rcv_wnd 长期 0),应用没及时 recv()- 查真实丢包用
tcptrace -r /path/to/capture.pcap分析重传类型;线上没抓包就用netstat -s | grep -A 5 "Tcp:"看TcpRetransSegs和TcpOutRsts比值 - 调大
net.ipv4.tcp_reordering到 6–12 可缓解乱序误重传,但会略微增加恢复延迟 - 如果
ss -i里rcv_wnd长期为 0,优先查应用 recv 缓冲区是否阻塞,而不是调net.ipv4.tcp_rmem
tc qdisc 限速后延迟突增,怎么调?tc qdisc 的默认队列是 pfifo_fast,无主动管理,满就丢包;换成 fq_codel 或 cake 才能控延迟。但直接套模板容易翻车:
-
tc qdisc add dev eth0 root fq_codel limit 1024 target 5ms interval 100ms:limit 太小(默认 1024)在千兆口上撑不过 10ms 就开始丢,target 应设为预期基线延迟(如内网 2ms,跨 IDC 20ms)
-
cake 对多流友好,但需内核 ≥ 5.3,且 tc qdisc add dev eth0 root cake bandwidth 1gbit 必须显式指定带宽,否则按 100Mbit 限速
- 不要对 loopback 或容器 veth 口限速:这些路径不走物理队列,
tc 会引入非必要延迟,用 cgroups v2 的 net_cls + net_prio 更合适
perf record 抓不到网络栈热点?
默认 perf record -e syscalls:sys_enter_sendto,syscalls:sys_exit_sendto 只能看系统调用进出,真正耗时在 tcp_transmit_skb、dev_hard_start_xmit 这些内核函数里。必须加内核符号支持:
- 先确认
/lib/modules/$(uname -r)/build 存在,再装 linux-image-extra-$(uname -r)(Ubuntu)或 kernel-debuginfo(CentOS)
- 用
perf record -e 'skb:kfree_skb' --call-graph dwarf -a sleep 10 抓内存释放路径,配合 perf script | stackcollapse-perf.pl | flamegraph.pl 定位丢包点
- 如果
perf report 里全是 [unknown],说明没有 vmlinux 符号:用 perf buildid-list -F 核对 build-id,再用 perf buildid-cache -v --add /usr/lib/debug/lib/modules/$(uname -r)/vmlinux 注入
tc qdisc add dev eth0 root fq_codel limit 1024 target 5ms interval 100ms:limit 太小(默认 1024)在千兆口上撑不过 10ms 就开始丢,target 应设为预期基线延迟(如内网 2ms,跨 IDC 20ms)cake 对多流友好,但需内核 ≥ 5.3,且 tc qdisc add dev eth0 root cake bandwidth 1gbit 必须显式指定带宽,否则按 100Mbit 限速tc 会引入非必要延迟,用 cgroups v2 的 net_cls + net_prio 更合适perf record -e syscalls:sys_enter_sendto,syscalls:sys_exit_sendto 只能看系统调用进出,真正耗时在 tcp_transmit_skb、dev_hard_start_xmit 这些内核函数里。必须加内核符号支持:
- 先确认
/lib/modules/$(uname -r)/build存在,再装linux-image-extra-$(uname -r)(Ubuntu)或kernel-debuginfo(CentOS) - 用
perf record -e 'skb:kfree_skb' --call-graph dwarf -a sleep 10抓内存释放路径,配合perf script | stackcollapse-perf.pl | flamegraph.pl定位丢包点 - 如果
perf report里全是[unknown],说明没有 vmlinux 符号:用perf buildid-list -F核对 build-id,再用perf buildid-cache -v --add /usr/lib/debug/lib/modules/$(uname -r)/vmlinux注入
真实瓶颈常卡在软中断(softirq)调度不均或 RPS/RFS 配置失当,而不在用户态代码里。别一上来就 profile 应用进程。
网趣购物系统静态版支持网站一键静态生成,采用动态进度条模式生成静态,生成过程更加清晰明确,商品管理上增加淘宝数据包导入功能,与淘宝数据同步更新!采用领先的AJAX+XML相融技术,速度更快更高效!系统进行了大量的实用性更新,如优化核心算法、增加商品图片批量上传、谷歌地图浏览插入等,静态版独特的生成算法技术使静态生成过程可随意掌控,从而可以大大减轻服务器的负担,结合多种强大的SEO优化方式于一体,使










