Add options for disabling slat/clat/bw measurements
Useful for cutting down on the number of gettimeofday calls in
situations where that does impact performance. This is mostly for
really high IOPS rates.
Signed-off-by: Jens Axboe <jens.axboe@oracle.com>
diff --git a/HOWTO b/HOWTO
index 129926b..1d1aa61 100644
--- a/HOWTO
+++ b/HOWTO
@@ -835,6 +835,19 @@
disk_util=bool Generate disk utilization statistics, if the platform
supports it. Defaults to on.
+disable_clat=bool Disable measurements of completion latency numbers. Useful
+ only for cutting back the number of calls to gettimeofday,
+ as that does impact performance at really high IOPS rates.
+ Note that to really get rid of a large amount of these
+ calls, this option must be used with disable_slat and
+ disable_bw as well.
+
+disable_slat=bool Disable measurements of submission latency numbers. See
+ disable_clat.
+
+disable_bw=bool Disable measurements of throughput/bandwidth numbers. See
+ disable_clat.
+
6.0 Interpreting the output
---------------------------
diff --git a/fio.h b/fio.h
index 1484749..690afad 100644
--- a/fio.h
+++ b/fio.h
@@ -496,6 +496,9 @@
unsigned int zero_buffers;
unsigned int refill_buffers;
unsigned int time_based;
+ unsigned int disable_clat;
+ unsigned int disable_slat;
+ unsigned int disable_bw;
char *read_iolog_file;
char *write_iolog_file;
diff --git a/io_u.c b/io_u.c
index 0896942..62a76b9 100644
--- a/io_u.c
+++ b/io_u.c
@@ -905,11 +905,16 @@
td->this_io_bytes[idx] += bytes;
if (ramp_time_over(td)) {
- usec = utime_since(&io_u->issue_time, &icd->time);
+ if (!td->o.disable_clat || !td->o.disable_bw)
+ usec = utime_since(&io_u->issue_time,
+ &icd->time);
- add_clat_sample(td, idx, usec);
- add_bw_sample(td, idx, &icd->time);
- io_u_mark_latency(td, usec);
+ if (!td->o.disable_clat) {
+ add_clat_sample(td, idx, usec);
+ io_u_mark_latency(td, usec);
+ }
+ if (!td->o.disable_bw)
+ add_bw_sample(td, idx, &icd->time);
}
if (td_write(td) && idx == DDIR_WRITE &&
@@ -930,9 +935,11 @@
}
}
-static void init_icd(struct io_completion_data *icd, int nr)
+static void init_icd(struct thread_data *td, struct io_completion_data *icd,
+ int nr)
{
- fio_gettime(&icd->time, NULL);
+ if (!td->o.disable_clat || !td->o.disable_bw)
+ fio_gettime(&icd->time, NULL);
icd->nr = nr;
@@ -961,7 +968,7 @@
{
struct io_completion_data icd;
- init_icd(&icd, 1);
+ init_icd(td, &icd, 1);
io_completed(td, io_u, &icd);
put_io_u(td, io_u);
@@ -994,7 +1001,7 @@
} else if (!ret)
return ret;
- init_icd(&icd, ret);
+ init_icd(td, &icd, ret);
ios_completed(td, &icd);
if (!icd.error)
return icd.bytes_done[0] + icd.bytes_done[1];
@@ -1008,10 +1015,12 @@
*/
void io_u_queued(struct thread_data *td, struct io_u *io_u)
{
- unsigned long slat_time;
+ if (!td->o.disable_slat) {
+ unsigned long slat_time;
- slat_time = utime_since(&io_u->start_time, &io_u->issue_time);
- add_slat_sample(td, io_u->ddir, slat_time);
+ slat_time = utime_since(&io_u->start_time, &io_u->issue_time);
+ add_slat_sample(td, io_u->ddir, slat_time);
+ }
}
/*
diff --git a/ioengines.c b/ioengines.c
index 3ef0d03..9daeaab 100644
--- a/ioengines.c
+++ b/ioengines.c
@@ -210,6 +210,15 @@
return r;
}
+static inline int get_issue_time(struct thread_data *td)
+{
+ if (td->o.read_iolog_file ||
+ !td->o.disable_clat || !td->o.disable_slat || !td->o.disable_bw)
+ return 1;
+
+ return 0;
+}
+
int td_io_queue(struct thread_data *td, struct io_u *io_u)
{
int ret;
@@ -226,7 +235,8 @@
io_u->resid = 0;
if (td->io_ops->flags & FIO_SYNCIO) {
- fio_gettime(&io_u->issue_time, NULL);
+ if (get_issue_time(td))
+ fio_gettime(&io_u->issue_time, NULL);
/*
* only used for iolog
@@ -269,7 +279,8 @@
}
if ((td->io_ops->flags & FIO_SYNCIO) == 0) {
- fio_gettime(&io_u->issue_time, NULL);
+ if (get_issue_time(td))
+ fio_gettime(&io_u->issue_time, NULL);
/*
* only used for iolog
diff --git a/options.c b/options.c
index 8723adf..d4fc184 100644
--- a/options.c
+++ b/options.c
@@ -1291,6 +1291,27 @@
},
#endif
{
+ .name = "disable_clat",
+ .type = FIO_OPT_BOOL,
+ .off1 = td_var_offset(disable_clat),
+ .help = "Disable completion latency numbers",
+ .def = "0",
+ },
+ {
+ .name = "disable_slat",
+ .type = FIO_OPT_BOOL,
+ .off1 = td_var_offset(disable_slat),
+ .help = "Disable submissionn latency numbers",
+ .def = "0",
+ },
+ {
+ .name = "disable_bw_measurement",
+ .type = FIO_OPT_BOOL,
+ .off1 = td_var_offset(disable_bw),
+ .help = "Disable bandwidth logging",
+ .def = "0",
+ },
+ {
.name = NULL,
},
};