samples/bpf: replace broken overhead microbenchmark with fib_table_lookup
The test_overhead bpf program is designed to compare performance between tracepoint and kprobe. Initially it used task_rename and urandom_read tracepoint. However, commit14c174633f
("random: remove unused tracepoints") removed urandom_read tracepoint, and for this reason the test_overhead got broken. This commit introduces new microbenchmark using fib_table_lookup. This microbenchmark sends UDP packets to localhost in order to invoke fib_table_lookup. In a nutshell: fd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); addr.sin_addr.s_addr = inet_addr(DUMMY_IP); addr.sin_port = htons(DUMMY_PORT); for() { sendto(fd, buf, strlen(buf), 0, (struct sockaddr *)&addr, sizeof(addr)); } on 4 cpus in parallel: lookup per sec base (no tracepoints, no kprobes) 381k with kprobe at fib_table_lookup() 325k with tracepoint at fib:fib_table_lookup 330k with raw_tracepoint at fib:fib_table_lookup 365k Fixes:14c174633f
("random: remove unused tracepoints") Signed-off-by: Daniel T. Lee <danieltimlee@gmail.com> Link: https://lore.kernel.org/r/20230115071613.125791-6-danieltimlee@gmail.com Signed-off-by: Alexei Starovoitov <ast@kernel.org>
This commit is contained in:
parent
31b12a4159
commit
58e975d014
|
@ -39,7 +39,7 @@ int prog(struct pt_regs *ctx)
|
|||
return 0;
|
||||
}
|
||||
|
||||
SEC("kprobe/urandom_read")
|
||||
SEC("kprobe/fib_table_lookup")
|
||||
int prog2(struct pt_regs *ctx)
|
||||
{
|
||||
return 0;
|
||||
|
|
|
@ -9,7 +9,7 @@ int prog(struct bpf_raw_tracepoint_args *ctx)
|
|||
return 0;
|
||||
}
|
||||
|
||||
SEC("raw_tracepoint/urandom_read")
|
||||
SEC("raw_tracepoint/fib_table_lookup")
|
||||
int prog2(struct bpf_raw_tracepoint_args *ctx)
|
||||
{
|
||||
return 0;
|
||||
|
|
|
@ -22,15 +22,27 @@ int prog(struct task_rename *ctx)
|
|||
return 0;
|
||||
}
|
||||
|
||||
/* from /sys/kernel/debug/tracing/events/random/urandom_read/format */
|
||||
struct urandom_read {
|
||||
/* from /sys/kernel/debug/tracing/events/fib/fib_table_lookup/format */
|
||||
struct fib_table_lookup {
|
||||
__u64 pad;
|
||||
int got_bits;
|
||||
int pool_left;
|
||||
int input_left;
|
||||
__u32 tb_id;
|
||||
int err;
|
||||
int oif;
|
||||
int iif;
|
||||
__u8 proto;
|
||||
__u8 tos;
|
||||
__u8 scope;
|
||||
__u8 flags;
|
||||
__u8 src[4];
|
||||
__u8 dst[4];
|
||||
__u8 gw4[4];
|
||||
__u8 gw6[16];
|
||||
__u16 sport;
|
||||
__u16 dport;
|
||||
char name[16];
|
||||
};
|
||||
SEC("tracepoint/random/urandom_read")
|
||||
int prog2(struct urandom_read *ctx)
|
||||
SEC("tracepoint/fib/fib_table_lookup")
|
||||
int prog2(struct fib_table_lookup *ctx)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -11,6 +11,8 @@
|
|||
#include <unistd.h>
|
||||
#include <assert.h>
|
||||
#include <sys/wait.h>
|
||||
#include <sys/socket.h>
|
||||
#include <arpa/inet.h>
|
||||
#include <stdlib.h>
|
||||
#include <signal.h>
|
||||
#include <linux/bpf.h>
|
||||
|
@ -20,6 +22,8 @@
|
|||
#include <bpf/libbpf.h>
|
||||
|
||||
#define MAX_CNT 1000000
|
||||
#define DUMMY_IP "127.0.0.1"
|
||||
#define DUMMY_PORT 80
|
||||
|
||||
static struct bpf_link *links[2];
|
||||
static struct bpf_object *obj;
|
||||
|
@ -35,8 +39,8 @@ static __u64 time_get_ns(void)
|
|||
|
||||
static void test_task_rename(int cpu)
|
||||
{
|
||||
__u64 start_time;
|
||||
char buf[] = "test\n";
|
||||
__u64 start_time;
|
||||
int i, fd;
|
||||
|
||||
fd = open("/proc/self/comm", O_WRONLY|O_TRUNC);
|
||||
|
@ -57,26 +61,32 @@ static void test_task_rename(int cpu)
|
|||
close(fd);
|
||||
}
|
||||
|
||||
static void test_urandom_read(int cpu)
|
||||
static void test_fib_table_lookup(int cpu)
|
||||
{
|
||||
struct sockaddr_in addr;
|
||||
char buf[] = "test\n";
|
||||
__u64 start_time;
|
||||
char buf[4];
|
||||
int i, fd;
|
||||
|
||||
fd = open("/dev/urandom", O_RDONLY);
|
||||
fd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
|
||||
if (fd < 0) {
|
||||
printf("couldn't open /dev/urandom\n");
|
||||
printf("couldn't open socket\n");
|
||||
exit(1);
|
||||
}
|
||||
memset((char *)&addr, 0, sizeof(addr));
|
||||
addr.sin_addr.s_addr = inet_addr(DUMMY_IP);
|
||||
addr.sin_port = htons(DUMMY_PORT);
|
||||
addr.sin_family = AF_INET;
|
||||
start_time = time_get_ns();
|
||||
for (i = 0; i < MAX_CNT; i++) {
|
||||
if (read(fd, buf, sizeof(buf)) < 0) {
|
||||
printf("failed to read from /dev/urandom: %s\n", strerror(errno));
|
||||
if (sendto(fd, buf, strlen(buf), 0,
|
||||
(struct sockaddr *)&addr, sizeof(addr)) < 0) {
|
||||
printf("failed to start ping: %s\n", strerror(errno));
|
||||
close(fd);
|
||||
return;
|
||||
}
|
||||
}
|
||||
printf("urandom_read:%d: %lld events per sec\n",
|
||||
printf("fib_table_lookup:%d: %lld events per sec\n",
|
||||
cpu, MAX_CNT * 1000000000ll / (time_get_ns() - start_time));
|
||||
close(fd);
|
||||
}
|
||||
|
@ -92,7 +102,7 @@ static void loop(int cpu, int flags)
|
|||
if (flags & 1)
|
||||
test_task_rename(cpu);
|
||||
if (flags & 2)
|
||||
test_urandom_read(cpu);
|
||||
test_fib_table_lookup(cpu);
|
||||
}
|
||||
|
||||
static void run_perf_test(int tasks, int flags)
|
||||
|
|
Loading…
Reference in New Issue