[PATCH] Time and seek optimizations
We did too many gettimeofday() calls, this patch cuts the number by
40%. Use clock_gettime() MONOTONIC instead, it is faster on my system
at least.
This patch also optimizes calling lseek() only when necessary for the
sync io engine.
Signed-off-by: Jens Axboe <jens.axboe@oracle.com>
diff --git a/io_u.c b/io_u.c
index 318614c..8ec9dd9 100644
--- a/io_u.c
+++ b/io_u.c
@@ -153,7 +153,7 @@
struct timeval now;
unsigned long elapsed;
- gettimeofday(&now, NULL);
+ fio_gettime(&now, NULL);
elapsed = mtime_since_now(&td->rwmix_switch);
/*
@@ -296,14 +296,13 @@
return NULL;
}
- gettimeofday(&io_u->start_time, NULL);
+ fio_gettime(&io_u->start_time, NULL);
return io_u;
}
void io_completed(struct thread_data *td, struct io_u *io_u,
struct io_completion_data *icd)
{
- struct timeval e;
unsigned long msec;
if (io_u->ddir == DDIR_SYNC) {
@@ -313,8 +312,6 @@
td->last_was_sync = 0;
- gettimeofday(&e, NULL);
-
if (!io_u->error) {
unsigned int bytes = io_u->buflen - io_u->resid;
const int idx = io_u->ddir;
@@ -324,10 +321,12 @@
td->zone_bytes += bytes;
td->this_io_bytes[idx] += bytes;
- msec = mtime_since(&io_u->issue_time, &e);
+ io_u->file->last_completed_pos = io_u->offset + io_u->buflen;
+
+ msec = mtime_since(&io_u->issue_time, &icd->time);
add_clat_sample(td, idx, msec);
- add_bw_sample(td, idx);
+ add_bw_sample(td, idx, &icd->time);
if ((td_rw(td) || td_write(td)) && idx == DDIR_WRITE)
log_io_piece(td, io_u);
@@ -342,6 +341,8 @@
struct io_u *io_u;
int i;
+ fio_gettime(&icd->time, NULL);
+
icd->error = 0;
icd->bytes_done[0] = icd->bytes_done[1] = 0;