采样流sFlow(Sampled Flow)是一种基于报文采样的网络流量监控技术,主要用于
对网络流量进行统计分析。sFlow 系统包含一个嵌入在设备中的sFlow Agent 和远端的
sFlow Collector。其中,sFlow Agent 通过sFlow 采样获取本设备上的接口统计信息和数
据信息,将信息封装成sFlow 报文,当sFlow 报文缓冲区满或是在sFlow 报文缓存时间超
时后,sFlow Agent 会将sFlow 报文发送到指定的sFlow Collector。sFlow Collector 对
sFlow 报文进行分析,并显示分析结果,组网图如下:
一、sflow 初始化
SFlow 的配置入口函数是bridge_configure_sflow(),该函数创建SFlow 相关的数据区
并初始化相应配置,形成的主要数据结构如下:
二、sflow 流表生成
sflow 的实现是在用户态生成sflow 的流表并配置到内核datapath,内核完成数据采
样,发送到用户态,然后有上层sflow agent 发送到collector。sflow 在用户态生成
sflow 的流表。流表生成的代码调用流程add_sflow_action()->compose_sflow_cookie
()->compose_sample_action(),生成OVS_ACTION_ATTR_SAMPLE 类型的action,主要代码如下:
三、sflow内核处理
sflow在内核执行action的时候处理,入口函数do_execute_actions()->sample(),代码如下,如果是最后一个action,调用output_userspace()发送数据到用户空间;否则把该action加入到队列中等待执行,代码如下:
四、sflow 消息处理
内核datapath 采样的数据通过netlink 发送到用户空间的vswithd 进程,接收函数为
recv_upcalls(),调用process_upcall()函数进入核心处理流程,其中对SFLOW_UPCALL 分
支的处理就是sflow 的入口,处理函数dpif_sflow_received(),核心流程如下: