• Namhyung Kim's avatar
    perf lock contention: Add -o/--lock-owner option · 3477f079
    Namhyung Kim authored
    When there're many lock contentions in the system, people sometimes want
    to know who caused the contention, IOW who's the owner of the locks.
    
    The -o/--lock-owner option tries to follow the lock owners for the
    contended mutexes and rwsems from BPF, and then attributes the
    contention time to the owner instead of the waiter.  It's a best effort
    approach to get the owner info at the time of the contention and doesn't
    guarantee to have the precise tracking of owners if it's changing over
    time.
    
    Currently it only handles mutex and rwsem that have owner field in their
    struct and it basically points to a task_struct that owns the lock at
    the moment.
    
    Technically its type is atomic_long_t and it comes with some LSB bits
    used for other meanings.  So it needs to clear them when casting it to a
    pointer to task_struct.
    
    Also the atomic_long_t is a typedef of the atomic 32 or 64 bit types
    depending on arch which is a wrapper struct for the counter value.  I'm
    not aware of proper ways to access those kernel atomic types from BPF so
    I just read the internal counter value directly.  Please let me know if
    there's a better way.
    
    When -o/--lock-owner option is used, it goes to the task aggregation
    mode like -t/--threads option does.  However it cannot get the owner for
    other lock types like spinlock and sometimes even for mutex.
    
      $ sudo ./perf lock con -abo -- ./perf bench sched pipe
      # Running 'sched/pipe' benchmark:
      # Executed 1000000 pipe operations between two processes
    
           Total time: 4.766 [sec]
    
             4.766540 usecs/op
               209795 ops/sec
       contended   total wait     max wait     avg wait          pid   owner
    
             403    565.32 us     26.81 us      1.40 us           -1   Unknown
               4     27.99 us      8.57 us      7.00 us      1583145   sched-pipe
               1      8.25 us      8.25 us      8.25 us      1583144   sched-pipe
               1      2.03 us      2.03 us      2.03 us         5068   chrome
    
    As you can see, the owner is unknown for the most cases.  But if we
    filter only for the mutex locks, it'd more likely get the onwers.
    
      $ sudo ./perf lock con -abo -Y mutex -- ./perf bench sched pipe
      # Running 'sched/pipe' benchmark:
      # Executed 1000000 pipe operations between two processes
    
           Total time: 4.910 [sec]
    
             4.910435 usecs/op
               203647 ops/sec
       contended   total wait     max wait     avg wait          pid   owner
    
               2     15.50 us      8.29 us      7.75 us      1582852   sched-pipe
               7      7.20 us      2.47 us      1.03 us           -1   Unknown
               1      6.74 us      6.74 us      6.74 us      1582851   sched-pipe
    Signed-off-by: default avatarNamhyung Kim <namhyung@kernel.org>
    Cc: Adrian Hunter <adrian.hunter@intel.com>
    Cc: Boqun Feng <boqun.feng@gmail.com>
    Cc: Davidlohr Bueso <dave@stgolabs.net>
    Cc: Hao Luo <haoluo@google.com>
    Cc: Ian Rogers <irogers@google.com>
    Cc: Ingo Molnar <mingo@kernel.org>
    Cc: Jiri Olsa <jolsa@kernel.org>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Song Liu <song@kernel.org>
    Cc: Waiman Long <longman@redhat.com>
    Cc: Will Deacon <will@kernel.org>
    Cc: bpf@vger.kernel.org
    Link: https://lore.kernel.org/r/20230207002403.63590-3-namhyung@kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
    3477f079
lock-contention.h 3.77 KB