• Jie Wang's avatar
    net: page_pool: optimize page pool page allocation in NUMA scenario · d810d367
    Jie Wang authored
    Currently NIC packet receiving performance based on page pool deteriorates
    occasionally. To analysis the causes of this problem page allocation stats
    are collected. Here are the stats when NIC rx performance deteriorates:
    
    bandwidth(Gbits/s)		16.8		6.91
    rx_pp_alloc_fast		13794308	21141869
    rx_pp_alloc_slow		108625		166481
    rx_pp_alloc_slow_h		0		0
    rx_pp_alloc_empty		8192		8192
    rx_pp_alloc_refill		0		0
    rx_pp_alloc_waive		100433		158289
    rx_pp_recycle_cached		0		0
    rx_pp_recycle_cache_full	0		0
    rx_pp_recycle_ring		362400		420281
    rx_pp_recycle_ring_full		6064893		9709724
    rx_pp_recycle_released_ref	0		0
    
    The rx_pp_alloc_waive count indicates that a large number of pages' numa
    node are inconsistent with the NIC device numa node. Therefore these pages
    can't be reused by the page pool. As a result, many new pages would be
    allocated by __page_pool_alloc_pages_slow which is time consuming. This
    causes the NIC rx performance fluctuations.
    
    The main reason of huge numa mismatch pages in page pool is that page pool
    uses alloc_pages_bulk_array to allocate original pages. This function is
    not suitable for page allocation in NUMA scenario. So this patch uses
    alloc_pages_bulk_array_node which has a NUMA id input parameter to ensure
    the NUMA consistent between NIC device and allocated pages.
    
    Repeated NIC rx performance tests are performed 40 times. NIC rx bandwidth
    is higher and more stable compared to the datas above. Here are three test
    stats, the rx_pp_alloc_waive count is zero and rx_pp_alloc_slow which
    indicates pages allocated from slow patch is relatively low.
    
    bandwidth(Gbits/s)		93		93.9		93.8
    rx_pp_alloc_fast		60066264	61266386	60938254
    rx_pp_alloc_slow		16512		16517		16539
    rx_pp_alloc_slow_ho		0		0		0
    rx_pp_alloc_empty		16512		16517		16539
    rx_pp_alloc_refill		473841		481910		481585
    rx_pp_alloc_waive		0		0		0
    rx_pp_recycle_cached		0		0		0
    rx_pp_recycle_cache_full	0		0		0
    rx_pp_recycle_ring		29754145	30358243	30194023
    rx_pp_recycle_ring_full		0		0		0
    rx_pp_recycle_released_ref	0		0		0
    Signed-off-by: default avatarJie Wang <wangjie125@huawei.com>
    Acked-by: default avatarJesper Dangaard Brouer <brouer@redhat.com>
    Acked-by: default avatarIlias Apalodimas <ilias.apalodimas@linaro.org>
    Link: https://lore.kernel.org/r/20220705113515.54342-1-huangguangbin2@huawei.comSigned-off-by: default avatarJakub Kicinski <kuba@kernel.org>
    d810d367
page_pool.c 23.7 KB