Hi Kevin, This patch doesn't apply on top of my "Refactor PMD stats and cycle counting" v9 (as we discussed when outlining the strategy for merging contributions 1&2 and 3a-c) nor does the my series apply easily on top of yours. Both cases seem to require non-trivial rebasing.
Would it be possible for you to rebase your patches on my v9 to make use of the refactored cycle counting? I believe that makes more sense than refactoring your cycle counting afterwards. BR, Jan > -----Original Message----- > From: Kevin Traynor [mailto:ktray...@redhat.com] > Sent: Thursday, 11 January, 2018 15:32 > To: d...@openvswitch.org; Jan Scheurich <jan.scheur...@ericsson.com>; > ian.sto...@intel.com; i.maxim...@samsung.com; > billy.o.mah...@intel.com; acon...@redhat.com; f...@redhat.com > Cc: Kevin Traynor <ktray...@redhat.com> > Subject: [PATCH v2 1/2] dpif-netdev: Add percentage of pmd/core used by each > rxq. > > It is based on the length of history that is stored about an > rxq (currently 1 min). > > $ ovs-appctl dpif-netdev/pmd-rxq-show > pmd thread numa_id 0 core_id 4: > isolated : false > port: dpdkphy1 queue-id: 0 pmd usage: 70 % > port: dpdkvhost0 queue-id: 0 pmd usage: 0 % > pmd thread numa_id 0 core_id 6: > isolated : false > port: dpdkphy0 queue-id: 0 pmd usage: 64 % > port: dpdkvhost1 queue-id: 0 pmd usage: 0 % > > These values are what would be used as part of rxq to pmd > assignment due to a reconfiguration event e.g. adding pmds, > adding rxqs or with the command: > > ovs-appctl dpif-netdev/pmd-rxq-rebalance > > Signed-off-by: Jan Scheurich <jan.scheur...@ericsson.com> > Co-authored-by: Jan Scheurich <jan.scheur...@ericsson.com> > Signed-off-by: Kevin Traynor <ktray...@redhat.com> > --- > > V2: > - Re-worked to calculate and store cycles needed for stats directly in pmd. > > Documentation/howto/dpdk.rst | 11 +++++++++ > NEWS | 1 + > lib/dpif-netdev.c | 53 > +++++++++++++++++++++++++++++++++----------- > tests/pmd.at | 51 +++++++++++++++++++++++++++++++----------- > 4 files changed, 90 insertions(+), 26 deletions(-) > > diff --git a/Documentation/howto/dpdk.rst b/Documentation/howto/dpdk.rst > index 587aaed..40f9d96 100644 > --- a/Documentation/howto/dpdk.rst > +++ b/Documentation/howto/dpdk.rst > @@ -140,4 +140,15 @@ Core 7: Q4 (70%) | Q5 (10%) > core 8: Q3 (60%) | Q0 (30%) > > +To see the current measured usage history of pmd core cycles for each rxq:: > + > + $ ovs-appctl dpif-netdev/pmd-rxq-show > + > +.. note:: > + > + A history of one minute is recorded and shown for each rxq to allow for > + traffic pattern spikes. An rxq's pmd core cycles usage changes due to > traffic > + pattern or reconfig changes will take one minute before they are fully > + reflected in the stats. > + > Rxq to pmds assignment takes place whenever there are configuration changes > or can be triggered by using:: > diff --git a/NEWS b/NEWS > index aff0671..088dca3 100644 > --- a/NEWS > +++ b/NEWS > @@ -41,4 +41,5 @@ Post-v2.8.0 > - ovs-ofctl dump-ports command now prints new of set custom > statistics > if available (for OpenFlow 1.4+). > + * Add rxq utilization of pmd to appctl 'dpif-netdev/pmd-rxq-show'. > - vswitchd: > * Datapath IDs may now be specified as 0x1 (etc.) instead of 16 digits. > diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c > index 57f6570..d960a3a 100644 > --- a/lib/dpif-netdev.c > +++ b/lib/dpif-netdev.c > @@ -602,4 +602,9 @@ struct dp_netdev_pmd_thread { > struct dp_netdev_pmd_cycles cycles; > > + /* Last interval timestamp. */ > + uint64_t intrvl_tsc_prev; > + /* Last interval cycles. */ > + atomic_ullong intrvl_cycles; > + > /* Current context of the PMD thread. */ > struct dp_netdev_pmd_thread_ctx ctx; > @@ -996,7 +1001,7 @@ pmd_info_show_rxq(struct ds *reply, struct > dp_netdev_pmd_thread *pmd) > { > if (pmd->core_id != NON_PMD_CORE_ID) { > - const char *prev_name = NULL; > struct rxq_poll *list; > - size_t i, n; > + size_t n_rxq; > + uint64_t total_cycles = 0; > > ds_put_format(reply, > @@ -1006,20 +1011,32 @@ pmd_info_show_rxq(struct ds *reply, struct > dp_netdev_pmd_thread *pmd) > > ovs_mutex_lock(&pmd->port_mutex); > - sorted_poll_list(pmd, &list, &n); > - for (i = 0; i < n; i++) { > - const char *name = netdev_rxq_get_name(list[i].rxq->rx); > + sorted_poll_list(pmd, &list, &n_rxq); > > - if (!prev_name || strcmp(name, prev_name)) { > - if (prev_name) { > - ds_put_cstr(reply, "\n"); > - } > - ds_put_format(reply, "\tport: %s\tqueue-id:", name); > + /* Get the total pmd cycles for an interval. */ > + atomic_read_relaxed(&pmd->intrvl_cycles, &total_cycles); > + /* Estimate the cycles to cover all intervals. */ > + total_cycles *= PMD_RXQ_INTERVAL_MAX; > + > + for (int i = 0; i < n_rxq; i++) { > + struct dp_netdev_rxq *rxq = list[i].rxq; > + const char *name = netdev_rxq_get_name(rxq->rx); > + uint64_t proc_cycles = 0; > + > + for (int j = 0; j < PMD_RXQ_INTERVAL_MAX; j++) { > + proc_cycles += dp_netdev_rxq_get_intrvl_cycles(rxq, j); > } > - ds_put_format(reply, " %d", > + ds_put_format(reply, "\tport: %16s\tqueue-id: %2d", name, > netdev_rxq_get_queue_id(list[i].rxq->rx)); > - prev_name = name; > + ds_put_format(reply, "\tpmd usage: "); > + if (total_cycles) { > + ds_put_format(reply, "%2"PRIu64"", > + proc_cycles * 100 / total_cycles); > + ds_put_cstr(reply, " %"); > + } else { > + ds_put_format(reply, "%s", "NOT AVAIL"); > + } > + ds_put_cstr(reply, "\n"); > } > ovs_mutex_unlock(&pmd->port_mutex); > - ds_put_cstr(reply, "\n"); > free(list); > } > @@ -4157,4 +4174,6 @@ reload: > } > > + pmd->intrvl_tsc_prev = 0; > + atomic_store_relaxed(&pmd->intrvl_cycles, 0); > cycles_count_start(pmd); > for (;;) { > @@ -6138,4 +6157,5 @@ dp_netdev_pmd_try_optimize(struct dp_netdev_pmd_thread > *pmd, > > if (pmd->ctx.now > pmd->rxq_next_cycle_store) { > + uint64_t curr_tsc; > /* Get the cycles that were used to process each queue and store. */ > for (unsigned i = 0; i < poll_cnt; i++) { > @@ -6146,4 +6166,11 @@ dp_netdev_pmd_try_optimize(struct dp_netdev_pmd_thread > *pmd, > 0); > } > + curr_tsc = cycles_counter(); > + if (pmd->intrvl_tsc_prev) { > + /* There is a prev timestamp, store a new intrvl cycle count. */ > + atomic_store_relaxed(&pmd->intrvl_cycles, > + curr_tsc - pmd->intrvl_tsc_prev); > + } > + pmd->intrvl_tsc_prev = curr_tsc; > /* Start new measuring interval */ > pmd->rxq_next_cycle_store = pmd->ctx.now + PMD_RXQ_INTERVAL_LEN; > diff --git a/tests/pmd.at b/tests/pmd.at > index fcb007c..09d09cb 100644 > --- a/tests/pmd.at > +++ b/tests/pmd.at > @@ -7,5 +7,13 @@ m4_divert_push([PREPARE_TESTS]) > # port_name rxq_id numa_id core_id > parse_pmd_rxq_show () { > - awk '/pmd/ {numa=$4; core=substr($6, 1, length($6) - 1)} /\t/{for (i=4; > i<=NF; i++) print $2, $i, numa, core}' | sort > + awk '/pmd thread/ {numa=$4; core=substr($6, 1, length($6) - 1)} > /\tport:/ {print $2, $4, numa, core}' | sort > +} > + > +# Given the output of `ovs-appctl dpif-netdev/pmd-rxq-show`, > +# and with queues for each core on one line, prints the rxqs > +# of the core on one line > +# 'port:' port_name 'queue_id:' rxq_id rxq_id rxq_id rxq_id > +parse_pmd_rxq_show_group () { > + awk '/port:/ {print $1, $2, $3, $4, $12, $20, $28}' > } > > @@ -54,5 +62,5 @@ m4_define([CHECK_PMD_THREADS_CREATED], [ > > m4_define([SED_NUMA_CORE_PATTERN], ["s/\(numa_id \)[[0-9]]*\( core_id > \)[[0-9]]*:/\1<cleared>\2<cleared>:/"]) > -m4_define([SED_NUMA_CORE_QUEUE_PATTERN], ["s/\(numa_id \)[[0-9]]*\( core_id > \)[[0-9]]*:/\1<cleared>\2<cleared>:/;s/\(queue-id: > \)1 2 5 6/\1<cleared>/;s/\(queue-id: \)0 3 4 7/\1<cleared>/"]) > +m4_define([SED_NUMA_CORE_QUEUE_PATTERN], ["s/1 2 5 6/<group>/;s/0 3 4 > 7/<group>/"]) > m4_define([DUMMY_NUMA], [--dummy-numa="0,0,0,0"]) > > @@ -66,5 +74,5 @@ AT_CHECK([ovs-appctl dpif-netdev/pmd-rxq-show | sed > SED_NUMA_CORE_PATTERN], [0], > pmd thread numa_id <cleared> core_id <cleared>: > isolated : false > - port: p0 queue-id: 0 > + port: p0 queue-id: 0 pmd usage: NOT AVAIL > ]) > > @@ -97,5 +105,12 @@ AT_CHECK([ovs-appctl dpif-netdev/pmd-rxq-show | sed > SED_NUMA_CORE_PATTERN], [0], > pmd thread numa_id <cleared> core_id <cleared>: > isolated : false > - port: p0 queue-id: 0 1 2 3 4 5 6 7 > + port: p0 queue-id: 0 pmd usage: NOT AVAIL > + port: p0 queue-id: 1 pmd usage: NOT AVAIL > + port: p0 queue-id: 2 pmd usage: NOT AVAIL > + port: p0 queue-id: 3 pmd usage: NOT AVAIL > + port: p0 queue-id: 4 pmd usage: NOT AVAIL > + port: p0 queue-id: 5 pmd usage: NOT AVAIL > + port: p0 queue-id: 6 pmd usage: NOT AVAIL > + port: p0 queue-id: 7 pmd usage: NOT AVAIL > ]) > > @@ -121,5 +136,12 @@ AT_CHECK([ovs-appctl dpif-netdev/pmd-rxq-show | sed > SED_NUMA_CORE_PATTERN], [0], > pmd thread numa_id <cleared> core_id <cleared>: > isolated : false > - port: p0 queue-id: 0 1 2 3 4 5 6 7 > + port: p0 queue-id: 0 pmd usage: NOT AVAIL > + port: p0 queue-id: 1 pmd usage: NOT AVAIL > + port: p0 queue-id: 2 pmd usage: NOT AVAIL > + port: p0 queue-id: 3 pmd usage: NOT AVAIL > + port: p0 queue-id: 4 pmd usage: NOT AVAIL > + port: p0 queue-id: 5 pmd usage: NOT AVAIL > + port: p0 queue-id: 6 pmd usage: NOT AVAIL > + port: p0 queue-id: 7 pmd usage: NOT AVAIL > ]) > > @@ -128,11 +150,7 @@ AT_CHECK([ovs-vsctl set Open_vSwitch . > other_config:pmd-cpu-mask=0x3]) > CHECK_PMD_THREADS_CREATED([2], [], [+$TMP]) > > -AT_CHECK([ovs-appctl dpif-netdev/pmd-rxq-show | sed > SED_NUMA_CORE_QUEUE_PATTERN], [0], [dnl > -pmd thread numa_id <cleared> core_id <cleared>: > - isolated : false > - port: p0 queue-id: <cleared> > -pmd thread numa_id <cleared> core_id <cleared>: > - isolated : false > - port: p0 queue-id: <cleared> > +AT_CHECK([ovs-appctl dpif-netdev/pmd-rxq-show | sed > ':a;/AVAIL$/{N;s/\n//;ba}' | parse_pmd_rxq_show_group | sed > SED_NUMA_CORE_QUEUE_PATTERN], [0], [dnl > +port: p0 queue-id: <group> > +port: p0 queue-id: <group> > ]) > > @@ -144,5 +162,12 @@ AT_CHECK([ovs-appctl dpif-netdev/pmd-rxq-show | sed > SED_NUMA_CORE_PATTERN], [0], > pmd thread numa_id <cleared> core_id <cleared>: > isolated : false > - port: p0 queue-id: 0 1 2 3 4 5 6 7 > + port: p0 queue-id: 0 pmd usage: NOT AVAIL > + port: p0 queue-id: 1 pmd usage: NOT AVAIL > + port: p0 queue-id: 2 pmd usage: NOT AVAIL > + port: p0 queue-id: 3 pmd usage: NOT AVAIL > + port: p0 queue-id: 4 pmd usage: NOT AVAIL > + port: p0 queue-id: 5 pmd usage: NOT AVAIL > + port: p0 queue-id: 6 pmd usage: NOT AVAIL > + port: p0 queue-id: 7 pmd usage: NOT AVAIL > ]) > > -- > 1.8.3.1 _______________________________________________ dev mailing list d...@openvswitch.org https://mail.openvswitch.org/mailman/listinfo/ovs-dev