我试图评估一种路由技术,由我实现的迷你,开放vSwitch和Ryu控制器。但是目前我还不知道交换机内数据包处理时间的测量技术。我可以测量探测消息处理时间,因为这些packet_in发生,并报告给控制器程序。但是,如何测量那些不会通过交换机向控制器报告其存在的数据包的处理时间(不会发生packet_in)?也许ovs-ofctl命令有一些选项可以报告我的时间。但还是不知道该怎么做。在这种情况下请帮助我。我在网上没有足够的资源。提前谢谢你的帮助。
发布于 2018-04-15 13:15:51
只要您正在使用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()执行此脚本需要安装bcc。然后,它就像:
$ sudo python trace_processing_time.py
DELAY(ns) ACTION
97385 drop
55630 drop
38768 drop
61113 drop
10382 output
14795 output有关此脚本如何工作的详细信息,请参阅bcc文件。如果希望支持更多的OpenFlow操作(目前只支持drop和output ),则需要对其进行更改。
https://stackoverflow.com/questions/49737505
复制相似问题