🚀 A Lightweight and High-Performance Network Traffic Analyzer built with Go
go-flow 是一款轻量级、高性能的网络流量分析工具,基于 Go 语言开发,结合高效的数据处理和低资源占用,适用于边缘计算节点到高吞吐数据中心的多种场景。
- 滑动窗口分析:实时统计指定时间窗口内的 IP、端口和协议流量,支持 Top-N 排序,便于快速定位流量热点。
- 异常检测与告警:自动检测大流量、高频请求等异常行为,提供灵活的告警配置。
- Kafka 数据流输出:支持将分析结果异步推送至 Kafka,无缝集成 ELK Stack、Grafana 等可视化平台。
前往 Releases 下载最新版本压缩文件。
Eth = "eth0" # 监听的网卡名
chmod +x go-flow
./go-flow -c config.toml
http://server_ip:31415
git clone https://github.com/xxddpac/go-flow.git
cd go-flow
make build
A: go-flow
使用了如下优化设计以降低资源占用:
-
高效数据结构:采用堆排序和滑动窗口机制,高效完成流量聚合。
-
协程池管理:动态调度 Goroutine,避免资源泄漏。
-
内存缓存:减少重复计算,提升处理效率。
A: go-flow
使用 Linux 原生的 AF_PACKET
零拷贝技术,在内核态完成数据捕获和复制,数据通过共享内存直达用户态:
- 性能上限:理论支持网卡带宽的最大吞吐量。
- 高可靠性:内核态零拷贝确保数据捕获无丢失。
在实测网络环境中(4Gbps 带宽、约2万终端),go-flow 运行稳定,未发现丢包。
⚠️ 注意 虽然内核采集是零拷贝高性能的,但在用户态中程序仍需处理流量聚合、滑动窗口维护、堆排序等操作,尤其是在超高并发流量下,如果用户空间处理速度跟不上,仍有概率导致丢包。可通过以下方式优化:
- 增加协程池容量(
config.toml
中的Workers
参数)- 调整生产者通道缓冲区(
config.toml
中的PacketChan
参数)- 延迟缓存更新频率(
config.toml
中的Interval
参数)- 使用 pprof 分析热点函数,默认监听端口
31414
,访问http://server_ip:31414/debug/pprof/
查看性能分析数据
另外通过日志可观察丢包情况,默认日志路径/var/log/go_flow.log
A: 相较于 eBPF
,go-flow
选择使用 AF_PACKET
的原因主要有以下几点:
- 开发效率:
AF_PACKET
是Linux
原生抓包接口,配合TPACKETv3
实现零拷贝,无需开发复杂的eBPF
程序,调试更高效。 - 广泛兼容性:支持大多数
Linux
系统,无需特定内核版本或额外模块,部署简单可靠。
A: go-flow
使用的核心采集机制是 AF_PACKET
,这是 Linux
内核特有的高性能网络捕获机制,不支持 Windows
平台。
如需在 Windows
上体验功能,可下载 v1.2.1
版本中的 go_flow_windows.zip
,该版本基于 libpcap
构建。