From: Ilya Maximets Date: Mon, 8 Feb 2016 07:38:47 +0000 (+0300) Subject: dpif-netdev: Add dpif-netdev/pmd-rxq-show appctl command. X-Git-Url: http://git.cascardo.info/?p=cascardo%2Fovs.git;a=commitdiff_plain;h=ce179f1163f947fe8dc5afa35a2cdd0756bb53a0 dpif-netdev: Add dpif-netdev/pmd-rxq-show appctl command. This command can be used to check the port/rxq assignment to pmd threads. For each pmd thread of the datapath shows list of queue-ids with port names. Additionally log message from pmd_thread_main() extended with queue-id, and type of this message changed from INFO to DBG. Signed-off-by: Ilya Maximets Acked-by: Flavio Leitner Acked-by: Daniele Di Proietto --- diff --git a/INSTALL.DPDK.md b/INSTALL.DPDK.md index a19a68576..d2865c394 100644 --- a/INSTALL.DPDK.md +++ b/INSTALL.DPDK.md @@ -272,9 +272,12 @@ Performance Tuning: NIC port0 <-> OVS <-> VM <-> OVS <-> NIC port 1 - The OVS log can be checked to confirm that the port/rxq assignment to - pmd threads is as required. This can also be checked with the following - commands: + The following command can be used to confirm that the port/rxq assignment + to pmd threads is as required: + + `ovs-appctl dpif-netdev/pmd-rxq-show` + + This can also be checked with: ``` top -H diff --git a/NEWS b/NEWS index d21b5081f..57a250ef3 100644 --- a/NEWS +++ b/NEWS @@ -15,6 +15,9 @@ Post-v2.5.0 - DPDK: * New option "n_rxq" for PMD interfaces. Old 'other_config:n-dpdk-rxqs' is no longer supported. + * New appctl command 'dpif-netdev/pmd-rxq-show' to check the port/rxq + assignment. + * Type of log messages from PMD threads changed from INFO to DBG. - ovs-benchmark: This utility has been removed due to lack of use and bitrot. - ovs-appctl: diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c index 1b9793bbf..471d0ac20 100644 --- a/lib/dpif-netdev.c +++ b/lib/dpif-netdev.c @@ -567,8 +567,9 @@ get_dp_netdev(const struct dpif *dpif) } enum pmd_info_type { - PMD_INFO_SHOW_STATS, /* show how cpu cycles are spent */ - PMD_INFO_CLEAR_STATS /* set the cycles count to 0 */ + PMD_INFO_SHOW_STATS, /* Show how cpu cycles are spent. */ + PMD_INFO_CLEAR_STATS, /* Set the cycles count to 0. */ + PMD_INFO_SHOW_RXQ /* Show poll-lists of pmd threads. */ }; static void @@ -676,6 +677,35 @@ pmd_info_clear_stats(struct ds *reply OVS_UNUSED, } } +static void +pmd_info_show_rxq(struct ds *reply, struct dp_netdev_pmd_thread *pmd) +{ + if (pmd->core_id != NON_PMD_CORE_ID) { + struct rxq_poll *poll; + const char *prev_name = NULL; + + ds_put_format(reply, "pmd thread numa_id %d core_id %u:\n", + pmd->numa_id, pmd->core_id); + + ovs_mutex_lock(&pmd->poll_mutex); + LIST_FOR_EACH (poll, node, &pmd->poll_list) { + const char *name = netdev_get_name(poll->port->netdev); + + if (!prev_name || strcmp(name, prev_name)) { + if (prev_name) { + ds_put_cstr(reply, "\n"); + } + ds_put_format(reply, "\tport: %s\tqueue-id:", + netdev_get_name(poll->port->netdev)); + } + ds_put_format(reply, " %d", netdev_rxq_get_queue_id(poll->rx)); + prev_name = name; + } + ovs_mutex_unlock(&pmd->poll_mutex); + ds_put_cstr(reply, "\n"); + } +} + static void dpif_netdev_pmd_info(struct unixctl_conn *conn, int argc, const char *argv[], void *aux) @@ -702,22 +732,26 @@ dpif_netdev_pmd_info(struct unixctl_conn *conn, int argc, const char *argv[], } CMAP_FOR_EACH (pmd, node, &dp->poll_threads) { - unsigned long long stats[DP_N_STATS]; - uint64_t cycles[PMD_N_CYCLES]; - int i; + if (type == PMD_INFO_SHOW_RXQ) { + pmd_info_show_rxq(&reply, pmd); + } else { + unsigned long long stats[DP_N_STATS]; + uint64_t cycles[PMD_N_CYCLES]; + int i; - /* Read current stats and cycle counters */ - for (i = 0; i < ARRAY_SIZE(stats); i++) { - atomic_read_relaxed(&pmd->stats.n[i], &stats[i]); - } - for (i = 0; i < ARRAY_SIZE(cycles); i++) { - atomic_read_relaxed(&pmd->cycles.n[i], &cycles[i]); - } + /* Read current stats and cycle counters */ + for (i = 0; i < ARRAY_SIZE(stats); i++) { + atomic_read_relaxed(&pmd->stats.n[i], &stats[i]); + } + for (i = 0; i < ARRAY_SIZE(cycles); i++) { + atomic_read_relaxed(&pmd->cycles.n[i], &cycles[i]); + } - if (type == PMD_INFO_CLEAR_STATS) { - pmd_info_clear_stats(&reply, pmd, stats, cycles); - } else if (type == PMD_INFO_SHOW_STATS) { - pmd_info_show_stats(&reply, pmd, stats, cycles); + if (type == PMD_INFO_CLEAR_STATS) { + pmd_info_clear_stats(&reply, pmd, stats, cycles); + } else if (type == PMD_INFO_SHOW_STATS) { + pmd_info_show_stats(&reply, pmd, stats, cycles); + } } } @@ -731,7 +765,8 @@ static int dpif_netdev_init(void) { static enum pmd_info_type show_aux = PMD_INFO_SHOW_STATS, - clear_aux = PMD_INFO_CLEAR_STATS; + clear_aux = PMD_INFO_CLEAR_STATS, + poll_aux = PMD_INFO_SHOW_RXQ; unixctl_command_register("dpif-netdev/pmd-stats-show", "[dp]", 0, 1, dpif_netdev_pmd_info, @@ -739,6 +774,9 @@ dpif_netdev_init(void) unixctl_command_register("dpif-netdev/pmd-stats-clear", "[dp]", 0, 1, dpif_netdev_pmd_info, (void *)&clear_aux); + unixctl_command_register("dpif-netdev/pmd-rxq-show", "[dp]", + 0, 1, dpif_netdev_pmd_info, + (void *)&poll_aux); return 0; } @@ -2684,8 +2722,9 @@ reload: /* List port/core affinity */ for (i = 0; i < poll_cnt; i++) { - VLOG_INFO("Core %d processing port \'%s\'\n", pmd->core_id, - netdev_get_name(poll_list[i].port->netdev)); + VLOG_DBG("Core %d processing port \'%s\' with queue-id %d\n", + pmd->core_id, netdev_get_name(poll_list[i].port->netdev), + netdev_rxq_get_queue_id(poll_list[i].rx)); } /* Signal here to make sure the pmd finishes diff --git a/lib/netdev.c b/lib/netdev.c index e27f85436..ee92e0115 100644 --- a/lib/netdev.c +++ b/lib/netdev.c @@ -1815,6 +1815,12 @@ netdev_rxq_get_name(const struct netdev_rxq *rx) return netdev_get_name(netdev_rxq_get_netdev(rx)); } +int +netdev_rxq_get_queue_id(const struct netdev_rxq *rx) +{ + return rx->queue_id; +} + static void restore_all_flags(void *aux OVS_UNUSED) { diff --git a/lib/netdev.h b/lib/netdev.h index 8a7f68004..a81989e5d 100644 --- a/lib/netdev.h +++ b/lib/netdev.h @@ -175,6 +175,7 @@ int netdev_rxq_open(struct netdev *, struct netdev_rxq **, int id); void netdev_rxq_close(struct netdev_rxq *); const char *netdev_rxq_get_name(const struct netdev_rxq *); +int netdev_rxq_get_queue_id(const struct netdev_rxq *); int netdev_rxq_recv(struct netdev_rxq *rx, struct dp_packet **buffers, int *cnt); diff --git a/vswitchd/ovs-vswitchd.8.in b/vswitchd/ovs-vswitchd.8.in index 49c2a409d..b628f2f21 100644 --- a/vswitchd/ovs-vswitchd.8.in +++ b/vswitchd/ovs-vswitchd.8.in @@ -256,6 +256,9 @@ measuring infrastructure. Resets to zero the per pmd thread performance numbers shown by the \fBdpif-netdev/pmd-stats-show\fR command. It will NOT reset datapath or bridge statistics, only the values shown by the above command. +.IP "\fBdpif-netdev/pmd-rxq-show\fR [\fIdp\fR]" +For each pmd thread of the datapath \fIdp\fR shows list of queue-ids with +port names, which this thread polls. . .so ofproto/ofproto-dpif-unixctl.man .so ofproto/ofproto-unixctl.man