首页/网络/抓包与流量分析速查/tcpdump -B 调整抓包缓冲区

tcpdump -B 调整抓包缓冲区

设置内核抓包缓冲区(单位为 KiB),缓冲区越大越能扛突发流量、减少丢包;但只有进程能及时消费时才有效。

-B 是干什么的

-B 用于设置内核侧抓包缓冲区的大小,单位是 KiB。缓冲区越大越能吸收突发流量、减少内核丢包,但前提是抓包进程能及时消费:如果写盘或解码成为瓶颈,加大缓冲只是延缓丢包发生的时间,并不能消除丢包。

基本信息

适用平台Linux / macOS / BSD 上的 tcpdump
语法tcpdump -B <KiB> [选项] [过滤表达式]
单位KiB,注意不是字节
何时调整高速链路、流量突发、退出时出现内核丢包
效果判据tcpdump 退出时 stderr 打印的丢包统计

典型使用场景

  • 千兆以上链路上抓包,希望减少内核侧丢包
  • 流量突发明显时给抓包进程留出消费余量
  • 落盘抓包时缓解磁盘写入抖动带来的影响
  • 验证丢包是否由缓冲区不足引起
  • 为长期采集方案确定合理的缓冲配置

常用示例

常用示例
tcpdump -i eth0 -B 40960 -s 96 -w /tmp/high.pcap 'tcp port 443'   # 大缓冲配合瘦身抓取
tcpdump -i eth0 -B 1024 -c 100 icmp                              # 小缓冲限量抓取
tcpdump -i eth0 -nn -c 200 'host 10.0.0.9' 2>/tmp/err.txt          # 结束后查看丢包统计

丢包现象与处理

现象原因方向处理动作
退出时显示大量内核丢包消费速度跟不上加大缓冲并收窄过滤条件
丢包集中在写盘高峰磁盘写入延迟改用内存盘或缩短单次抓包时长
解码开销大导致丢包深层解码消耗只落盘不解码,离线再分析
加大缓冲后仍然丢包瓶颈在用户态减少捕获量或改用专用采集工具
缓冲区只是给消费争取时间,根本手段是降低捕获量或提升写入能力。
-B 的单位是 KiB,按字节数填会差出三个数量级,最终效果与预期完全不同。

补充要点

  • 调大缓冲前先确认丢包的成因,盲目加大只会把问题推迟出现
  • 用过滤条件给捕获量瘦身,是减少丢包最有效的办法
  • 写盘场景优先关注存储性能,缓冲只能吸收短时抖动
  • 长期采集应评估专用采集方案,而不是不断加大缓冲
每次抓包结束看一眼丢包统计,是判断样本是否可信的最低成本习惯。

易错点

  • 把 -B 当成解决丢包的万能手段:瓶颈在用户态时加大缓冲无济于事
  • 单位混淆按字节填写,实际缓冲远小于预期
  • 忽略退出时的丢包统计,误以为抓到的样本是完整的

数据来源与参考

  • man 8 tcpdump(-B 选项)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌