• Stuart Hayes's avatar
    nvme_core: scan namespaces asynchronously · 4e893ca8
    Stuart Hayes authored
    
    
    Use async function calls to make namespace scanning happen in parallel.
    
    Without the patch, NVME namespaces are scanned serially, so it can take
    a long time for all of a controller's namespaces to become available,
    especially with a slower (TCP) interface with large number of
    namespaces.
    
    It is not uncommon to have large numbers (hundreds or thousands) of
    namespaces on nvme-of with storage servers.
    
    The time it took for all namespaces to show up after connecting (via
    TCP) to a controller with 1002 namespaces was measured on one system:
    
    network latency   without patch   with patch
         0                 6s            1s
        50ms             210s           10s
       100ms             417s           18s
    
    Measurements taken on another system show the effect of the patch on the
    time nvme_scan_work() took to complete, when connecting to a linux
    nvme-of target with varying numbers of namespaces, on a network of
    400us.
    
    namespaces    without patch   with patch
         1            16ms           14ms
         2            24ms           16ms
         4            49ms           22ms
         8           101ms           33ms
        16           207ms           56ms
       100           1.4s           0.6s
      1000          12.9s           2.0s
    
    On the same system, connecting to a local PCIe NVMe drive (a Samsung
    PM1733) instead of a network target:
    
    namespaces    without patch   with patch
         1            13ms           12ms
         2            41ms           13ms
    Signed-off-by: default avatarStuart Hayes <stuart.w.hayes@gmail.com>
    Reviewed-by: default avatarSagi Grimberg <sagi@grimberg.me>
    4e893ca8
core.c 135 KB