From: Jens Axboe Date: Thu, 16 Oct 2008 19:03:27 +0000 (+0200) Subject: Add options for disabling slat/clat/bw measurements X-Git-Tag: fio-1.23~6 X-Git-Url: https://git.kernel.dk/?p=fio.git;a=commitdiff_plain;h=9520ebb9f4dd88d086e313ae97e37ebb6d4f240b 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 --- diff --git a/HOWTO b/HOWTO index 129926b3..1d1aa61d 100644 --- a/HOWTO +++ b/HOWTO @@ -835,6 +835,19 @@ cpuchunks=int If the job is a CPU cycle eater, split the load into 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 14847498..690afad6 100644 --- a/fio.h +++ b/fio.h @@ -496,6 +496,9 @@ struct thread_options { 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 08969427..62a76b9d 100644 --- a/io_u.c +++ b/io_u.c @@ -905,11 +905,16 @@ static void io_completed(struct thread_data *td, struct io_u *io_u, 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 io_completed(struct thread_data *td, struct io_u *io_u, } } -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 @@ long io_u_sync_complete(struct thread_data *td, struct io_u *io_u) { 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 @@ long io_u_queued_complete(struct thread_data *td, int min_evts) } 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 @@ long io_u_queued_complete(struct thread_data *td, int min_evts) */ 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 3ef0d032..9daeaab0 100644 --- a/ioengines.c +++ b/ioengines.c @@ -210,6 +210,15 @@ out: 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 @@ int td_io_queue(struct thread_data *td, struct io_u *io_u) 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 @@ int td_io_queue(struct thread_data *td, struct io_u *io_u) } 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 8723adff..d4fc1848 100644 --- a/options.c +++ b/options.c @@ -1290,6 +1290,27 @@ static struct fio_option options[] = { .def = "1", }, #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, },