内存吃紧时抓包核心原则是不增压、不占盘、不扰业务、只取必要数据:限-s 128/256截长、用bpf捕获过滤器内核预筛、流式转发替代本地落盘、配合-c n和-g轮转控资源。

在内存吃紧的高负载服务器上抓包,核心原则是:**不增加内存压力、不写满磁盘、不干扰业务、只取必要数据**。不能照搬常规抓包方式,否则可能触发 OOM Killer 或拖垮服务。
限制捕获长度,避免载荷膨胀
默认 tcpdump 会截断部分包内容(如 -s 68),但对调试无用;全量抓包(-s 0)又极易耗尽内存和 I/O。稳妥做法是按需设定合理 snaplen:
- -s 128:够看 TCP/UDP 头、HTTP 方法/状态码、TLS SNI、DNS 查询名等关键字段,适合排查连接、路由、协议协商类问题
- -s 256:额外覆盖常见 API 请求体前段(如 JSON key、URL 参数)、MySQL 查询头、Redis 命令,适合接口级分析
- 避免 -s 0,除非确认内存和磁盘余量充足且已评估过风险
用 BPF 过滤器在内核态预筛,不把无效包拷进用户空间
所有过滤必须在捕获阶段完成(即使用 捕获过滤器,不是 Wireshark 的显示过滤器)。BPF 在网卡驱动后、内核协议栈前执行,零内存拷贝、零用户态处理开销:
Linux 性能分析与调优专家,覆盖 CPU、内存、磁盘 I/O、网络、内核参数、编译优化、容器/K8s。适用场景:系统卡顿/高负载、内存不足/OOM/Swap 高、CPU 异常/iowait 高。
- 正确:`tcpdump -i eth0 -s 128 'host 10.0.3.15 and (port 8080 or port 5432)'` —— 只让匹配流量进 ring buffer
- 错误:`tcpdump -i eth0 -s 0 -w /tmp/all.pcap` 再本地用 Wireshark 过滤 —— 全量进内存+写磁盘,高危
- 复杂逻辑可用组合:`'tcp and src port 443 and ip[2:2] & 0x1fff = 0'`(过滤非分片 TCP 包)或 `icmp or (tcp[tcpflags] & tcp-syn != 0)`(SYN 包诊断)
流式转发替代本地落盘,绕过磁盘 I/O 和存储瓶颈
当服务器既没空闲内存、也没可靠磁盘空间时,直接把 pcap 流发给远端分析机:
- `tcpdump -i eth0 -s 128 -w - 'host 192.168.2.100 and port 3000' | nc 192.168.1.50 9999`
- 接收端用 `nc -l -p 9999 > capture.pcap` 或直连 Wireshark(File → Import from Pipe)
- 优势:零本地文件写入、内存占用恒定(仅 tcpdump 缓冲区)、可即时分析
- 注意:确保网络路径稳定,nc 不重传,丢包即丢失;生产环境建议加 timeout 或用 socat 增强可靠性
控制资源消耗的辅助手段
配合上述策略,再加几道保险:
- -c N:限定抓 N 个包后自动退出,防无限捕获,例如 `-c 5000`
- -G 300 -W 1:每 5 分钟轮转一次,只保留最新一个文件,防日志堆积
- -Z nobody:降权运行,避免因权限问题导致异常行为扩散
- 避开高峰时段:如非紧急,错开业务峰值(如凌晨或维护窗口)执行










