前言
本文主要对nfdump的性能分析做一个记录,看看这个工具是否存在性能瓶颈,如果存在,能否对性能瓶颈作出一定优化。
如有错误欢迎指出,谢谢!
netflow简介
netflow是思科在1996年开发的用于监测ip网络流状态的技术,由以下三个部分组成:
- netflow exporter: 网络中支持netflow的路由器/交换机,负责将出入其接口的数据包统计为流,并将ip流汇聚为netflow数据,上报给一个或多个collector(上报使用的是UDP协议);
- netflow collector: 负责接收和储存netflow数据,并进行预处理;
- netflow analyzer: 对接收到的流量数据进行分析;
nfdump
nfdump是一个开源的netflow收集和处理工具,充当了netflow collector的角色,是netflow分析和图形化的Web前端NfSen的后端工具。
方法论
一点感悟
性能分析目标
一般来讲,性能分析的目标是改进用户体验以及降低运行成本,我这次性能分析自然也是为了找到nfdump的性能瓶颈在哪然后加以解决。
为了评估我们是否达到了这个目标,最好先确定一个量化指标,以表明我们是否已经达到性能优化指标,或者距离目标还有多远。常用的量化指标如延迟、速率、吞吐量、利用率、开销成本等……
由于对netflow还不是特别熟悉,经过一段折腾和猜测(可能在网络处理上有一些瓶颈?),我先暂定量化指标为吞吐量和CPU开销,具体评估如下:
主机1通过nfgen工具发送固定大小的netflow v9数据给主机2,经过测试发送可达网卡线速度(我使用的是X550 10G的网卡),主机2上开一个nfcapd用于接收netflow数据,主机2在满负载下的接收速率以及CPU占用率就作为我的量化指标。
实验评估
CPU负载分析
先确认CPU对它有无影响
在花时间使用分析工具之前,首先确定系统负载确实受限于CPU,例如使用mpstat
工具:
我们在主机1线速度发送netflow数据的情况下,使用如下命令
mpstat -P ALL 1
运行结果如下图,可以看到CPU7被用户态时间占满,CPU6有一半的时间被软中断占满;其余基本是空闲状态。如果nfcapd不能自行扩展CPU核,那确实是受CPU影响。(但是可以看到sys时间很少,我还以为系统调用时间会用掉很多CPU呢)
这时候我想再开一个进程,继续测试:
第二个进程监听的是另一个网卡(主机自带的);
然后采样nfcapd的CPU调用栈信息
这里我使用perf
采样,并使用Flamegraph以使数据可视化,下面给出大致过程:
- 把火焰图源码clone下来,后面都要用到里面的脚本;
- 使用perf采样:
sudo perf record -F 99 --call-graph dwarf -p 2112 -- sleep 10
参考这个文章我使用了dwarf的栈回溯方式,2112是我运行着的nfcapd的PID; - 利用火焰图的脚本进行数据处理、折叠、画图:
sudo perf script > out.perf
./stackcollapse-perf.pl out.perf > out.folded
./flamegraph.pl out.folded > out.svg
最后得到的out.svg就是我们要的火焰图了,横轴代表采样点,纵轴代表调用回溯,使用浏览器打开可以点击窄块看详细信息;
从里面可以看到,系统调用什么的确实很少,肉眼可见的大部分都被用来处理netflow数据了(Process_v9),这个处理都干了些啥?解析netflow数据这么困难吗?
现存问题
- exporter上报的netflow数据的大小?上报机制?是一直在将信息上报吗?
- 一个collector是否和多个exporter连接?
- 如何测试nfcapd的接收速率?
- netflow数据以UDP报文上报,是什么格式?有加密吗?