Skip to content

Commit 121dd9e

Browse files
Davidlohr Buesoacmel
authored andcommitted
perf bench: Add epoll parallel epoll_wait benchmark
This program benchmarks concurrent epoll_wait(2) for file descriptors that are monitored with with EPOLLIN along various semantics, by a single epoll instance. Such conditions can be found when using single/combined or multiple queuing when load balancing. Each thread has a number of private, nonblocking file descriptors, referred to as fdmap. A writer thread will constantly be writing to the fdmaps of all threads, minimizing each threads's chances of epoll_wait not finding any ready read events and blocking as this is not what we want to stress. Full details in the start of the C file. Committer testing: # perf bench Usage: perf bench [<common options>] <collection> <benchmark> [<options>] # List of all available benchmark collections: sched: Scheduler and IPC benchmarks mem: Memory access benchmarks numa: NUMA scheduling and MM benchmarks futex: Futex stressing benchmarks epoll: Epoll stressing benchmarks all: All benchmarks # perf bench epoll # List of available benchmarks for collection 'epoll': wait: Benchmark epoll concurrent epoll_waits all: Run all futex benchmarks # perf bench epoll wait # Running 'epoll/wait' benchmark: Run summary [PID 19295]: 3 threads monitoring on 64 file-descriptors for 8 secs. [thread 0] fdmap: 0xdaa650 ... 0xdaa74c [ 328241 ops/sec ] [thread 1] fdmap: 0xdaa900 ... 0xdaa9fc [ 351695 ops/sec ] [thread 2] fdmap: 0xdaabb0 ... 0xdaacac [ 381423 ops/sec ] Averaged 353786 operations/sec (+- 4.35%), total secs = 8 # Committer notes: Fix the build on debian:experimental-x-mips, debian:experimental-x-mipsel and others: CC /tmp/build/perf/bench/epoll-wait.o bench/epoll-wait.c: In function 'writerfn': bench/epoll-wait.c:399:12: error: format '%ld' expects argument of type 'long int', but argument 2 has type 'size_t' {aka 'unsigned int'} [-Werror=format=] printinfo("exiting writer-thread (total full-loops: %ld)\n", iter); ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~ bench/epoll-wait.c:86:31: note: in definition of macro 'printinfo' do { if (__verbose) { printf(fmt, ## arg); fflush(stdout); } } while (0) ^~~ cc1: all warnings being treated as errors Signed-off-by: Davidlohr Bueso <[email protected]> Tested-by: Arnaldo Carvalho de Melo <[email protected]> Cc: Andrew Morton <[email protected]> Cc: Davidlohr Bueso <[email protected]> Cc: Jason Baron <[email protected]> <[email protected]> Link: http://lkml.kernel.org/r/[email protected] Link: http://lkml.kernel.org/r/20181106182349.thdkpvshkna5vd7o@linux-r8p5> [ Applied above fixup as per Davidlohr's request ] [ Use inttypes.h to print rlim_t fields, fixing the build on Alpine Linux / musl libc ] [ Check if eventfd() is available, i.e. if HAVE_EVENTFD is defined ] Signed-off-by: Arnaldo Carvalho de Melo <[email protected]>
1 parent 11c6cbe commit 121dd9e

File tree

5 files changed

+563
-0
lines changed

5 files changed

+563
-0
lines changed

tools/perf/Documentation/perf-bench.txt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,9 @@ SUBSYSTEM
5858
'futex'::
5959
Futex stressing benchmarks.
6060

61+
'epoll'::
62+
Eventpoll (epoll) stressing benchmarks.
63+
6164
'all'::
6265
All benchmark subsystems.
6366

@@ -203,6 +206,10 @@ Suite for evaluating requeue calls.
203206
*lock-pi*::
204207
Suite for evaluating futex lock_pi calls.
205208

209+
SUITES FOR 'epoll'
210+
~~~~~~~~~~~~~~~~~~
211+
*wait*::
212+
Suite for evaluating concurrent epoll_wait calls.
206213

207214
SEE ALSO
208215
--------

tools/perf/bench/Build

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ perf-y += futex-wake-parallel.o
77
perf-y += futex-requeue.o
88
perf-y += futex-lock-pi.o
99

10+
perf-y += epoll-wait.o
11+
1012
perf-$(CONFIG_X86_64) += mem-memcpy-x86-64-lib.o
1113
perf-$(CONFIG_X86_64) += mem-memcpy-x86-64-asm.o
1214
perf-$(CONFIG_X86_64) += mem-memset-x86-64-asm.o

tools/perf/bench/bench.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@ int bench_futex_requeue(int argc, const char **argv);
3838
/* pi futexes */
3939
int bench_futex_lock_pi(int argc, const char **argv);
4040

41+
int bench_epoll_wait(int argc, const char **argv);
42+
4143
#define BENCH_FORMAT_DEFAULT_STR "default"
4244
#define BENCH_FORMAT_DEFAULT 0
4345
#define BENCH_FORMAT_SIMPLE_STR "simple"

0 commit comments

Comments
 (0)