Skip to content
  • Davidlohr Bueso's avatar
    perf bench: Add epoll parallel epoll_wait benchmark · 121dd9ea
    Davidlohr Bueso authored
    
    
    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: default avatarDavidlohr Bueso <dbueso@suse.de>
    Tested-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
    Cc: Andrew Morton <akpm@linux-foundation.org>
    Cc: Davidlohr Bueso <dbueso@suse.de>
    Cc: Jason Baron <jbaron@akamai.com> <jbaron@akamai.com>
    Link: http://lkml.kernel.org/r/20181106152226.20883-2-dave@stgolabs.net
    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: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
    121dd9ea