gfio: add high/low priority latency results
authorVincent Fu <vincent.fu@wdc.com>
Wed, 5 Feb 2020 19:55:50 +0000 (14:55 -0500)
committerVincent Fu <vincent.fu@wdc.com>
Wed, 5 Feb 2020 22:03:34 +0000 (17:03 -0500)
For the cmdprio_percentage option, add high/low priority summary
statistics and latency percentiles.

Signed-off-by: Vincent Fu <vincent.fu@wdc.com>
gclient.c

index d2044f323f1b03703397bbe066eb36dd04ab1bca..fe83382f32a7566f8e6199e010eae48390b09830 100644 (file)
--- a/gclient.c
+++ b/gclient.c
@@ -1155,18 +1155,21 @@ out:
 #define GFIO_CLAT      1
 #define GFIO_SLAT      2
 #define GFIO_LAT       4
+#define GFIO_HILAT     8
+#define GFIO_LOLAT     16
 
 static void gfio_show_ddir_status(struct gfio_client *gc, GtkWidget *mbox,
                                  struct group_run_stats *rs,
                                  struct thread_stat *ts, int ddir)
 {
        const char *ddir_label[3] = { "Read", "Write", "Trim" };
+       const char *hilat, *lolat;
        GtkWidget *frame, *label, *box, *vbox, *main_vbox;
-       unsigned long long min[3], max[3];
+       unsigned long long min[5], max[5];
        unsigned long runt;
        unsigned long long bw, iops;
        unsigned int flags = 0;
-       double mean[3], dev[3];
+       double mean[5], dev[5];
        char *io_p, *io_palt, *bw_p, *bw_palt, *iops_p;
        char tmp[128];
        int i2p;
@@ -1265,6 +1268,14 @@ static void gfio_show_ddir_status(struct gfio_client *gc, GtkWidget *mbox,
                flags |= GFIO_CLAT;
        if (calc_lat(&ts->lat_stat[ddir], &min[2], &max[2], &mean[2], &dev[2]))
                flags |= GFIO_LAT;
+       if (calc_lat(&ts->clat_high_prio_stat[ddir], &min[3], &max[3], &mean[3], &dev[3])) {
+               flags |= GFIO_HILAT;
+               if (calc_lat(&ts->clat_low_prio_stat[ddir], &min[4], &max[4], &mean[4], &dev[4]))
+                       flags |= GFIO_LOLAT;
+               /* we only want to print low priority statistics if other IOs were
+                * submitted with the priority bit set
+                */
+       }
 
        if (flags) {
                frame = gtk_frame_new("Latency");
@@ -1273,12 +1284,24 @@ static void gfio_show_ddir_status(struct gfio_client *gc, GtkWidget *mbox,
                vbox = gtk_vbox_new(FALSE, 3);
                gtk_container_add(GTK_CONTAINER(frame), vbox);
 
+               if (ts->lat_percentiles) {
+                       hilat = "High priority total latency";
+                       lolat = "Low priority total latency";
+               } else {
+                       hilat = "High priority completion latency";
+                       lolat = "Low priority completion latency";
+               }
+
                if (flags & GFIO_SLAT)
                        gfio_show_lat(vbox, "Submission latency", min[0], max[0], mean[0], dev[0]);
                if (flags & GFIO_CLAT)
                        gfio_show_lat(vbox, "Completion latency", min[1], max[1], mean[1], dev[1]);
                if (flags & GFIO_LAT)
                        gfio_show_lat(vbox, "Total latency", min[2], max[2], mean[2], dev[2]);
+               if (flags & GFIO_HILAT)
+                       gfio_show_lat(vbox, hilat, min[3], max[3], mean[3], dev[3]);
+               if (flags & GFIO_LOLAT)
+                       gfio_show_lat(vbox, lolat, min[4], max[4], mean[4], dev[4]);
        }
 
        if (ts->slat_percentiles && flags & GFIO_SLAT)
@@ -1286,16 +1309,40 @@ static void gfio_show_ddir_status(struct gfio_client *gc, GtkWidget *mbox,
                                ts->io_u_plat[FIO_SLAT][ddir],
                                ts->slat_stat[ddir].samples,
                                "Submission");
-       if (ts->clat_percentiles && flags & GFIO_CLAT)
+       if (ts->clat_percentiles && flags & GFIO_CLAT) {
                gfio_show_clat_percentiles(gc, main_vbox, ts, ddir,
                                ts->io_u_plat[FIO_CLAT][ddir],
                                ts->clat_stat[ddir].samples,
                                "Completion");
-       if (ts->lat_percentiles && flags & GFIO_LAT)
+               if (!ts->lat_percentiles) {
+                       if (flags & GFIO_HILAT)
+                               gfio_show_clat_percentiles(gc, main_vbox, ts, ddir,
+                                               ts->io_u_plat_high_prio[ddir],
+                                               ts->clat_high_prio_stat[ddir].samples,
+                                               "High priority completion");
+                       if (flags & GFIO_LOLAT)
+                               gfio_show_clat_percentiles(gc, main_vbox, ts, ddir,
+                                               ts->io_u_plat_low_prio[ddir],
+                                               ts->clat_low_prio_stat[ddir].samples,
+                                               "Low priority completion");
+               }
+       }
+       if (ts->lat_percentiles && flags & GFIO_LAT) {
                gfio_show_clat_percentiles(gc, main_vbox, ts, ddir,
                                ts->io_u_plat[FIO_LAT][ddir],
                                ts->lat_stat[ddir].samples,
                                "Total");
+               if (flags & GFIO_HILAT)
+                       gfio_show_clat_percentiles(gc, main_vbox, ts, ddir,
+                                       ts->io_u_plat_high_prio[ddir],
+                                       ts->clat_high_prio_stat[ddir].samples,
+                                       "High priority total");
+               if (flags & GFIO_LOLAT)
+                       gfio_show_clat_percentiles(gc, main_vbox, ts, ddir,
+                                       ts->io_u_plat_low_prio[ddir],
+                                       ts->clat_low_prio_stat[ddir].samples,
+                                       "Low priority total");
+       }
 
        free(io_p);
        free(bw_p);