繁体   English   中英

如何在OVS交换机中获取数据包处理(packet_in,flow_match,输出)时间?

[英]How to get Packet Processing(packet_in, flow_match, output) time in OVS switch?

我正在尝试评估由Mininet,Open vSwitch和Ryu控制器实现的路由技术。 但是目前我无法弄清楚交换机内部数据包处理时间的测量技术。 我可以测量探测消息的处理时间,因为packet_in发生packet_in并报告给控制器程序。 但是,如何测量那些不会被交换机报告回控制器的数据包的处理时间( packet_in不会发生)? 可能ovs-ofctl命令具有一些可以报告我时间的选项。 但是仍然不确定如何做到这一点。 在这种情况下请帮助我。 我没有足够的资源通过互联网。 在此先感谢您的帮助。

只要您使用的是Open vSwitch内核数据路径 ,就应该能够使用常规的Linux跟踪工具包来检索每个数据包的处理延迟。

以下是使用BPF基础结构(需要Linux v4.4 +)和bcc工具箱 (我的版本为0.5.0-1)的示例。 但是请注意,对于高数据包速率,运行此工具的开销可能会很大。 衡量修改增加的开销的另一种方法是衡量在进行和不进行修改的情况下交换机可以实现的最大吞吐量。

#!/usr/bin/env python
from bcc import BPF
import sys
import ctypes as ct

prog = """
#include <uapi/linux/ptrace.h>
#include <linux/openvswitch.h>

struct vport;

enum action_t {
    DROP = 0,
    OUTPUT,
};

struct proc_record_t {
    u64 delay;
    enum action_t action;
};

BPF_HASH(pkts, struct sk_buff *, u64, 1024);
BPF_PERF_OUTPUT(events);

// Take a timestamp at packet reception by Open vSwitch.
int
kprobe__ovs_vport_receive(struct pt_regs *ctx, struct vport *port, struct sk_buff *skb) {
    u64 ts = bpf_ktime_get_ns();
    pkts.update(&skb, &ts);
    return 0;
}

// Once the packet has been processed by the switch, measure the processing delay and send to userspace using perf_submit.
static inline void
end_processing(struct pt_regs *ctx, struct sk_buff *skb, enum action_t action) {
    u64 *tsp = pkts.lookup(&skb);
    if (tsp) {
        u64 ts = bpf_ktime_get_ns();
        struct proc_record_t record = {};
        record.delay = ts - *tsp;
        record.action = action;
        events.perf_submit(ctx, &record, sizeof(record));
        pkts.delete(&skb);
    }
}

// Called when packets are dropped by Open vSwitch.
int
kprobe__consume_skb(struct pt_regs *ctx, struct sk_buff *skb) {
    end_processing(ctx, skb, DROP);
    return 0;
}

// Called when packets are outputted by Open vSwitch.
int
kprobe__ovs_vport_send(struct pt_regs *ctx, struct vport *vport, struct sk_buff *skb) {
    end_processing(ctx, skb, OUTPUT);
    return 0;
}
"""

b = BPF(text=prog)

class Data(ct.Structure):
    _fields_ = [("delay", ct.c_ulonglong),
                ("action", ct.c_int)]
actions = ["drop", "output"]

print("%-18s %s" % ("DELAY(ns)", "ACTION"))

# Callback function to display information from kernel
def print_event(cpu, data, size):
    event = ct.cast(data, ct.POINTER(Data)).contents
    print("%-18d %s" % (event.delay, actions[event.action]))

b["events"].open_perf_buffer(print_event)
while True:
    b.kprobe_poll()

您需要安装密件抄送执行该脚本。 然后,它很简单:

$ sudo python trace_processing_time.py
DELAY(ns)          ACTION
97385              drop
55630              drop
38768              drop
61113              drop
10382              output
14795              output

有关此脚本如何工作的详细信息,请参见密件抄送文档 如果要支持更多的OpenFlow操作(当前仅dropoutput ),则需要对其进行更改。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM