温馨提示×

Linux dropped如何优化配置

小樊
48
2025-12-31 13:03:50
栏目: 智能运维

Linux dropped 优化配置指南

一 快速定位与判因

  • 明确“dropped”发生在哪一层:用 sar、nstat 看接口与内核栈统计,用 ifconfig/ethtool 看网卡层计数,用 ss -s 看套接字层队列溢出,用 /proc/interrupts 与 /proc/softirqs 看中断与软中断分布。
  • 关键指标与含义对照:
    • ifconfig 的 RX dropped:数据包已进入网卡 DMA 环(Ring Buffer)或内核,但因来不及处理被丢弃(常见于内核/用户态消费慢或缓冲区不足)。
    • ifconfig 的 RX overruns:网卡侧 FIFO 溢出,NIC 内部缓冲满导致丢包(驱动来不及分配/回收缓冲)。
    • /proc/net/dev 的 fifo:对应网卡 FIFO 溢出,通常与 overruns 同义。
    • ss -s 的 listen overflows:全连接队列(accept 队列)溢出,常见于高并发短连接、backlog 过小或应用 accept 不及时。
    • nstat 的 TcpExtListenOverflows:内核监听队列溢出计数,验证是否为连接建立瓶颈。
  • 常用观测命令(每秒刷新观察趋势):
    • sar -n DEV 1(看 rxkB/s、txkB/s、rxerr/s、txerr/s、rxdrop/s、txdrop/s)
    • nstat -az(看 TcpExtListenOverflows、TcpExtTCPLoss、TcpExtTCPTimeouts)
    • watch -d cat /proc/interrupts | grep -E “(CPU|eth|ens)”
    • watch -d ‘cat /proc/softirqs | grep NET_RX’
    • ethtool -g eth0(看 RX/TX Ring 当前与最大值)
    • ss -lntp | head(看 Recv-Q 是否长期接近/达到 backlog)
    • cat /proc/net/sockstat(看 socket 层资源使用)
      以上指标与定位方法可快速判断是 Ring Buffer/内核处理瓶颈、队列溢出还是应用层消费慢,从而决定后续优化方向。

二 网卡与队列层优化

  • 启用多队列与 RSS:让网卡把流量分散到多个 RX/TX 队列并映射到不同 CPU,避免单核瓶颈。
    • 查看与设置队列:ethtool -l eth0;ethtool -L eth0 rx 或 combined (N 不超过驱动最大值)。
    • 校验 RSS 哈希字段:ethtool -n eth0 rx-flow-hash tcp4;必要时 ethtool -N eth0 rx-flow-hash tcp4 sdfn(按源/目的 IP 与端口均衡)。
  • 中断亲和性(SMP affinity):将每个队列的中断绑定到指定 CPU,减少缓存失效与跨核抖动。
    • 获取网卡中断号并绑定:echo <cpu_list> > /proc/irq//smp_affinity_list;若启用 irqbalance,需为这些 IRQ 设置 ban 或关闭 irqbalance。
  • 软件分发(RPS/XPS,虚拟机或硬件队列不足时):
    • RPS:为每个 rx 队列设置 /sys/class/net//queues/rx-/rps_cpus(16 进制掩码)与 rps_flow_cnt(如 32768),提升软中断并行度。
    • XPS:类似地为 tx 队列设置 rps_cpus,优化发送软中断分布。
  • 增大网卡 Ring Buffer:
    • 查看与调整:ethtool -g eth0;ethtool -G eth0 rx <new_rx> tx <new_tx>(不得超过 Pre-set maximums)。
    • 注意:Ring 过大可能增加缓存占用与处理延迟,需在丢包与延迟间权衡,并通过压测验证。
  • 典型现象与对应动作:
    • /proc/interrupts 单核飙高、sar 显示 rxdrop/s 增长 → 扩队列 + 中断绑核(RSS/RPS)。
    • ifconfig 的 overruns/fifo 增长 → 增大 Ring Buffer、提升软中断并行度、优化应用消费速度。

三 内核网络栈与 TCP/UDP 参数

  • 套接字缓冲区与自动调优(按 BDP 原则配置上限,避免过小导致丢包、过大引入延迟):
    • net.core.rmem_max = 67108864(64MB)
    • net.core.wmem_max = 67108864(64MB)
    • net.ipv4.tcp_rmem = 4096 87380 67108864
    • net.ipv4.tcp_wmem = 4096 16384 67108864
    • net.ipv4.tcp_mem = 262144 524288 786432(单位页,约 1GB/2GB/3GB,视内存而定)
  • 队列与连接瓶颈:
    • net.core.somaxconn = 32768(全连接队列上限)
    • net.ipv4.tcp_max_syn_backlog = 32768(半连接队列上限)
    • 应用侧将 listen(backlog) 至少设置为与 somaxconn 同量级,避免内核截断。
  • TCP 协议栈与拥塞控制(高速/高 BDP 网络优先):
    • net.ipv4.tcp_congestion_control = bbr(需内核 4.9+ 且模块已加载)
    • net.ipv4.tcp_initcwnd = 10;net.ipv4.tcp_slow_start_after_idle = 0
    • net.ipv4.tcp_sack = 1;net.ipv4.tcp_fack = 1;net.ipv4.tcp_dsack = 1
    • net.ipv4.tcp_early_retrans = 3;net.ipv4.tcp_recovery = 1(RACK)
    • net.ipv4.tcp_timestamps = 1;net.ipv4.tcp_window_scaling = 1
    • net.ipv4.tcp_tw_reuse = 1;net.ipv4.tcp_fin_timeout = 30
    • 注意:net.ipv4.tcp_tw_recycle 在 NAT/负载均衡 场景有害,且 Linux 4.12+ 已移除,不要启用。
  • 文件描述符与本地端口(高并发短连接必备):
    • limits.conf:* soft/hard nofile 65535;确保服务与 systemd 作用域继承该限制。
    • net.ipv4.ip_local_port_range = 1024 65535(扩大临时端口池,减少端口耗尽)。
  • UDP 专项(避免接收缓冲不足与策略性丢包):
    • 增大套接字接收缓冲上限(如 net.core.rmem_max 与 net.core.rmem_default 提升到数 MB 级),并合理设置应用层读缓冲与消费线程数。
    • 排查防火墙/安全策略导致的丢包(如未放行业务端口时,UDP 可能直接被策略丢弃)。
      以上参数需结合业务流量模型与压测逐步验证,避免一次性大幅改动引入副作用。

四 持久化与验证

  • 持久化配置:
    • sysctl 参数放入 /etc/sysctl.d/10-network-zeroloss.conf 并执行 sysctl -p;网卡队列与中断亲和性建议写成 systemd 服务或 rc.local(优先使用 systemd unit 管理)。
    • ethtool -G 调整 Ring 需在开机阶段自动执行(如 systemd ExecStartPre),确保重启后仍然生效。
  • 验证闭环:
    • 基线压测:iperf3(TCP/UDP)、netperf;同时观察 sar -n DEV 1、nstat -az、/proc/interrupts、/proc/softirqs、ss -s、ethtool -g eth0 的趋势。
    • 目标:在高并发/高带宽下,接口层 rxdrop/s≈0、网卡 overruns/fifo 不增长、内核 ListenOverflows 不增长、应用 Recv-Q 不长期打满
      通过“观测 → 调整 → 复测”的闭环,逐步逼近目标丢包率与延迟指标。

0