[ovs-dev] [PATCH v8] netdev-dpdk: Increase pmd thread priority

Aaron Conole aconole at redhat.com
Tue Jan 3 20:08:11 UTC 2017


Bhanuprakash Bodireddy <bhanuprakash.bodireddy at intel.com> writes:

> Increase the DPDK pmd thread scheduling priority by lowering the nice
> value. This will advise the kernel scheduler to prioritize pmd thread
> over other processes.
>
> Signed-off-by: Bhanuprakash Bodireddy <bhanuprakash.bodireddy at intel.com>
> ---

Sorry for jumping into this so late.  Is there a measured benefit to
this patch?  Do you have a test case to reproduce the effect you're
seeing?  Might it be better to write up documentation for the user
describing chrt/nice/renice utilities?

> v7->v8:
> * Rebase
> * Update the documentation file @Documentation/intro/install/dpdk-advanced.rst
>
> v6->v7:
> * Remove realtime scheduling policy logic.
> * Increase pmd thread scheduling priority by lowering nice value to -20.
> * Update doc accordingly.
>
> v5->v6:
> * Prohibit spawning pmd thread on the lowest core in dpdk-lcore-mask if
>   lcore-mask and pmd-mask affinity are identical.
> * Updated Note section in INSTALL.DPDK-ADVANCED doc.
> * Tested below cases to verify system stability with pmd priority patch
>
> v4->v5:
> * Reword Note section in DPDK-ADVANCED.md
>
> v3->v4:
> * Document update
> * Use ovs_strerror for reporting errors in lib-numa.c
>
> v2->v3:
> * Move set_priority() function to lib/ovs-numa.c
> * Apply realtime scheduling policy and priority to pmd thread only if
>   pmd-cpu-mask is passed.
> * Update INSTALL.DPDK-ADVANCED.
>
> v1->v2:
> * Removed #ifdef and introduced dummy function "pmd_thread_setpriority"
>   in netdev-dpdk.h
> * Rebase
>
>  Documentation/intro/install/dpdk-advanced.rst |  8 +++++++-
>  lib/dpif-netdev.c                             |  4 ++++
>  lib/ovs-numa.c                                | 19 +++++++++++++++++++
>  lib/ovs-numa.h                                |  1 +
>  4 files changed, 31 insertions(+), 1 deletion(-)
>
> diff --git a/Documentation/intro/install/dpdk-advanced.rst b/Documentation/intro/install/dpdk-advanced.rst
> index 44d1cd7..67815ac 100644
> --- a/Documentation/intro/install/dpdk-advanced.rst
> +++ b/Documentation/intro/install/dpdk-advanced.rst
> @@ -238,7 +238,8 @@ affinitized accordingly.
>    to be affinitized to isolated cores for optimum performance.
>  
>    By setting a bit in the mask, a pmd thread is created and pinned to the
> -  corresponding CPU core. e.g. to run a pmd thread on core 2::
> +  corresponding CPU core and the nice value set to '-20'.
> +  e.g. to run a pmd thread on core 2::
>  
>        $ ovs-vsctl set Open_vSwitch . other_config:pmd-cpu-mask=0x4
>  
> @@ -278,6 +279,11 @@ improvements as there will be more total CPU occupancy available::
>  
>      NIC port0 <-> OVS <-> VM <-> OVS <-> NIC port 1
>  
> +  .. note::
> +    It is recommended that the OVS control thread and pmd thread shouldn't be
> +    pinned to the same core i.e 'dpdk-lcore-mask' and 'pmd-cpu-mask' cpu mask
> +    settings should be non-overlapping.
> +
>  DPDK Physical Port Rx Queues
>  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>  
> diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c
> index 0b73056..f58a855 100644
> --- a/lib/dpif-netdev.c
> +++ b/lib/dpif-netdev.c
> @@ -3120,6 +3120,10 @@ pmd_thread_main(void *f_)
>      ovs_numa_thread_setaffinity_core(pmd->core_id);
>      dpdk_set_lcore_id(pmd->core_id);
>      poll_cnt = pmd_load_queues_and_ports(pmd, &poll_list);
> +
> +    /* Set pmd thread's nice value to -20 */
> +#define MIN_NICE -20
> +    ovs_numa_thread_setpriority(MIN_NICE);
>  reload:
>      emc_cache_init(&pmd->flow_cache);
>  
> diff --git a/lib/ovs-numa.c b/lib/ovs-numa.c
> index e1e7068..d52c517 100644
> --- a/lib/ovs-numa.c
> +++ b/lib/ovs-numa.c
> @@ -23,6 +23,7 @@
>  #include <dirent.h>
>  #include <stddef.h>
>  #include <string.h>
> +#include <sys/resource.h>
>  #include <sys/types.h>
>  #include <unistd.h>
>  #endif /* __linux__ */
> @@ -620,3 +621,21 @@ int ovs_numa_thread_setaffinity_core(unsigned core_id OVS_UNUSED)
>      return EOPNOTSUPP;
>  #endif /* __linux__ */
>  }
> +
> +void
> +ovs_numa_thread_setpriority(int nice OVS_UNUSED)
> +{
> +    if (dummy_numa) {
> +        return;
> +    }
> +
> +#ifndef _WIN32
> +    int err;
> +    err = setpriority(PRIO_PROCESS, 0, nice);
> +    if (err) {
> +        VLOG_ERR("Thread priority error %s",ovs_strerror(err));
> +    }
> +#else
> +    return EOPNOTSUPP;
> +#endif
> +}
> diff --git a/lib/ovs-numa.h b/lib/ovs-numa.h
> index be836b2..3ce13c7 100644
> --- a/lib/ovs-numa.h
> +++ b/lib/ovs-numa.h
> @@ -56,6 +56,7 @@ void ovs_numa_unpin_core(unsigned core_id);
>  struct ovs_numa_dump *ovs_numa_dump_cores_on_numa(int numa_id);
>  void ovs_numa_dump_destroy(struct ovs_numa_dump *);
>  int ovs_numa_thread_setaffinity_core(unsigned core_id);
> +void ovs_numa_thread_setpriority(int nice);
>  
>  #define FOR_EACH_CORE_ON_NUMA(ITER, DUMP)                    \
>      LIST_FOR_EACH((ITER), list_node, &(DUMP)->dump)


More information about the dev mailing list