diff mbox series

[2/2] oslat: Don't take trace_threshold into account during preheat

Message ID 20210707084849.304329-2-nsaenzju@redhat.com
State New
Headers show
Series [1/2] oslat: Remove redundant include | expand

Commit Message

Nicolas Saenz Julienne July 7, 2021, 8:48 a.m. UTC
The point of preheat is to make sure CPUs are out of idle and running at
max frequency by the time the real test starts. So it's expected to
incur into extra latencies we don't really mean to measure. With this in
mind, it doesn't make sense to take into account the trace threshold
during that run. So don't do it.

Note that this has been observed in practice. The threshold would be hit
during preheat but not during the real test.

Signed-off-by: Nicolas Saenz Julienne <nsaenzju@redhat.com>
---
 src/oslat/oslat.c | 11 +++++++----
 1 file changed, 7 insertions(+), 4 deletions(-)

Comments

John Kacur July 9, 2021, 6:08 p.m. UTC | #1
On Wed, 7 Jul 2021, Nicolas Saenz Julienne wrote:

> The point of preheat is to make sure CPUs are out of idle and running at

> max frequency by the time the real test starts. So it's expected to

> incur into extra latencies we don't really mean to measure. With this in

> mind, it doesn't make sense to take into account the trace threshold

> during that run. So don't do it.

> 

> Note that this has been observed in practice. The threshold would be hit

> during preheat but not during the real test.

> 

> Signed-off-by: Nicolas Saenz Julienne <nsaenzju@redhat.com>

> ---

>  src/oslat/oslat.c | 11 +++++++----

>  1 file changed, 7 insertions(+), 4 deletions(-)

> 

> diff --git a/src/oslat/oslat.c b/src/oslat/oslat.c

> index 1cba6fc..6ff5ba8 100644

> --- a/src/oslat/oslat.c

> +++ b/src/oslat/oslat.c

> @@ -29,6 +29,7 @@

>  #include <numa.h>

>  #include <math.h>

>  #include <limits.h>

> +#include <stdbool.h>

>  

>  #include <sys/prctl.h>

>  #include <sys/stat.h>

> @@ -150,6 +151,7 @@ struct thread {

>  struct global {

>  	/* Configuration. */

>  	unsigned int          runtime_secs;

> +	bool		      preheat;

>  	/*

>  	 * Number of threads running for current test

>  	 * (either pre heat or real run)

> @@ -299,7 +301,7 @@ static void insert_bucket(struct thread *t, stamp_t value)

>  	us = index + 1;

>  	assert(us > 0);

>  

> -	if (g.trace_threshold && us >= g.trace_threshold) {

> +	if (!g.preheat && g.trace_threshold && us >= g.trace_threshold) {

>  		char *line = "%s: Trace threshold (%d us) triggered with %u us!\n"

>  		    "Stopping the test.\n";

>  		tracemark(line, g.app_name, g.trace_threshold, us);

> @@ -515,11 +517,12 @@ static void write_summary_json(FILE *f, void *data)

>  	fprintf(f, "  }\n");

>  }

>  

> -static void run_expt(struct thread *threads, int runtime_secs)

> +static void run_expt(struct thread *threads, int runtime_secs, bool preheat)

>  {

>  	int i;

>  

>  	g.runtime_secs = runtime_secs;

> +	g.preheat = preheat;

>  	g.n_threads_started = 0;

>  	g.n_threads_running = 0;

>  	g.n_threads_finished = 0;

> @@ -846,14 +849,14 @@ int main(int argc, char *argv[])

>  		g.n_threads = 1;

>  	else

>  		g.n_threads = g.n_threads_total;

> -	run_expt(threads, 1);

> +	run_expt(threads, 1, true);

>  	record_bias(threads);

>  

>  	if (!g.quiet)

>  		printf("Test starts...\n");

>  	/* Reset n_threads to always run on all the cores */

>  	g.n_threads = g.n_threads_total;

> -	run_expt(threads, g.runtime);

> +	run_expt(threads, g.runtime, false);

>  

>  	if (!g.quiet)

>  		printf("Test completed.\n\n");

> -- 

> 2.31.1

> 

> 

Signed-off-by: John Kacur <jkacur@redhat.com>
John Kacur July 9, 2021, 6:09 p.m. UTC | #2
On Wed, 7 Jul 2021, Peter Xu wrote:

> On Wed, Jul 07, 2021 at 10:48:49AM +0200, Nicolas Saenz Julienne wrote:

> > The point of preheat is to make sure CPUs are out of idle and running at

> > max frequency by the time the real test starts. So it's expected to

> > incur into extra latencies we don't really mean to measure. With this in

> > mind, it doesn't make sense to take into account the trace threshold

> > during that run. So don't do it.

> > 

> > Note that this has been observed in practice. The threshold would be hit

> > during preheat but not during the real test.

> > 

> > Signed-off-by: Nicolas Saenz Julienne <nsaenzju@redhat.com>

> 

> Reviewed-by: Peter Xu <peterx@redhat.com>

> 

> -- 

> Peter Xu

> 

> 

Thanks, added
diff mbox series

Patch

diff --git a/src/oslat/oslat.c b/src/oslat/oslat.c
index 1cba6fc..6ff5ba8 100644
--- a/src/oslat/oslat.c
+++ b/src/oslat/oslat.c
@@ -29,6 +29,7 @@ 
 #include <numa.h>
 #include <math.h>
 #include <limits.h>
+#include <stdbool.h>
 
 #include <sys/prctl.h>
 #include <sys/stat.h>
@@ -150,6 +151,7 @@  struct thread {
 struct global {
 	/* Configuration. */
 	unsigned int          runtime_secs;
+	bool		      preheat;
 	/*
 	 * Number of threads running for current test
 	 * (either pre heat or real run)
@@ -299,7 +301,7 @@  static void insert_bucket(struct thread *t, stamp_t value)
 	us = index + 1;
 	assert(us > 0);
 
-	if (g.trace_threshold && us >= g.trace_threshold) {
+	if (!g.preheat && g.trace_threshold && us >= g.trace_threshold) {
 		char *line = "%s: Trace threshold (%d us) triggered with %u us!\n"
 		    "Stopping the test.\n";
 		tracemark(line, g.app_name, g.trace_threshold, us);
@@ -515,11 +517,12 @@  static void write_summary_json(FILE *f, void *data)
 	fprintf(f, "  }\n");
 }
 
-static void run_expt(struct thread *threads, int runtime_secs)
+static void run_expt(struct thread *threads, int runtime_secs, bool preheat)
 {
 	int i;
 
 	g.runtime_secs = runtime_secs;
+	g.preheat = preheat;
 	g.n_threads_started = 0;
 	g.n_threads_running = 0;
 	g.n_threads_finished = 0;
@@ -846,14 +849,14 @@  int main(int argc, char *argv[])
 		g.n_threads = 1;
 	else
 		g.n_threads = g.n_threads_total;
-	run_expt(threads, 1);
+	run_expt(threads, 1, true);
 	record_bias(threads);
 
 	if (!g.quiet)
 		printf("Test starts...\n");
 	/* Reset n_threads to always run on all the cores */
 	g.n_threads = g.n_threads_total;
-	run_expt(threads, g.runtime);
+	run_expt(threads, g.runtime, false);
 
 	if (!g.quiet)
 		printf("Test completed.\n\n");