RE: [PATCH v9] graph: add optional profiling stats

Morten Brørup <[email protected]>
Newsgroups org.dpdk.dev
Message-ID <[email protected]>
> 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.
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.