Flexible I/O Tester development
 help / color / mirror / Atom feed
* Group reporting with latency and IOPS
@ 2013-01-28 23:32 Neto, Antonio Jose Rodrigues
  2013-01-29 13:02 ` Jens Axboe
  0 siblings, 1 reply; 16+ messages in thread
From: Neto, Antonio Jose Rodrigues @ 2013-01-28 23:32 UTC (permalink / raw)
  To: fio@vger.kernel.org

Hi All,

This is neto from Brazil

How are you?

I just need a help to make sure I understood correctly the report (see below --Output). 

Trying to generate 80% Read and 20% Write - 8KB block size

Reads
IOPS: 15330
Latency: (clat) 628usecs - 0.628ms

Writes
IOPS: 3827
Latency: (clat) 577usecs - 0.577ms

Am I doing the correct analysis?

One question is: Is it possible to have global IOPS and latency?

All the best

neto


-- Config file (Windows)

[workload]
bs=8k
ioengine=windowsaio
iodepth=4
size=10g
numjobs=3
direct=1
runtime=30
filename=\\.\PhysicalDrive1
filename=\\.\PhysicalDrive2
filename=\\.\PhysicalDrive3
filename=\\.\PhysicalDrive5
filename=\\.\PhysicalDrive6
filename=\\.\PhysicalDrive7
rw=randrw
rwmixread=80
rwmixwrite=20
thread
group_reporting


-- Output

workload: (groupid=0, jobs=3): err= 0: pid=2096: Mon Jan 28 18:23:32 2013
  read : io=3594.7MB, bw=122645KB/s, iops=15330 , runt= 30008msec
    slat (usec): min=2 , max=2263 , avg= 5.92, stdev= 4.05
    clat (usec): min=128 , max=51478 , avg=628.97, stdev=789.58
     lat (usec): min=134 , max=51482 , avg=634.89, stdev=789.56
    clat percentiles (usec):
     |  1.00th=[  169],  5.00th=[  185], 10.00th=[  195], 20.00th=[  213],
     | 30.00th=[  237], 40.00th=[  306], 50.00th=[  572], 60.00th=[  756],
     | 70.00th=[  796], 80.00th=[  868], 90.00th=[  988], 95.00th=[ 1224],
     | 99.00th=[ 2640], 99.50th=[ 4832], 99.90th=[13376], 99.95th=[15040],
     | 99.99th=[15936]
    bw (KB/s)  : min=17280, max=48528, per=33.37%, avg=40921.04, stdev=6090.31
  write: io=918768KB, bw=30617KB/s, iops=3827 , runt= 30008msec
    slat (usec): min=3 , max=2260 , avg= 7.34, stdev= 6.94
    clat (usec): min=262 , max=19853 , avg=577.21, stdev=629.07
     lat (usec): min=271 , max=19862 , avg=584.54, stdev=629.35
    clat percentiles (usec):
     |  1.00th=[  338],  5.00th=[  378], 10.00th=[  402], 20.00th=[  434],
     | 30.00th=[  458], 40.00th=[  482], 50.00th=[  502], 60.00th=[  532],
     | 70.00th=[  564], 80.00th=[  620], 90.00th=[  732], 95.00th=[  812],
     | 99.00th=[ 1304], 99.50th=[ 2768], 99.90th=[12224], 99.95th=[15168],
     | 99.99th=[15680]
    bw (KB/s)  : min= 4080, max=12368, per=33.36%, avg=10213.68, stdev=1566.17
    lat (usec) : 250=26.81%, 500=21.78%, 750=16.54%, 1000=26.96%
    lat (msec) : 2=6.67%, 4=0.69%, 10=0.37%, 20=0.18%, 50=0.01%
    lat (msec) : 100=0.01%
  cpu          : usr=3.33%, sys=16.67%, ctx=0, majf=0, minf=0
  IO depths    : 1=0.1%, 2=0.1%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, >=64=0.0%
     submit    : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
     complete  : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
     issued    : total=r=460040/w=114846/d=0, short=r=0/w=0/d=0

Run status group 0 (all jobs):
   READ: io=3594.7MB, aggrb=122644KB/s, minb=122644KB/s, maxb=122644KB/s, mint=3
0008msec, maxt=30008msec
  WRITE: io=918768KB, aggrb=30617KB/s, minb=30617KB/s, maxb=30617KB/s, mint=3000
8msec, maxt=30008msec







^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: Group reporting with latency and IOPS
  2013-01-28 23:32 Group reporting with latency and IOPS Neto, Antonio Jose Rodrigues
@ 2013-01-29 13:02 ` Jens Axboe
  2013-01-29 13:41   ` Neto, Antonio Jose Rodrigues
  2013-02-01  6:35   ` Georg Schönberger
  0 siblings, 2 replies; 16+ messages in thread
From: Jens Axboe @ 2013-01-29 13:02 UTC (permalink / raw)
  To: Neto, Antonio Jose Rodrigues; +Cc: fio@vger.kernel.org

On Mon, Jan 28 2013, Neto, Antonio Jose Rodrigues wrote:
> Hi All,
> 
> This is neto from Brazil
> 
> How are you?
> 
> I just need a help to make sure I understood correctly the report (see below --Output). 
> 
> Trying to generate 80% Read and 20% Write - 8KB block size
> 
> Reads
> IOPS: 15330
> Latency: (clat) 628usecs - 0.628ms

Correct. Well 629 really, if rounded properly.

> Writes
> IOPS: 3827
> Latency: (clat) 577usecs - 0.577ms

Correct too.

> Am I doing the correct analysis?

Yep.

> One question is: Is it possible to have global IOPS and latency?

You mean for both read and write combined? Fio does not report that, but
for IOPS you could just add them. For latency, the larger of the two.

-- 
Jens Axboe


^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: Group reporting with latency and IOPS
  2013-01-29 13:02 ` Jens Axboe
@ 2013-01-29 13:41   ` Neto, Antonio Jose Rodrigues
  2013-01-29 13:46     ` Jens Axboe
  2013-02-01  6:35   ` Georg Schönberger
  1 sibling, 1 reply; 16+ messages in thread
From: Neto, Antonio Jose Rodrigues @ 2013-01-29 13:41 UTC (permalink / raw)
  To: Jens Axboe; +Cc: fio@vger.kernel.org



On 1/29/13 8:02 AM, "Jens Axboe" <axboe@kernel.dk> wrote:

>On Mon, Jan 28 2013, Neto, Antonio Jose Rodrigues wrote:
>> Hi All,
>> 
>> This is neto from Brazil
>> 
>> How are you?
>> 
>> I just need a help to make sure I understood correctly the report (see
>>below --Output). 
>> 
>> Trying to generate 80% Read and 20% Write - 8KB block size
>> 
>> Reads
>> IOPS: 15330
>> Latency: (clat) 628usecs - 0.628ms
>
>Correct. Well 629 really, if rounded properly.
>
>> Writes
>> IOPS: 3827
>> Latency: (clat) 577usecs - 0.577ms
>
>Correct too.
>
>> Am I doing the correct analysis?
>
>Yep.
>
>> One question is: Is it possible to have global IOPS and latency?
>
>You mean for both read and write combined? Fio does not report that, but
>for IOPS you could just add them. For latency, the larger of the two.
>
>-- 
>Jens Axboe
>

Hi Jens

This is neto from Brazil

How are you?

Thank you so much for your answer.

How can I have a combined IOPS reported?

Thank you

neto


>



^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: Group reporting with latency and IOPS
  2013-01-29 13:41   ` Neto, Antonio Jose Rodrigues
@ 2013-01-29 13:46     ` Jens Axboe
  2013-01-29 13:49       ` Neto, Antonio Jose Rodrigues
  0 siblings, 1 reply; 16+ messages in thread
From: Jens Axboe @ 2013-01-29 13:46 UTC (permalink / raw)
  To: Neto, Antonio Jose Rodrigues; +Cc: fio@vger.kernel.org

On Tue, Jan 29 2013, Neto, Antonio Jose Rodrigues wrote:
> atency: (clat) 577usecs - 0.577ms
> >
> >Correct too.
> >
> >> Am I doing the correct analysis?
> >
> >Yep.
> >
> >> One question is: Is it possible to have global IOPS and latency?
> >
> >You mean for both read and write combined? Fio does not report that, but
> >for IOPS you could just add them. For latency, the larger of the two.
> >
> >--=20
> >Jens Axboe
> >
> 
> Hi Jens
> 
> This is neto from Brazil
> 
> How are you?
> 
> Thank you so much for your answer.
> 
> How can I have a combined IOPS reported?

You can't, at least not automatically. You would have to sum them up. It
would not be hard to add at all, though, controlled by an option. I
haven't had any requests for it before now, usually people ask for more
fine grained metrics, not the other way around :-)

-- 
Jens Axboe


^ permalink raw reply	[flat|nested] 16+ messages in thread

* RE: Group reporting with latency and IOPS
  2013-01-29 13:46     ` Jens Axboe
@ 2013-01-29 13:49       ` Neto, Antonio Jose Rodrigues
  2013-01-29 13:54         ` Jens Axboe
  0 siblings, 1 reply; 16+ messages in thread
From: Neto, Antonio Jose Rodrigues @ 2013-01-29 13:49 UTC (permalink / raw)
  To: Jens Axboe; +Cc: fio@vger.kernel.org

On Tue, Jan 29 2013, Neto, Antonio Jose Rodrigues wrote:
> atency: (clat) 577usecs - 0.577ms
> >
> >Correct too.
> >
> >> Am I doing the correct analysis?
> >
> >Yep.
> >
> >> One question is: Is it possible to have global IOPS and latency?
> >
> >You mean for both read and write combined? Fio does not report that, 
> >but for IOPS you could just add them. For latency, the larger of the two.
> >
> >--=20
> >Jens Axboe
> >
> 
> Hi Jens
> 
> This is neto from Brazil
> 
> How are you?
> 
> Thank you so much for your answer.
> 
> How can I have a combined IOPS reported?

You can't, at least not automatically. You would have to sum them up. It would not be hard to add at all, though, controlled by an option. I haven't had any requests for it before now, usually people ask for more fine grained metrics, not the other way around :-)

--
Jens Axboe

Thank you Jens, I understand. To have an option to group everything could be a good thing especially when you are doing a POC or demonstrating performance for a customer where they are interested in how many IOPS and total latency :-) 


^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: Group reporting with latency and IOPS
  2013-01-29 13:49       ` Neto, Antonio Jose Rodrigues
@ 2013-01-29 13:54         ` Jens Axboe
  2013-01-29 13:58           ` Neto, Antonio Jose Rodrigues
  0 siblings, 1 reply; 16+ messages in thread
From: Jens Axboe @ 2013-01-29 13:54 UTC (permalink / raw)
  To: Neto, Antonio Jose Rodrigues; +Cc: fio@vger.kernel.org

On Tue, Jan 29 2013, Neto, Antonio Jose Rodrigues wrote:
> On Tue, Jan 29 2013, Neto, Antonio Jose Rodrigues wrote:
> > atency: (clat) 577usecs - 0.577ms
> > >
> > >Correct too.
> > >
> > >> Am I doing the correct analysis?
> > >
> > >Yep.
> > >
> > >> One question is: Is it possible to have global IOPS and latency?
> > >
> > >You mean for both read and write combined? Fio does not report that, 
> > >but for IOPS you could just add them. For latency, the larger of the two.
> > >
> > >--=20
> > >Jens Axboe
> > >
> > 
> > Hi Jens
> > 
> > This is neto from Brazil
> > 
> > How are you?
> > 
> > Thank you so much for your answer.
> > 
> > How can I have a combined IOPS reported?
> 
> You can't, at least not automatically. You would have to sum them up. It would not be hard to add at all, though, controlled by an option. I haven't had any requests for it before now, usually people ask for more fine grained metrics, not the other way around :-)
> 
> --
> Jens Axboe
> 
> Thank you Jens, I understand. To have an option to group everything
> could be a good thing especially when you are doing a POC or
> demonstrating performance for a customer where they are interested in
> how many IOPS and total latency :-) 

I agree, I can see the use case. I'll add a 'unified_rw_reporting'
option to be able to do that. Most accounting is done collectively, so
it should be pretty simple to do this.

-- 
Jens Axboe


^ permalink raw reply	[flat|nested] 16+ messages in thread

* RE: Group reporting with latency and IOPS
  2013-01-29 13:54         ` Jens Axboe
@ 2013-01-29 13:58           ` Neto, Antonio Jose Rodrigues
  2013-01-29 20:10             ` Jens Axboe
  0 siblings, 1 reply; 16+ messages in thread
From: Neto, Antonio Jose Rodrigues @ 2013-01-29 13:58 UTC (permalink / raw)
  To: Jens Axboe; +Cc: fio@vger.kernel.org

On Tue, Jan 29 2013, Neto, Antonio Jose Rodrigues wrote:
> On Tue, Jan 29 2013, Neto, Antonio Jose Rodrigues wrote:
> > atency: (clat) 577usecs - 0.577ms
> > >
> > >Correct too.
> > >
> > >> Am I doing the correct analysis?
> > >
> > >Yep.
> > >
> > >> One question is: Is it possible to have global IOPS and latency?
> > >
> > >You mean for both read and write combined? Fio does not report 
> > >that, but for IOPS you could just add them. For latency, the larger of the two.
> > >
> > >--=20
> > >Jens Axboe
> > >
> > 
> > Hi Jens
> > 
> > This is neto from Brazil
> > 
> > How are you?
> > 
> > Thank you so much for your answer.
> > 
> > How can I have a combined IOPS reported?
> 
> You can't, at least not automatically. You would have to sum them up. 
> It would not be hard to add at all, though, controlled by an option. I 
> haven't had any requests for it before now, usually people ask for 
> more fine grained metrics, not the other way around :-)
> 
> --
> Jens Axboe
> 
> Thank you Jens, I understand. To have an option to group everything 
> could be a good thing especially when you are doing a POC or 
> demonstrating performance for a customer where they are interested in 
> how many IOPS and total latency :-)

I agree, I can see the use case. I'll add a 'unified_rw_reporting'
option to be able to do that. Most accounting is done collectively, so it should be pretty simple to do this.

--
Jens Axboe

Thank you so much! I am starting to use FIO for all my performance POCs here. I hope to have this option as soon as possible ... So I can demonstrate next week.

One question: I am doing a PCO using Windows, and if I download all changes via github how can I compile for Windows? (The POC is on Windows :-)


^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: Group reporting with latency and IOPS
  2013-01-29 13:58           ` Neto, Antonio Jose Rodrigues
@ 2013-01-29 20:10             ` Jens Axboe
  2013-01-29 20:28               ` Neto, Antonio Jose Rodrigues
  0 siblings, 1 reply; 16+ messages in thread
From: Jens Axboe @ 2013-01-29 20:10 UTC (permalink / raw)
  To: Neto, Antonio Jose Rodrigues; +Cc: fio@vger.kernel.org

On Tue, Jan 29 2013, Neto, Antonio Jose Rodrigues wrote:
> On Tue, Jan 29 2013, Neto, Antonio Jose Rodrigues wrote:
> > On Tue, Jan 29 2013, Neto, Antonio Jose Rodrigues wrote:
> > > atency: (clat) 577usecs - 0.577ms
> > > >
> > > >Correct too.
> > > >
> > > >> Am I doing the correct analysis?
> > > >
> > > >Yep.
> > > >
> > > >> One question is: Is it possible to have global IOPS and latency?
> > > >
> > > >You mean for both read and write combined? Fio does not report 
> > > >that, but for IOPS you could just add them. For latency, the larger of the two.
> > > >
> > > >--=20
> > > >Jens Axboe
> > > >
> > > 
> > > Hi Jens
> > > 
> > > This is neto from Brazil
> > > 
> > > How are you?
> > > 
> > > Thank you so much for your answer.
> > > 
> > > How can I have a combined IOPS reported?
> > 
> > You can't, at least not automatically. You would have to sum them up. 
> > It would not be hard to add at all, though, controlled by an option. I 
> > haven't had any requests for it before now, usually people ask for 
> > more fine grained metrics, not the other way around :-)
> > 
> > --
> > Jens Axboe
> > 
> > Thank you Jens, I understand. To have an option to group everything 
> > could be a good thing especially when you are doing a POC or 
> > demonstrating performance for a customer where they are interested in 
> > how many IOPS and total latency :-)
> 
> I agree, I can see the use case. I'll add a 'unified_rw_reporting'
> option to be able to do that. Most accounting is done collectively, so it should be pretty simple to do this.
> 
> --
> Jens Axboe
> 
> Thank you so much! I am starting to use FIO for all my performance
> POCs here. I hope to have this option as soon as possible ... So I can
> demonstrate next week.

The below should have a chance at working, though I haven't tested it
much yet. Will try and find some time to do that shortly.

> One question: I am doing a PCO using Windows, and if I download all
> changes via github how can I compile for Windows? (The POC is on
> Windows :-)

Bruce, correct me if I'm wrong, but I'm pretty sure I saw a "How to
build fio" setup guide from you at some point. If correct, can you post
it here too? Antonio probably isn't the only one.

diff --git a/client.c b/client.c
index 6021e4a..0dc620d 100644
--- a/client.c
+++ b/client.c
@@ -595,6 +595,7 @@ static void convert_ts(struct thread_stat *dst, struct thread_stat *src)
 	dst->groupid	= le32_to_cpu(src->groupid);
 	dst->pid	= le32_to_cpu(src->pid);
 	dst->members	= le32_to_cpu(src->members);
+	dst->unified_rw_rep	= le32_to_cpu(src->unified_rw_rep);
 
 	for (i = 0; i < DDIR_RWDIR_CNT; i++) {
 		convert_io_stat(&dst->clat_stat[i], &src->clat_stat[i]);
@@ -667,6 +668,7 @@ static void convert_gs(struct group_run_stats *dst, struct group_run_stats *src)
 
 	dst->kb_base	= le32_to_cpu(src->kb_base);
 	dst->groupid	= le32_to_cpu(src->groupid);
+	dst->unified_rw_rep	= le32_to_cpu(src->unified_rw_rep);
 }
 
 static void handle_ts(struct fio_client *client, struct fio_net_cmd *cmd)
@@ -687,6 +689,7 @@ static void handle_ts(struct fio_client *client, struct fio_net_cmd *cmd)
 
 	client_ts.members++;
 	client_ts.groupid = p->ts.groupid;
+	client_ts.unified_rw_rep = p->ts.unified_rw_rep;
 
 	if (++sum_stat_nr == sum_stat_clients) {
 		strcpy(client_ts.name, "All clients");
diff --git a/eta.c b/eta.c
index fdf55c5..39fe10f 100644
--- a/eta.c
+++ b/eta.c
@@ -226,7 +226,8 @@ static int thread_eta(struct thread_data *td)
 	return eta_sec;
 }
 
-static void calc_rate(unsigned long mtime, unsigned long long *io_bytes,
+static void calc_rate(int unified_rw_rep, unsigned long mtime,
+		      unsigned long long *io_bytes,
 		      unsigned long long *prev_io_bytes, unsigned int *rate)
 {
 	int i;
@@ -235,19 +236,32 @@ static void calc_rate(unsigned long mtime, unsigned long long *io_bytes,
 		unsigned long long diff;
 
 		diff = io_bytes[i] - prev_io_bytes[i];
-		rate[i] = ((1000 * diff) / mtime) / 1024;
+		if (unified_rw_rep) {
+			rate[i] = 0;
+			rate[0] += ((1000 * diff) / mtime) / 1024;
+		} else
+			rate[i] = ((1000 * diff) / mtime) / 1024;
 
 		prev_io_bytes[i] = io_bytes[i];
 	}
 }
 
-static void calc_iops(unsigned long mtime, unsigned long long *io_iops,
+static void calc_iops(int unified_rw_rep, unsigned long mtime,
+		      unsigned long long *io_iops,
 		      unsigned long long *prev_io_iops, unsigned int *iops)
 {
 	int i;
 
 	for (i = 0; i < DDIR_RWDIR_CNT; i++) {
-		iops[i] = ((io_iops[i] - prev_io_iops[i]) * 1000) / mtime;
+		unsigned long long diff;
+
+		diff = io_iops[i] - prev_io_iops[i];
+		if (unified_rw_rep) {
+			iops[i] = 0;
+			iops[0] += (diff * 1000) / mtime;
+		} else
+			iops[i] = (diff * 1000) / mtime;
+
 		prev_io_iops[i] = io_iops[i];
 	}
 }
@@ -259,7 +273,7 @@ static void calc_iops(unsigned long mtime, unsigned long long *io_iops,
 int calc_thread_status(struct jobs_eta *je, int force)
 {
 	struct thread_data *td;
-	int i;
+	int i, unified_rw_rep;
 	unsigned long rate_time, disp_time, bw_avg_time, *eta_secs;
 	unsigned long long io_bytes[DDIR_RWDIR_CNT];
 	unsigned long long io_iops[DDIR_RWDIR_CNT];
@@ -293,7 +307,9 @@ int calc_thread_status(struct jobs_eta *je, int force)
 	io_bytes[DDIR_READ] = io_bytes[DDIR_WRITE] = io_bytes[DDIR_TRIM] = 0;
 	io_iops[DDIR_READ] = io_iops[DDIR_WRITE] = io_iops[DDIR_TRIM] = 0;
 	bw_avg_time = ULONG_MAX;
+	unified_rw_rep = 0;
 	for_each_td(td, i) {
+		unified_rw_rep += td->o.unified_rw_rep;
 		if (is_power_of_2(td->o.kb_base))
 			je->is_pow2 = 1;
 		if (td->o.bw_avg_time < bw_avg_time)
@@ -339,9 +355,15 @@ int calc_thread_status(struct jobs_eta *je, int force)
 
 		if (td->runstate > TD_RAMP) {
 			int ddir;
+
 			for (ddir = DDIR_READ; ddir < DDIR_RWDIR_CNT; ddir++) {
-				io_bytes[ddir] += td->io_bytes[ddir];
-				io_iops[ddir] += td->io_blocks[ddir];
+				if (unified_rw_rep) {
+					io_bytes[0] += td->io_bytes[ddir];
+					io_iops[0] += td->io_blocks[ddir];
+				} else {
+					io_bytes[ddir] += td->io_bytes[ddir];
+					io_iops[ddir] += td->io_blocks[ddir];
+				}
 			}
 		}
 	}
@@ -367,7 +389,8 @@ int calc_thread_status(struct jobs_eta *je, int force)
 	rate_time = mtime_since(&rate_prev_time, &now);
 
 	if (write_bw_log && rate_time > bw_avg_time && !in_ramp_time(td)) {
-		calc_rate(rate_time, io_bytes, rate_io_bytes, je->rate);
+		calc_rate(unified_rw_rep, rate_time, io_bytes, rate_io_bytes,
+				je->rate);
 		memcpy(&rate_prev_time, &now, sizeof(now));
 		add_agg_sample(je->rate[DDIR_READ], DDIR_READ, 0);
 		add_agg_sample(je->rate[DDIR_WRITE], DDIR_WRITE, 0);
@@ -382,8 +405,8 @@ int calc_thread_status(struct jobs_eta *je, int force)
 	if (!force && disp_time < 900)
 		return 0;
 
-	calc_rate(disp_time, io_bytes, disp_io_bytes, je->rate);
-	calc_iops(disp_time, io_iops, disp_io_iops, je->iops);
+	calc_rate(unified_rw_rep, disp_time, io_bytes, disp_io_bytes, je->rate);
+	calc_iops(unified_rw_rep, disp_time, io_iops, disp_io_iops, je->iops);
 
 	memcpy(&disp_prev_time, &now, sizeof(now));
 
diff --git a/fio.h b/fio.h
index 9e20299..2fd354a 100644
--- a/fio.h
+++ b/fio.h
@@ -237,6 +237,7 @@ struct thread_options {
 	unsigned int disable_clat;
 	unsigned int disable_slat;
 	unsigned int disable_bw;
+	unsigned int unified_rw_rep;
 	unsigned int gtod_reduce;
 	unsigned int gtod_cpu;
 	unsigned int gtod_offload;
diff --git a/options.c b/options.c
index 1009df3..799e77a 100644
--- a/options.c
+++ b/options.c
@@ -2497,6 +2497,13 @@ static struct fio_option options[FIO_MAX_OPTS] = {
 		.verify	= gtod_cpu_verify,
 	},
 	{
+		.name	= "unified_rw_reporting",
+		.type	= FIO_OPT_BOOL,
+		.off1	= td_var_offset(unified_rw_rep),
+		.help	= "Unify reporting across data direction",
+		.def	= "0",
+	},
+	{
 		.name	= "continue_on_error",
 		.type	= FIO_OPT_STR,
 		.off1	= td_var_offset(continue_on_error),
diff --git a/server.c b/server.c
index 0cc3fad..7ec8531 100644
--- a/server.c
+++ b/server.c
@@ -648,6 +648,7 @@ static void convert_gs(struct group_run_stats *dst, struct group_run_stats *src)
 
 	dst->kb_base	= cpu_to_le32(src->kb_base);
 	dst->groupid	= cpu_to_le32(src->groupid);
+	dst->unified_rw_rep	= cpu_to_le32(src->unified_rw_rep);
 }
 
 /*
@@ -669,8 +670,10 @@ void fio_server_send_ts(struct thread_stat *ts, struct group_run_stats *rs)
 
 	p.ts.error	= cpu_to_le32(ts->error);
 	p.ts.groupid	= cpu_to_le32(ts->groupid);
+	p.ts.unified_rw_rep	= cpu_to_le32(ts->unified_rw_rep);
 	p.ts.pid	= cpu_to_le32(ts->pid);
 	p.ts.members	= cpu_to_le32(ts->members);
+	p.ts.unified_rw_rep	= cpu_to_le32(ts->unified_rw_rep);
 
 	for (i = 0; i < DDIR_RWDIR_CNT; i++) {
 		convert_io_stat(&p.ts.clat_stat[i], &ts->clat_stat[i]);
diff --git a/server.h b/server.h
index 3f1bde4..15b802b 100644
--- a/server.h
+++ b/server.h
@@ -36,7 +36,7 @@ struct fio_net_int_cmd {
 };
 
 enum {
-	FIO_SERVER_VER		= 9,
+	FIO_SERVER_VER		= 10,
 
 	FIO_SERVER_MAX_PDU	= 1024,
 
diff --git a/stat.c b/stat.c
index 8e1034b..05a29f5 100644
--- a/stat.c
+++ b/stat.c
@@ -277,9 +277,9 @@ void show_group_stats(struct group_run_stats *rs)
 		p4 = num2str(rs->max_bw[i], 6, rs->kb_base, i2p);
 
 		log_info("%s: io=%sB, aggrb=%sB/s, minb=%sB/s, maxb=%sB/s,"
-			 " mint=%llumsec, maxt=%llumsec\n", ddir_str[i], p1, p2,
-						p3, p4, rs->min_run[i],
-						rs->max_run[i]);
+			 " mint=%llumsec, maxt=%llumsec\n",
+				rs->unified_rw_rep ? "  MIXED" : ddir_str[i],
+				p1, p2, p3, p4, rs->min_run[i], rs->max_run[i]);
 
 		free(p1);
 		free(p2);
@@ -381,8 +381,8 @@ static void show_ddir_status(struct group_run_stats *rs, struct thread_stat *ts,
 	iops_p = num2str(iops, 6, 1, 0);
 
 	log_info("  %s: io=%sB, bw=%sB/s, iops=%s, runt=%6llumsec\n",
-					ddir_str[ddir], io_p, bw_p, iops_p,
-					ts->runtime[ddir]);
+				rs->unified_rw_rep ? "mixed" : ddir_str[ddir],
+				io_p, bw_p, iops_p, ts->runtime[ddir]);
 
 	free(io_p);
 	free(bw_p);
@@ -1062,15 +1062,27 @@ void sum_thread_stats(struct thread_stat *dst, struct thread_stat *src, int nr)
 	int l, k;
 
 	for (l = 0; l < DDIR_RWDIR_CNT; l++) {
-		sum_stat(&dst->clat_stat[l], &src->clat_stat[l], nr);
-		sum_stat(&dst->slat_stat[l], &src->slat_stat[l], nr);
-		sum_stat(&dst->lat_stat[l], &src->lat_stat[l], nr);
-		sum_stat(&dst->bw_stat[l], &src->bw_stat[l], nr);
-
-		dst->io_bytes[l] += src->io_bytes[l];
-
-		if (dst->runtime[l] < src->runtime[l])
-			dst->runtime[l] = src->runtime[l];
+		if (!dst->unified_rw_rep) {
+			sum_stat(&dst->clat_stat[l], &src->clat_stat[l], nr);
+			sum_stat(&dst->slat_stat[l], &src->slat_stat[l], nr);
+			sum_stat(&dst->lat_stat[l], &src->lat_stat[l], nr);
+			sum_stat(&dst->bw_stat[l], &src->bw_stat[l], nr);
+
+			dst->io_bytes[l] += src->io_bytes[l];
+
+			if (dst->runtime[l] < src->runtime[l])
+				dst->runtime[l] = src->runtime[l];
+		} else {
+			sum_stat(&dst->clat_stat[0], &src->clat_stat[l], nr);
+			sum_stat(&dst->slat_stat[0], &src->slat_stat[l], nr);
+			sum_stat(&dst->lat_stat[0], &src->lat_stat[l], nr);
+			sum_stat(&dst->bw_stat[0], &src->bw_stat[l], nr);
+
+			dst->io_bytes[0] += src->io_bytes[l];
+
+			if (dst->runtime[0] < src->runtime[l])
+				dst->runtime[0] = src->runtime[l];
+		}
 	}
 
 	dst->usr_time += src->usr_time;
@@ -1091,14 +1103,24 @@ void sum_thread_stats(struct thread_stat *dst, struct thread_stat *src, int nr)
 		dst->io_u_lat_m[k] += src->io_u_lat_m[k];
 
 	for (k = 0; k < DDIR_RWDIR_CNT; k++) {
-		dst->total_io_u[k] += src->total_io_u[k];
-		dst->short_io_u[k] += src->short_io_u[k];
+		if (!dst->unified_rw_rep) {
+			dst->total_io_u[k] += src->total_io_u[k];
+			dst->short_io_u[k] += src->short_io_u[k];
+		} else {
+			dst->total_io_u[0] += src->total_io_u[k];
+			dst->short_io_u[0] += src->short_io_u[k];
+		}
 	}
 
 	for (k = 0; k < DDIR_RWDIR_CNT; k++) {
 		int m;
-		for (m = 0; m < FIO_IO_U_PLAT_NR; m++)
-			dst->io_u_plat[k][m] += src->io_u_plat[k][m];
+
+		for (m = 0; m < FIO_IO_U_PLAT_NR; m++) {
+			if (!dst->unified_rw_rep)
+				dst->io_u_plat[k][m] += src->io_u_plat[k][m];
+			else
+				dst->io_u_plat[0][m] += src->io_u_plat[k][m];
+		}
 	}
 
 	dst->total_run_time += src->total_run_time;
@@ -1210,6 +1232,7 @@ void show_run_stats(void)
 			ts->pid = td->pid;
 
 			ts->kb_base = td->o.kb_base;
+			ts->unified_rw_rep = td->o.unified_rw_rep;
 		} else if (ts->kb_base != td->o.kb_base && !kb_base_warned) {
 			log_info("fio: kb_base differs for jobs in group, using"
 				 " %u as the base\n", ts->kb_base);
@@ -1239,6 +1262,7 @@ void show_run_stats(void)
 		ts = &threadstats[i];
 		rs = &runstats[ts->groupid];
 		rs->kb_base = ts->kb_base;
+		rs->unified_rw_rep += ts->unified_rw_rep;
 
 		for (j = 0; j < DDIR_RWDIR_CNT; j++) {
 			if (!ts->runtime[j])
diff --git a/stat.h b/stat.h
index 4ca8261..97186c1 100644
--- a/stat.h
+++ b/stat.h
@@ -8,6 +8,7 @@ struct group_run_stats {
 	uint64_t agg[DDIR_RWDIR_CNT];
 	uint32_t kb_base;
 	uint32_t groupid;
+	uint32_t unified_rw_rep;
 };
 
 /*
@@ -120,6 +121,7 @@ struct thread_stat {
 	uint32_t pid;
 	char description[FIO_JOBNAME_SIZE];
 	uint32_t members;
+	uint32_t unified_rw_rep;
 
 	/*
 	 * bandwidth and latency stats

-- 
Jens Axboe


^ permalink raw reply related	[flat|nested] 16+ messages in thread

* RE: Group reporting with latency and IOPS
  2013-01-29 20:10             ` Jens Axboe
@ 2013-01-29 20:28               ` Neto, Antonio Jose Rodrigues
  2013-01-29 20:32                 ` Jens Axboe
  0 siblings, 1 reply; 16+ messages in thread
From: Neto, Antonio Jose Rodrigues @ 2013-01-29 20:28 UTC (permalink / raw)
  To: Jens Axboe; +Cc: fio@vger.kernel.org

On Tue, Jan 29 2013, Neto, Antonio Jose Rodrigues wrote:
> On Tue, Jan 29 2013, Neto, Antonio Jose Rodrigues wrote:
> > On Tue, Jan 29 2013, Neto, Antonio Jose Rodrigues wrote:
> > > atency: (clat) 577usecs - 0.577ms
> > > >
> > > >Correct too.
> > > >
> > > >> Am I doing the correct analysis?
> > > >
> > > >Yep.
> > > >
> > > >> One question is: Is it possible to have global IOPS and latency?
> > > >
> > > >You mean for both read and write combined? Fio does not report 
> > > >that, but for IOPS you could just add them. For latency, the larger of the two.
> > > >
> > > >--=20
> > > >Jens Axboe
> > > >
> > > 
> > > Hi Jens
> > > 
> > > This is neto from Brazil
> > > 
> > > How are you?
> > > 
> > > Thank you so much for your answer.
> > > 
> > > How can I have a combined IOPS reported?
> > 
> > You can't, at least not automatically. You would have to sum them up. 
> > It would not be hard to add at all, though, controlled by an option. 
> > I haven't had any requests for it before now, usually people ask for 
> > more fine grained metrics, not the other way around :-)
> > 
> > --
> > Jens Axboe
> > 
> > Thank you Jens, I understand. To have an option to group everything 
> > could be a good thing especially when you are doing a POC or 
> > demonstrating performance for a customer where they are interested 
> > in how many IOPS and total latency :-)
> 
> I agree, I can see the use case. I'll add a 'unified_rw_reporting'
> option to be able to do that. Most accounting is done collectively, so it should be pretty simple to do this.
> 
> --
> Jens Axboe
> 
> Thank you so much! I am starting to use FIO for all my performance 
> POCs here. I hope to have this option as soon as possible ... So I can 
> demonstrate next week.

The below should have a chance at working, though I haven't tested it much yet. Will try and find some time to do that shortly.

> One question: I am doing a PCO using Windows, and if I download all 
> changes via github how can I compile for Windows? (The POC is on 
> Windows :-)

Bruce, correct me if I'm wrong, but I'm pretty sure I saw a "How to build fio" setup guide from you at some point. If correct, can you post it here too? Antonio probably isn't the only one.

Jens, sorry to bother you again, but I am trying to apply the I've got this error. Could you please help me how to fix it?

Thank you neto

[root@mickey fio]# patch <a.diff
patching file client.c
Hunk #1 succeeded at 595 with fuzz 2.
patching file eta.c
patch: **** malformed patch at line 38: @@ -235,19 +236,32 @@ static void calc_rate(unsigned long mtime, unsigned long long *io_bytes,






diff --git a/client.c b/client.c
index 6021e4a..0dc620d 100644
--- a/client.c
+++ b/client.c
@@ -595,6 +595,7 @@ static void convert_ts(struct thread_stat *dst, struct thread_stat *src)
 	dst->groupid	= le32_to_cpu(src->groupid);
 	dst->pid	= le32_to_cpu(src->pid);
 	dst->members	= le32_to_cpu(src->members);
+	dst->unified_rw_rep	= le32_to_cpu(src->unified_rw_rep);
 
 	for (i = 0; i < DDIR_RWDIR_CNT; i++) {
 		convert_io_stat(&dst->clat_stat[i], &src->clat_stat[i]); @@ -667,6 +668,7 @@ static void convert_gs(struct group_run_stats *dst, struct group_run_stats *src)
 
 	dst->kb_base	= le32_to_cpu(src->kb_base);
 	dst->groupid	= le32_to_cpu(src->groupid);
+	dst->unified_rw_rep	= le32_to_cpu(src->unified_rw_rep);
 }
 
 static void handle_ts(struct fio_client *client, struct fio_net_cmd *cmd) @@ -687,6 +689,7 @@ static void handle_ts(struct fio_client *client, struct fio_net_cmd *cmd)
 
 	client_ts.members++;
 	client_ts.groupid = p->ts.groupid;
+	client_ts.unified_rw_rep = p->ts.unified_rw_rep;
 
 	if (++sum_stat_nr == sum_stat_clients) {
 		strcpy(client_ts.name, "All clients"); diff --git a/eta.c b/eta.c index fdf55c5..39fe10f 100644
--- a/eta.c
+++ b/eta.c
@@ -226,7 +226,8 @@ static int thread_eta(struct thread_data *td)
 	return eta_sec;
 }
 
-static void calc_rate(unsigned long mtime, unsigned long long *io_bytes,
+static void calc_rate(int unified_rw_rep, unsigned long mtime,
+		      unsigned long long *io_bytes,
 		      unsigned long long *prev_io_bytes, unsigned int *rate)  {
 	int i;
@@ -235,19 +236,32 @@ static void calc_rate(unsigned long mtime, unsigned long long *io_bytes,
 		unsigned long long diff;
 
 		diff = io_bytes[i] - prev_io_bytes[i];
-		rate[i] = ((1000 * diff) / mtime) / 1024;
+		if (unified_rw_rep) {
+			rate[i] = 0;
+			rate[0] += ((1000 * diff) / mtime) / 1024;
+		} else
+			rate[i] = ((1000 * diff) / mtime) / 1024;
 
 		prev_io_bytes[i] = io_bytes[i];
 	}
 }
 
-static void calc_iops(unsigned long mtime, unsigned long long *io_iops,
+static void calc_iops(int unified_rw_rep, unsigned long mtime,
+		      unsigned long long *io_iops,
 		      unsigned long long *prev_io_iops, unsigned int *iops)  {
 	int i;
 
 	for (i = 0; i < DDIR_RWDIR_CNT; i++) {
-		iops[i] = ((io_iops[i] - prev_io_iops[i]) * 1000) / mtime;
+		unsigned long long diff;
+
+		diff = io_iops[i] - prev_io_iops[i];
+		if (unified_rw_rep) {
+			iops[i] = 0;
+			iops[0] += (diff * 1000) / mtime;
+		} else
+			iops[i] = (diff * 1000) / mtime;
+
 		prev_io_iops[i] = io_iops[i];
 	}
 }
@@ -259,7 +273,7 @@ static void calc_iops(unsigned long mtime, unsigned long long *io_iops,  int calc_thread_status(struct jobs_eta *je, int force)  {
 	struct thread_data *td;
-	int i;
+	int i, unified_rw_rep;
 	unsigned long rate_time, disp_time, bw_avg_time, *eta_secs;
 	unsigned long long io_bytes[DDIR_RWDIR_CNT];
 	unsigned long long io_iops[DDIR_RWDIR_CNT]; @@ -293,7 +307,9 @@ int calc_thread_status(struct jobs_eta *je, int force)
 	io_bytes[DDIR_READ] = io_bytes[DDIR_WRITE] = io_bytes[DDIR_TRIM] = 0;
 	io_iops[DDIR_READ] = io_iops[DDIR_WRITE] = io_iops[DDIR_TRIM] = 0;
 	bw_avg_time = ULONG_MAX;
+	unified_rw_rep = 0;
 	for_each_td(td, i) {
+		unified_rw_rep += td->o.unified_rw_rep;
 		if (is_power_of_2(td->o.kb_base))
 			je->is_pow2 = 1;
 		if (td->o.bw_avg_time < bw_avg_time)
@@ -339,9 +355,15 @@ int calc_thread_status(struct jobs_eta *je, int force)
 
 		if (td->runstate > TD_RAMP) {
 			int ddir;
+
 			for (ddir = DDIR_READ; ddir < DDIR_RWDIR_CNT; ddir++) {
-				io_bytes[ddir] += td->io_bytes[ddir];
-				io_iops[ddir] += td->io_blocks[ddir];
+				if (unified_rw_rep) {
+					io_bytes[0] += td->io_bytes[ddir];
+					io_iops[0] += td->io_blocks[ddir];
+				} else {
+					io_bytes[ddir] += td->io_bytes[ddir];
+					io_iops[ddir] += td->io_blocks[ddir];
+				}
 			}
 		}
 	}
@@ -367,7 +389,8 @@ int calc_thread_status(struct jobs_eta *je, int force)
 	rate_time = mtime_since(&rate_prev_time, &now);
 
 	if (write_bw_log && rate_time > bw_avg_time && !in_ramp_time(td)) {
-		calc_rate(rate_time, io_bytes, rate_io_bytes, je->rate);
+		calc_rate(unified_rw_rep, rate_time, io_bytes, rate_io_bytes,
+				je->rate);
 		memcpy(&rate_prev_time, &now, sizeof(now));
 		add_agg_sample(je->rate[DDIR_READ], DDIR_READ, 0);
 		add_agg_sample(je->rate[DDIR_WRITE], DDIR_WRITE, 0); @@ -382,8 +405,8 @@ int calc_thread_status(struct jobs_eta *je, int force)
 	if (!force && disp_time < 900)
 		return 0;
 
-	calc_rate(disp_time, io_bytes, disp_io_bytes, je->rate);
-	calc_iops(disp_time, io_iops, disp_io_iops, je->iops);
+	calc_rate(unified_rw_rep, disp_time, io_bytes, disp_io_bytes, je->rate);
+	calc_iops(unified_rw_rep, disp_time, io_iops, disp_io_iops, je->iops);
 
 	memcpy(&disp_prev_time, &now, sizeof(now));
 
diff --git a/fio.h b/fio.h
index 9e20299..2fd354a 100644
--- a/fio.h
+++ b/fio.h
@@ -237,6 +237,7 @@ struct thread_options {
 	unsigned int disable_clat;
 	unsigned int disable_slat;
 	unsigned int disable_bw;
+	unsigned int unified_rw_rep;
 	unsigned int gtod_reduce;
 	unsigned int gtod_cpu;
 	unsigned int gtod_offload;
diff --git a/options.c b/options.c
index 1009df3..799e77a 100644
--- a/options.c
+++ b/options.c
@@ -2497,6 +2497,13 @@ static struct fio_option options[FIO_MAX_OPTS] = {
 		.verify	= gtod_cpu_verify,
 	},
 	{
+		.name	= "unified_rw_reporting",
+		.type	= FIO_OPT_BOOL,
+		.off1	= td_var_offset(unified_rw_rep),
+		.help	= "Unify reporting across data direction",
+		.def	= "0",
+	},
+	{
 		.name	= "continue_on_error",
 		.type	= FIO_OPT_STR,
 		.off1	= td_var_offset(continue_on_error),
diff --git a/server.c b/server.c
index 0cc3fad..7ec8531 100644
--- a/server.c
+++ b/server.c
@@ -648,6 +648,7 @@ static void convert_gs(struct group_run_stats *dst, struct group_run_stats *src)
 
 	dst->kb_base	= cpu_to_le32(src->kb_base);
 	dst->groupid	= cpu_to_le32(src->groupid);
+	dst->unified_rw_rep	= cpu_to_le32(src->unified_rw_rep);
 }
 
 /*
@@ -669,8 +670,10 @@ void fio_server_send_ts(struct thread_stat *ts, struct group_run_stats *rs)
 
 	p.ts.error	= cpu_to_le32(ts->error);
 	p.ts.groupid	= cpu_to_le32(ts->groupid);
+	p.ts.unified_rw_rep	= cpu_to_le32(ts->unified_rw_rep);
 	p.ts.pid	= cpu_to_le32(ts->pid);
 	p.ts.members	= cpu_to_le32(ts->members);
+	p.ts.unified_rw_rep	= cpu_to_le32(ts->unified_rw_rep);
 
 	for (i = 0; i < DDIR_RWDIR_CNT; i++) {
 		convert_io_stat(&p.ts.clat_stat[i], &ts->clat_stat[i]); diff --git a/server.h b/server.h index 3f1bde4..15b802b 100644
--- a/server.h
+++ b/server.h
@@ -36,7 +36,7 @@ struct fio_net_int_cmd {  };
 
 enum {
-	FIO_SERVER_VER		= 9,
+	FIO_SERVER_VER		= 10,
 
 	FIO_SERVER_MAX_PDU	= 1024,
 
diff --git a/stat.c b/stat.c
index 8e1034b..05a29f5 100644
--- a/stat.c
+++ b/stat.c
@@ -277,9 +277,9 @@ void show_group_stats(struct group_run_stats *rs)
 		p4 = num2str(rs->max_bw[i], 6, rs->kb_base, i2p);
 
 		log_info("%s: io=%sB, aggrb=%sB/s, minb=%sB/s, maxb=%sB/s,"
-			 " mint=%llumsec, maxt=%llumsec\n", ddir_str[i], p1, p2,
-						p3, p4, rs->min_run[i],
-						rs->max_run[i]);
+			 " mint=%llumsec, maxt=%llumsec\n",
+				rs->unified_rw_rep ? "  MIXED" : ddir_str[i],
+				p1, p2, p3, p4, rs->min_run[i], rs->max_run[i]);
 
 		free(p1);
 		free(p2);
@@ -381,8 +381,8 @@ static void show_ddir_status(struct group_run_stats *rs, struct thread_stat *ts,
 	iops_p = num2str(iops, 6, 1, 0);
 
 	log_info("  %s: io=%sB, bw=%sB/s, iops=%s, runt=%6llumsec\n",
-					ddir_str[ddir], io_p, bw_p, iops_p,
-					ts->runtime[ddir]);
+				rs->unified_rw_rep ? "mixed" : ddir_str[ddir],
+				io_p, bw_p, iops_p, ts->runtime[ddir]);
 
 	free(io_p);
 	free(bw_p);
@@ -1062,15 +1062,27 @@ void sum_thread_stats(struct thread_stat *dst, struct thread_stat *src, int nr)
 	int l, k;
 
 	for (l = 0; l < DDIR_RWDIR_CNT; l++) {
-		sum_stat(&dst->clat_stat[l], &src->clat_stat[l], nr);
-		sum_stat(&dst->slat_stat[l], &src->slat_stat[l], nr);
-		sum_stat(&dst->lat_stat[l], &src->lat_stat[l], nr);
-		sum_stat(&dst->bw_stat[l], &src->bw_stat[l], nr);
-
-		dst->io_bytes[l] += src->io_bytes[l];
-
-		if (dst->runtime[l] < src->runtime[l])
-			dst->runtime[l] = src->runtime[l];
+		if (!dst->unified_rw_rep) {
+			sum_stat(&dst->clat_stat[l], &src->clat_stat[l], nr);
+			sum_stat(&dst->slat_stat[l], &src->slat_stat[l], nr);
+			sum_stat(&dst->lat_stat[l], &src->lat_stat[l], nr);
+			sum_stat(&dst->bw_stat[l], &src->bw_stat[l], nr);
+
+			dst->io_bytes[l] += src->io_bytes[l];
+
+			if (dst->runtime[l] < src->runtime[l])
+				dst->runtime[l] = src->runtime[l];
+		} else {
+			sum_stat(&dst->clat_stat[0], &src->clat_stat[l], nr);
+			sum_stat(&dst->slat_stat[0], &src->slat_stat[l], nr);
+			sum_stat(&dst->lat_stat[0], &src->lat_stat[l], nr);
+			sum_stat(&dst->bw_stat[0], &src->bw_stat[l], nr);
+
+			dst->io_bytes[0] += src->io_bytes[l];
+
+			if (dst->runtime[0] < src->runtime[l])
+				dst->runtime[0] = src->runtime[l];
+		}
 	}
 
 	dst->usr_time += src->usr_time;
@@ -1091,14 +1103,24 @@ void sum_thread_stats(struct thread_stat *dst, struct thread_stat *src, int nr)
 		dst->io_u_lat_m[k] += src->io_u_lat_m[k];
 
 	for (k = 0; k < DDIR_RWDIR_CNT; k++) {
-		dst->total_io_u[k] += src->total_io_u[k];
-		dst->short_io_u[k] += src->short_io_u[k];
+		if (!dst->unified_rw_rep) {
+			dst->total_io_u[k] += src->total_io_u[k];
+			dst->short_io_u[k] += src->short_io_u[k];
+		} else {
+			dst->total_io_u[0] += src->total_io_u[k];
+			dst->short_io_u[0] += src->short_io_u[k];
+		}
 	}
 
 	for (k = 0; k < DDIR_RWDIR_CNT; k++) {
 		int m;
-		for (m = 0; m < FIO_IO_U_PLAT_NR; m++)
-			dst->io_u_plat[k][m] += src->io_u_plat[k][m];
+
+		for (m = 0; m < FIO_IO_U_PLAT_NR; m++) {
+			if (!dst->unified_rw_rep)
+				dst->io_u_plat[k][m] += src->io_u_plat[k][m];
+			else
+				dst->io_u_plat[0][m] += src->io_u_plat[k][m];
+		}
 	}
 
 	dst->total_run_time += src->total_run_time; @@ -1210,6 +1232,7 @@ void show_run_stats(void)
 			ts->pid = td->pid;
 
 			ts->kb_base = td->o.kb_base;
+			ts->unified_rw_rep = td->o.unified_rw_rep;
 		} else if (ts->kb_base != td->o.kb_base && !kb_base_warned) {
 			log_info("fio: kb_base differs for jobs in group, using"
 				 " %u as the base\n", ts->kb_base); @@ -1239,6 +1262,7 @@ void show_run_stats(void)
 		ts = &threadstats[i];
 		rs = &runstats[ts->groupid];
 		rs->kb_base = ts->kb_base;
+		rs->unified_rw_rep += ts->unified_rw_rep;
 
 		for (j = 0; j < DDIR_RWDIR_CNT; j++) {
 			if (!ts->runtime[j])
diff --git a/stat.h b/stat.h
index 4ca8261..97186c1 100644
--- a/stat.h
+++ b/stat.h
@@ -8,6 +8,7 @@ struct group_run_stats {
 	uint64_t agg[DDIR_RWDIR_CNT];
 	uint32_t kb_base;
 	uint32_t groupid;
+	uint32_t unified_rw_rep;
 };
 
 /*
@@ -120,6 +121,7 @@ struct thread_stat {
 	uint32_t pid;
 	char description[FIO_JOBNAME_SIZE];
 	uint32_t members;
+	uint32_t unified_rw_rep;
 
 	/*
 	 * bandwidth and latency stats

--
Jens Axboe



^ permalink raw reply related	[flat|nested] 16+ messages in thread

* Re: Group reporting with latency and IOPS
  2013-01-29 20:28               ` Neto, Antonio Jose Rodrigues
@ 2013-01-29 20:32                 ` Jens Axboe
  2013-01-29 20:40                   ` Neto, Antonio Jose Rodrigues
  2013-01-30  3:54                   ` Neto, Antonio Jose Rodrigues
  0 siblings, 2 replies; 16+ messages in thread
From: Jens Axboe @ 2013-01-29 20:32 UTC (permalink / raw)
  To: Neto, Antonio Jose Rodrigues; +Cc: fio@vger.kernel.org

On Tue, Jan 29 2013, Neto, Antonio Jose Rodrigues wrote:
> Jens, sorry to bother you again, but I am trying to apply the I've got this=
>  error. Could you please help me how to fix it?

I forgot to push a previous change out. Pull again and try applying,
should apply without fuzz.

-- 
Jens Axboe


^ permalink raw reply	[flat|nested] 16+ messages in thread

* RE: Group reporting with latency and IOPS
  2013-01-29 20:32                 ` Jens Axboe
@ 2013-01-29 20:40                   ` Neto, Antonio Jose Rodrigues
  2013-01-29 21:16                     ` Jens Axboe
  2013-01-30  3:54                   ` Neto, Antonio Jose Rodrigues
  1 sibling, 1 reply; 16+ messages in thread
From: Neto, Antonio Jose Rodrigues @ 2013-01-29 20:40 UTC (permalink / raw)
  To: Jens Axboe; +Cc: fio@vger.kernel.org

On Tue, Jan 29 2013, Neto, Antonio Jose Rodrigues wrote:
> Jens, sorry to bother you again, but I am trying to apply the I've got 
> this=  error. Could you please help me how to fix it?

I forgot to push a previous change out. Pull again and try applying, should apply without fuzz.

I am afraid that I am doing something wrong.... The latest change (pull) was in client.c. I pulled, copied the whole directory but same error. 

[root@mickey fio]# patch <a.diff
patching file client.c
Hunk #1 succeeded at 595 with fuzz 1.
patching file eta.c
patch: **** malformed patch at line 38: @@ -235,19 +236,32 @@ static void calc_rate(unsigned long mtime, unsigned long long *io_bytes,


^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: Group reporting with latency and IOPS
  2013-01-29 20:40                   ` Neto, Antonio Jose Rodrigues
@ 2013-01-29 21:16                     ` Jens Axboe
  0 siblings, 0 replies; 16+ messages in thread
From: Jens Axboe @ 2013-01-29 21:16 UTC (permalink / raw)
  To: Neto, Antonio Jose Rodrigues; +Cc: fio@vger.kernel.org

[-- Attachment #1: Type: text/plain, Size: 916 bytes --]

On Tue, Jan 29 2013, Neto, Antonio Jose Rodrigues wrote:
> On Tue, Jan 29 2013, Neto, Antonio Jose Rodrigues wrote:
> > Jens, sorry to bother you again, but I am trying to apply the I've got 
> > this=  error. Could you please help me how to fix it?
> 
> I forgot to push a previous change out. Pull again and try applying, should apply without fuzz.
> 
> I am afraid that I am doing something wrong.... The latest change (pull) was in client.c. I pulled, copied the whole directory but same error. 
> 
> [root@mickey fio]# patch <a.diff
> patching file client.c
> Hunk #1 succeeded at 595 with fuzz 1.
> patching file eta.c
> patch: **** malformed patch at line 38: @@ -235,19 +236,32 @@ static void calc_rate(unsigned long mtime, unsigned long long *io_bytes,

Your mailer or MTA has corrupted the patch. I've attached a zip file for
you, that has a better chance of surviving broken mail setups.

-- 
Jens Axboe


[-- Attachment #2: patch.zip --]
[-- Type: application/x-zip-compressed, Size: 3135 bytes --]

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: Group reporting with latency and IOPS
  2013-01-29 20:32                 ` Jens Axboe
  2013-01-29 20:40                   ` Neto, Antonio Jose Rodrigues
@ 2013-01-30  3:54                   ` Neto, Antonio Jose Rodrigues
  2013-01-30 11:08                     ` Jens Axboe
  1 sibling, 1 reply; 16+ messages in thread
From: Neto, Antonio Jose Rodrigues @ 2013-01-30  3:54 UTC (permalink / raw)
  To: Jens Axboe; +Cc: fio@vger.kernel.org

On 1/29/13 3:32 PM, "Jens Axboe" <axboe@kernel.dk> wrote:

>On Tue, Jan 29 2013, Neto, Antonio Jose Rodrigues wrote:
>> Jens, sorry to bother you again, but I am trying to apply the I've got
>>this=
>>  error. Could you please help me how to fix it?
>
>I forgot to push a previous change out. Pull again and try applying,
>should apply without fuzz.
>
>-- 
>Jens Axboe
>

Hi Jens,

This is neto from Brazil

How are you?

I applied the patch and everything is working. Here is one example:

Thank you very much

neto

-- Output file

workload: (groupid=0, jobs=20): err= 0: pid=2348: Tue Jan 29 22:51:43 2013
  mixed: io=879352KB, bw=168902KB/s, iops=21112 , runt= 30039msec
    slat (usec): min=3 , max=2296 , avg= 6.81, stdev= 4.62
    clat (usec): min=138 , max=248843 , avg=3619.87, stdev=7906.03
     lat (usec): min=145 , max=248863 , avg=3626.68, stdev=7905.91
    clat percentiles (usec):
     |  1.00th=[  350],  5.00th=[  454], 10.00th=[  516], 20.00th=[  724],
     | 30.00th=[  780], 40.00th=[  820], 50.00th=[  868], 60.00th=[  924],
     | 70.00th=[ 1048], 80.00th=[ 3760], 90.00th=[11584], 95.00th=[18304],
     | 99.00th=[39680], 99.50th=[50432], 99.90th=[76288], 99.95th=[90624],
     | 99.99th=[123392]
    bw (KB/s)  : min=  864, max= 9088, per=2.43%, avg=4100.05,
stdev=2630.65
    lat (usec) : 250=0.56%, 500=7.90%, 750=14.84%, 1000=44.16%
    lat (msec) : 2=9.40%, 4=3.46%, 10=7.59%, 20=7.80%, 50=3.77%
    lat (msec) : 100=0.48%, 250=0.03%
  cpu          : usr=0.00%, sys=0.00%, ctx=0, majf=0, minf=0
  IO depths    : 1=0.1%, 2=0.1%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%,
>=64=0.0%
     submit    : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%,
>=64=0.0%
     complete  : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%,
>=64=0.0%
     issued    : total=r=634207/w=0/d=0, short=r=0/w=0/d=0

Run status group 0 (all jobs):
  MIXED: io=4954.8MB, aggrb=168902KB/s, minb=168902KB/s, maxb=168902KB/s,
mint=3
0039msec, maxt=30039msec




-- Config File

[workload]
bs=8k
ioengine=windowsaio
iodepth=4
size=1024g
numjobs=20
direct=1
runtime=30
filename=\\.\PhysicalDrive1
filename=\\.\PhysicalDrive2
filename=\\.\PhysicalDrive3
filename=\\.\PhysicalDrive4
filename=\\.\PhysicalDrive5
filename=\\.\PhysicalDrive6
filename=\\.\PhysicalDrive7
filename=\\.\PhysicalDrive8
rw=randrw
rwmixread=80
rwmixwrite=20
thread
unified_rw_reporting=1
group_reporting=1
randrepeat=0



^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: Group reporting with latency and IOPS
  2013-01-30  3:54                   ` Neto, Antonio Jose Rodrigues
@ 2013-01-30 11:08                     ` Jens Axboe
  0 siblings, 0 replies; 16+ messages in thread
From: Jens Axboe @ 2013-01-30 11:08 UTC (permalink / raw)
  To: Neto, Antonio Jose Rodrigues; +Cc: fio@vger.kernel.org

On Wed, Jan 30 2013, Neto, Antonio Jose Rodrigues wrote:
> On 1/29/13 3:32 PM, "Jens Axboe" <axboe@kernel.dk> wrote:
> 
> >On Tue, Jan 29 2013, Neto, Antonio Jose Rodrigues wrote:
> >> Jens, sorry to bother you again, but I am trying to apply the I've got
> >>this=
> >>  error. Could you please help me how to fix it?
> >
> >I forgot to push a previous change out. Pull again and try applying,
> >should apply without fuzz.
> >
> >-- 
> >Jens Axboe
> >
> 
> Hi Jens,
> 
> This is neto from Brazil
> 
> How are you?
> 
> I applied the patch and everything is working. Here is one example:
> 
> Thank you very much
> 
> neto
> 
> -- Output file
> 
> workload: (groupid=0, jobs=20): err= 0: pid=2348: Tue Jan 29 22:51:43 2013
>   mixed: io=879352KB, bw=168902KB/s, iops=21112 , runt= 30039msec
>     slat (usec): min=3 , max=2296 , avg= 6.81, stdev= 4.62
>     clat (usec): min=138 , max=248843 , avg=3619.87, stdev=7906.03
>      lat (usec): min=145 , max=248863 , avg=3626.68, stdev=7905.91
>     clat percentiles (usec):
>      |  1.00th=[  350],  5.00th=[  454], 10.00th=[  516], 20.00th=[  724],
>      | 30.00th=[  780], 40.00th=[  820], 50.00th=[  868], 60.00th=[  924],
>      | 70.00th=[ 1048], 80.00th=[ 3760], 90.00th=[11584], 95.00th=[18304],
>      | 99.00th=[39680], 99.50th=[50432], 99.90th=[76288], 99.95th=[90624],
>      | 99.99th=[123392]
>     bw (KB/s)  : min=  864, max= 9088, per=2.43%, avg=4100.05,
> stdev=2630.65
>     lat (usec) : 250=0.56%, 500=7.90%, 750=14.84%, 1000=44.16%
>     lat (msec) : 2=9.40%, 4=3.46%, 10=7.59%, 20=7.80%, 50=3.77%
>     lat (msec) : 100=0.48%, 250=0.03%
>   cpu          : usr=0.00%, sys=0.00%, ctx=0, majf=0, minf=0
>   IO depths    : 1=0.1%, 2=0.1%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%,
> >=64=0.0%
>      submit    : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%,
> >=64=0.0%
>      complete  : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%,
> >=64=0.0%
>      issued    : total=r=634207/w=0/d=0, short=r=0/w=0/d=0
> 
> Run status group 0 (all jobs):
>   MIXED: io=4954.8MB, aggrb=168902KB/s, minb=168902KB/s, maxb=168902KB/s,
> mint=3
> 0039msec, maxt=30039msec

Excellent. Just need to check whether all cases are handled, then I will
get it committed.

-- 
Jens Axboe


^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: Group reporting with latency and IOPS
  2013-01-29 13:02 ` Jens Axboe
  2013-01-29 13:41   ` Neto, Antonio Jose Rodrigues
@ 2013-02-01  6:35   ` Georg Schönberger
  2013-02-01 10:13     ` Jens Axboe
  1 sibling, 1 reply; 16+ messages in thread
From: Georg Schönberger @ 2013-02-01  6:35 UTC (permalink / raw)
  To: Jens Axboe; +Cc: fio, Antonio Jose Rodrigues Neto

> On Mon, Jan 28 2013, Neto, Antonio Jose Rodrigues wrote:
> > Hi All,
> > 
> > This is neto from Brazil
> > 
> > How are you?
> > 
> > I just need a help to make sure I understood correctly the report
> > (see below --Output).
> > 
> > Trying to generate 80% Read and 20% Write - 8KB block size
> > 
> > Reads
> > IOPS: 15330
> > Latency: (clat) 628usecs - 0.628ms
> 
> Correct. Well 629 really, if rounded properly.
> 
> > Writes
> > IOPS: 3827
> > Latency: (clat) 577usecs - 0.577ms
> 
> Correct too.
> 
> > Am I doing the correct analysis?
> 
> Yep.
> 
> > One question is: Is it possible to have global IOPS and latency?
> 
> You mean for both read and write combined? Fio does not report that,
> but
> for IOPS you could just add them. For latency, the larger of the two.
> 

Hi Jens,

you say here that the total Latency for a mixed workload is the larger of the two.
Why is it not the sum of the two i.e.
Total Latency Read + Total Latency Write ?

Best Regards, Georg

> --
> Jens Axboe


^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: Group reporting with latency and IOPS
  2013-02-01  6:35   ` Georg Schönberger
@ 2013-02-01 10:13     ` Jens Axboe
  0 siblings, 0 replies; 16+ messages in thread
From: Jens Axboe @ 2013-02-01 10:13 UTC (permalink / raw)
  To: Georg Schönberger; +Cc: fio, Antonio Jose Rodrigues Neto

On Fri, Feb 01 2013, Georg Sch�nberger wrote:
> > On Mon, Jan 28 2013, Neto, Antonio Jose Rodrigues wrote:
> > > Hi All,
> > > 
> > > This is neto from Brazil
> > > 
> > > How are you?
> > > 
> > > I just need a help to make sure I understood correctly the report
> > > (see below --Output).
> > > 
> > > Trying to generate 80% Read and 20% Write - 8KB block size
> > > 
> > > Reads
> > > IOPS: 15330
> > > Latency: (clat) 628usecs - 0.628ms
> > 
> > Correct. Well 629 really, if rounded properly.
> > 
> > > Writes
> > > IOPS: 3827
> > > Latency: (clat) 577usecs - 0.577ms
> > 
> > Correct too.
> > 
> > > Am I doing the correct analysis?
> > 
> > Yep.
> > 
> > > One question is: Is it possible to have global IOPS and latency?
> > 
> > You mean for both read and write combined? Fio does not report that,
> > but
> > for IOPS you could just add them. For latency, the larger of the two.
> > 
> 
> Hi Jens,
> 
> you say here that the total Latency for a mixed workload is the larger of the two.
> Why is it not the sum of the two i.e.
> Total Latency Read + Total Latency Write ?

What I meant that it would be most logical to report the minimum of the
two for minimum latency, and the larger of the two for maximum latency.
That is what would have happened if there were indeed all the same type.
Mean and stddev should be summed appropriately.

For reporting, by definition of setting unified_rw_reporting, there is
not 'latency read' and 'latency write' (or 'latency trim'). There is
just single IO latency.

-- 
Jens Axboe


^ permalink raw reply	[flat|nested] 16+ messages in thread

end of thread, other threads:[~2013-02-01 10:14 UTC | newest]

Thread overview: 16+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-01-28 23:32 Group reporting with latency and IOPS Neto, Antonio Jose Rodrigues
2013-01-29 13:02 ` Jens Axboe
2013-01-29 13:41   ` Neto, Antonio Jose Rodrigues
2013-01-29 13:46     ` Jens Axboe
2013-01-29 13:49       ` Neto, Antonio Jose Rodrigues
2013-01-29 13:54         ` Jens Axboe
2013-01-29 13:58           ` Neto, Antonio Jose Rodrigues
2013-01-29 20:10             ` Jens Axboe
2013-01-29 20:28               ` Neto, Antonio Jose Rodrigues
2013-01-29 20:32                 ` Jens Axboe
2013-01-29 20:40                   ` Neto, Antonio Jose Rodrigues
2013-01-29 21:16                     ` Jens Axboe
2013-01-30  3:54                   ` Neto, Antonio Jose Rodrigues
2013-01-30 11:08                     ` Jens Axboe
2013-02-01  6:35   ` Georg Schönberger
2013-02-01 10:13     ` Jens Axboe

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox