r23531: added optional latency reporting in BENCH-NBENCH. To use it, you need
authorAndrew Tridgell <tridge@samba.org>
Sun, 17 Jun 2007 19:35:00 +0000 (19:35 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 19:53:24 +0000 (14:53 -0500)
to have a load file that puts a timestamp in the first column. That
tells NBENCH to target the same throughput as the capture, and to
report the maximum amount of latency miss in the test

This allows you to quickly see how many clients you can run with while
still meeting a given target

source/torture/nbench/nbench.c
source/torture/nbench/nbio.c

index f671a5b0dec0393959b648c7cbf5f785a1025a3e..eb67e15fbb3896665bc508eb0df4ef671fcbaff4 100644 (file)
@@ -24,6 +24,7 @@
 #include "torture/util.h"
 #include "torture/torture.h"
 #include "system/filesys.h"
+#include "system/locale.h"
 #include "pstring.h"
 
 #include "torture/nbench/proto.h"
@@ -44,7 +45,6 @@ static BOOL run_netbench(struct torture_context *tctx, struct smbcli_state *cli,
        pstring line;
        char *cname;
        FILE *f;
-       const char **params;
        BOOL correct = True;
 
        if (torture_nprocs == 1) {
@@ -64,9 +64,13 @@ static BOOL run_netbench(struct torture_context *tctx, struct smbcli_state *cli,
                return False;
        }
 
+
 again:
+       nbio_time_reset();
+
        while (fgets(line, sizeof(line)-1, f)) {
                NTSTATUS status;
+               const char **params0, **params;
 
                nbench_line_count++;
 
@@ -74,9 +78,16 @@ again:
 
                all_string_sub(line,"client1", cname, sizeof(line));
                
-               params = str_list_make_shell(NULL, line, " ");
+               params = params0 = str_list_make_shell(NULL, line, " ");
                i = str_list_length(params);
 
+               if (i > 0 && isdigit(params[0][0])) {
+                       double targett = strtod(params[0], NULL);
+                       nbio_time_delay(targett);
+                       params++;
+                       i--;
+               }
+
                if (i < 2 || params[0][0] == '#') continue;
 
                if (!strncmp(params[0],"SMB", 3)) {
@@ -146,7 +157,7 @@ again:
                        printf("[%d] Unknown operation %s\n", nbench_line_count, params[0]);
                }
 
-               talloc_free(params);
+               talloc_free(params0);
                
                if (nb_tick()) goto done;
        }
index 26ea6520f65dca6ed27ad69b7d16628851b183b9..a382c92ceb9ed2da5cb7caa0ccc01be3edceb554 100644 (file)
@@ -53,8 +53,25 @@ static struct {
        double bytes, warmup_bytes;
        int line;
        int done;
+       double max_latency;
+       struct timeval starttime;
 } *children;
 
+void nbio_time_reset(void)
+{
+       children[nbio_id].starttime = timeval_current();        
+}
+
+void nbio_time_delay(double targett)
+{
+       double elapsed = timeval_elapsed(&children[nbio_id].starttime);
+       if (targett > elapsed) {
+               msleep(1000*(targett - elapsed));
+       } else if (elapsed - targett > children[nbio_id].max_latency) {
+               children[nbio_id].max_latency = elapsed - targett;
+       }
+}
+
 double nbio_result(void)
 {
        int i;
@@ -65,6 +82,19 @@ double nbio_result(void)
        return 1.0e-6 * total / timeval_elapsed2(&tv_start, &tv_end);
 }
 
+double nbio_latency(void)
+{
+       int i;
+       double max_latency = 0;
+       for (i=0;i<nprocs;i++) {
+               if (children[i].max_latency > max_latency) {
+                       max_latency = children[i].max_latency;
+                       children[i].max_latency = 0;
+               }
+       }
+       return max_latency;
+}
+
 BOOL nb_tick(void)
 {
        return children[nbio_id].done;
@@ -122,9 +152,9 @@ void nb_alarm(int sig)
                       nprocs, lines/nprocs, 
                       nbio_result(), t);
        } else {
-               printf("%4d  %8d  %.2f MB/sec  execute %.0f sec   \n", 
+               printf("%4d  %8d  %.2f MB/sec  execute %.0f sec  latency %.2f msec \n", 
                       nprocs, lines/nprocs, 
-                      nbio_result(), t);
+                      nbio_result(), t, nbio_latency() * 1.0e3);
        }
 
        fflush(stdout);
@@ -443,7 +473,7 @@ void nb_readx(int handle, off_t offset, int size, int ret_size, NTSTATUS status)
        io.readx.in.remaining = 0;
        io.readx.in.read_for_execute = False;
        io.readx.out.data     = buf;
-               
+       
        ret = smb_raw_read(c->tree, &io);
 
        free(buf);