> From: Robin Jarry [mailto:[email protected]]
> Sent: Saturday, 22 August 2026 11.53
>
> Hey Morten,
>
> I have some concerns with the "histogram" implementation. There are
> holes in the data. You will only capture specific batch sizes.
>
> NB: did you notice we already have a burst size histogram exported in
> the grout metrics:
>
> https://github.com/DPDK/grout/blob/v0.17.1/modules/infra/api/stats.c#L3
> 13-L336
Thanks for the pointer.
The existing histogram only covers packet burst size.
I want to capture performance data for development (optimization) purposes.
I'll take a look at it, to see if something similar could be relevant for the
data I'm aiming to collect.
>
> Morten Brørup, Jul 03, 2026 at 17:43:
[...]
> > if (rte_graph_has_stats_feature()) {
> > - start = rte_rdtsc();
> > + cycles = -rte_rdtsc();
>
> I presume this works but it feels confusing taking a "negative" value
> of an unsigned integer.
Maybe this is more readable:
cycles = rte_rdtsc();
rc = node->process(graph, node, objs, node->idx);
cycles = rte_rdtsc() - cycles;
>
> > rc = node->process(graph, node, objs, node->idx);
> > - node->total_cycles += rte_rdtsc() - start;
> > + cycles += rte_rdtsc();
> > + node->total_cycles += cycles;
> > node->total_calls++;
> > node->total_objs += rc;
> > +#ifdef RTE_GRAPH_PROFILE
> > + if (rc <= 1) {
> > + node->usage_stats[rc].calls++;
> > + node->usage_stats[rc].cycles += cycles;
> > + } else if (rc == RTE_GRAPH_PROFILE_BURST_SIZE) {
> > + node->usage_stats[2].calls++;
> > + node->usage_stats[2].cycles += cycles;
> > + } else if (rc == RTE_GRAPH_BURST_SIZE) {
> > + node->usage_stats[3].calls++;
> > + node->usage_stats[3].cycles += cycles;
>
> If you want a reliable histogram, you would need to change these tests
> to the following:
>
> id (rc >= RTE_GRAPH_BURST_SIZE) {
> node->usage_stats[3].calls++;
> node->usage_stats[3].cycles += cycles;
> } else if (rc >= RTE_GRAPH_PROFILE_BURST_SIZE) {
> node->usage_stats[2].calls++;
> node->usage_stats[2].cycles += cycles;
> } else if (rc != 0) {
> node->usage_stats[1].calls++;
> node->usage_stats[1].cycles += cycles;
> } else {
> node->usage_stats[0].calls++;
> node->usage_stats[0].cycles += cycles;
> }
>
> Otherwise, you will miss lots of odd-sized batches in your histogram
> data.
Correct.
However, I only need a few representative snapshots to help identify what to
optimize.
Zero and one object processed are quite frequently, so I want to know how
frequent they occur.
BTW, the cycles/object for processing one object is substantially higher than
when processing a burst.
For bursts, I want to be able to calculate the cycles/object.
I also want to be able to see how frequent they occur.
I wanted the data to stay within one cache line, so I compromised.
Since I don't need to stay within one cache line, I can improve it with better
coverage.
>
>
> > + }
> > +#endif
> > } else {
> > node->process(graph, node, objs, node->idx);
> > }
>
>
> --
> Robin
>
> # Not a flying toy.