• Kuniyuki Iwashima's avatar
    af_unix: Try to run GC async. · d9f21b36
    Kuniyuki Iwashima authored
    If more than 16000 inflight AF_UNIX sockets exist and the garbage
    collector is not running, unix_(dgram|stream)_sendmsg() call unix_gc().
    Also, they wait for unix_gc() to complete.
    
    In unix_gc(), all inflight AF_UNIX sockets are traversed at least once,
    and more if they are the GC candidate.  Thus, sendmsg() significantly
    slows down with too many inflight AF_UNIX sockets.
    
    However, if a process sends data with no AF_UNIX FD, the sendmsg() call
    does not need to wait for GC.  After this change, only the process that
    meets the condition below will be blocked under such a situation.
    
      1) cmsg contains AF_UNIX socket
      2) more than 32 AF_UNIX sent by the same user are still inflight
    
    Note that even a sendmsg() call that does not meet the condition but has
    AF_UNIX FD will be blocked later in unix_scm_to_skb() by the spinlock,
    but we allow that as a bonus for sane users.
    
    The results below are the time spent in unix_dgram_sendmsg() sending 1
    byte of data with no FD 4096 times on a host where 32K inflight AF_UNIX
    sockets exist.
    
    Without series: the sane sendmsg() needs to wait gc unreasonably.
    
      $ sudo /usr/share/bcc/tools/funclatency -p 11165 unix_dgram_sendmsg
      Tracing 1 functions for "unix_dgram_sendmsg"... Hit Ctrl-C to end.
      ^C
           nsecs               : count     distribution
      [...]
          524288 -> 1048575    : 0        |                                        |
         1048576 -> 2097151    : 3881     |****************************************|
         2097152 -> 4194303    : 214      |**                                      |
         4194304 -> 8388607    : 1        |                                        |
    
      avg = 1825567 nsecs, total: 7477526027 nsecs, count: 4096
    
    With series: the sane sendmsg() can finish much faster.
    
      $ sudo /usr/share/bcc/tools/funclatency -p 8702  unix_dgram_sendmsg
      Tracing 1 functions for "unix_dgram_sendmsg"... Hit Ctrl-C to end.
      ^C
           nsecs               : count     distribution
      [...]
             128 -> 255        : 0        |                                        |
             256 -> 511        : 4092     |****************************************|
             512 -> 1023       : 2        |                                        |
            1024 -> 2047       : 0        |                                        |
            2048 -> 4095       : 0        |                                        |
            4096 -> 8191       : 1        |                                        |
            8192 -> 16383      : 1        |                                        |
    
      avg = 410 nsecs, total: 1680510 nsecs, count: 4096
    Signed-off-by: default avatarKuniyuki Iwashima <kuniyu@amazon.com>
    Link: https://lore.kernel.org/r/20240123170856.41348-6-kuniyu@amazon.comSigned-off-by: default avatarJakub Kicinski <kuba@kernel.org>
    d9f21b36
scm.h 5.22 KB