-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,按字节数填会差出三个数量级,最终效果与预期完全不同。
补充要点
- 调大缓冲前先确认丢包的成因,盲目加大只会把问题推迟出现
- 用过滤条件给捕获量瘦身,是减少丢包最有效的办法
- 写盘场景优先关注存储性能,缓冲只能吸收短时抖动
- 长期采集应评估专用采集方案,而不是不断加大缓冲
每次抓包结束看一眼丢包统计,是判断样本是否可信的最低成本习惯。