只要你正在使用 的 Open vSwitch的内核数据路径 强> ,你应该能够使用通常的方法检索每个数据包的处理延迟 的 Linux追踪 强> 工具包。
下面是使用BPF基础结构的示例(需要Linux v4.4 +)和 密件抄送工具包 (我的版本是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操作,则需要更改它(仅限 drop 和 output 目前)。
drop
output