• Kuniyuki Iwashima's avatar
    af_unix: Optimise hash table layout. · cf21b355
    Kuniyuki Iwashima authored
    Commit 6dd4142f ("Merge branch 'af_unix-per-netns-socket-hash'") and
    commit 51bae889 ("af_unix: Put pathname sockets in the global hash
    table.") changed a hash table layout.
    
      Before:
        unix_socket_table [0   - 255] : abstract & pathname sockets
                          [256 - 511] : unnamed sockets
    
      After:
        per-netns table   [0   - 255] : abstract & pathname sockets
                          [256 - 511] : unnamed sockets
        bsd_socket_table  [0   - 255] : pathname sockets (sk_bind_node)
    
    Now, while looking up sockets, we traverse the global table for the
    pathname sockets and the first half of each per-netns hash table for
    abstract sockets, where pathname sockets are also linked.  Thus, the
    more pathname sockets we have, the longer we take to look up abstract
    sockets.  This characteristic has been there before the layout change,
    but we can improve it now.
    
    This patch changes the per-netns hash table's layout so that sockets not
    requiring lookup reside in the first half and do not impact the lookup of
    abstract sockets.
    
        per-netns table   [0   - 255] : pathname & unnamed sockets
                          [256 - 511] : abstract sockets
        bsd_socket_table  [0   - 255] : pathname sockets (sk_bind_node)
    
    We have run a test that bind()s 100,000 abstract/pathname sockets for
    each, bind()s an abstract socket 100,000 times and measures the time
    on __unix_find_socket_byname().  The result shows that the patch makes
    each lookup faster.
    
      Without this patch:
        $ sudo ./funclatency -p 2278 --microseconds __unix_find_socket_byname.isra.44
         usec                : count    distribution
             0 -> 1          : 0        |                                        |
             2 -> 3          : 0        |                                        |
             4 -> 7          : 0        |                                        |
             8 -> 15         : 126      |                                        |
            16 -> 31         : 1438     |*                                       |
            32 -> 63         : 4150     |***                                     |
            64 -> 127        : 9049     |*******                                 |
           128 -> 255        : 37704    |*******************************         |
           256 -> 511        : 47533    |****************************************|
    
      With this patch:
        $ sudo ./funclatency -p 3648 --microseconds __unix_find_socket_byname.isra.46
         usec                : count    distribution
             0 -> 1          : 109      |                                        |
             2 -> 3          : 318      |                                        |
             4 -> 7          : 725      |                                        |
             8 -> 15         : 2501     |*                                       |
            16 -> 31         : 3061     |**                                      |
            32 -> 63         : 4028     |***                                     |
            64 -> 127        : 9312     |*******                                 |
           128 -> 255        : 51372    |****************************************|
           256 -> 511        : 28574    |**********************                  |
    Signed-off-by: default avatarKuniyuki Iwashima <kuniyu@amazon.com>
    Link: https://lore.kernel.org/r/20220705233715.759-1-kuniyu@amazon.comSigned-off-by: default avatarPaolo Abeni <pabeni@redhat.com>
    cf21b355
af_unix.c 87.2 KB