2007-10-09 13:50:37

by Michael Stiller

[permalink] [raw]
Subject: howto boost write(2) performance?

Hi list,

i'm developing an application (in C) which needs to write about
1Gbit/s (125Mb/s) to a disk array attached via U320 SCSI.
It runs on Dual Core 2 Xeons @2Ghz utilizing kernel 2.6.22.7.

I buffer the data in (currently 4) 400Mb buffers and use write(2) in a
dedicated thread to write them to the raw disk (no fs).

The write(2) performance is not good enough, the writer threads take to
much time, and i ask you for ideas, howto to boost the write
performance.

Maybe mmaping the disk would work?

Cheers,

-Michael

PS. I would like to be cc'd as i usually don't read the list due to high
traffic.


2007-10-09 14:22:22

by Gustavo Chain

[permalink] [raw]
Subject: Re: howto boost write(2) performance?

El Tue, 09 Oct 2007 15:50:17 +0200
Michael Stiller <[email protected]> escribiĆ³:

> Hi list,
>
> i'm developing an application (in C) which needs to write about
> 1Gbit/s (125Mb/s) to a disk array attached via U320 SCSI.
> It runs on Dual Core 2 Xeons @2Ghz utilizing kernel 2.6.22.7.
>
> I buffer the data in (currently 4) 400Mb buffers and use write(2) in a
> dedicated thread to write them to the raw disk (no fs).
>
> The write(2) performance is not good enough, the writer threads take
> to much time, and i ask you for ideas, howto to boost the write
> performance.
>
> Maybe mmaping the disk would work?
>
> Cheers,
>
> -Michael
>
> PS. I would like to be cc'd as i usually don't read the list due to
> high traffic.
>
> -
> To unsubscribe from this list: send the line "unsubscribe
> linux-kernel" in the body of a message to [email protected]
> More majordomo info at http://vger.kernel.org/majordomo-info.html
> Please read the FAQ at http://www.tux.org/lkml/

Create a 1GB ram disk, write data there, and then backup into a hard
disk

--
Gustavo ChaĆ­n Dumit

2007-10-09 14:56:18

by Andi Kleen

[permalink] [raw]
Subject: Re: howto boost write(2) performance?

Michael Stiller <[email protected]> writes:
>
> The write(2) performance is not good enough, the writer threads take to
> much time, and i ask you for ideas, howto to boost the write
> performance.

You could use an O_DIRECT write if the data is suitably aligned
and your IO sizes are big enough (O_DIRECT is usually a loss
on small IOs). It will also be synchronous, but if you do it
from a separate thread anyways that should be fine.

-Andi

2007-10-09 15:42:24

by Boaz Harrosh

[permalink] [raw]
Subject: Re: howto boost write(2) performance?

On Tue, Oct 09 2007 at 16:56 +0200, Andi Kleen <[email protected]> wrote:
> Michael Stiller <[email protected]> writes:
>> The write(2) performance is not good enough, the writer threads take to
>> much time, and i ask you for ideas, howto to boost the write
>> performance.
>
> You could use an O_DIRECT write if the data is suitably aligned
> and your IO sizes are big enough (O_DIRECT is usually a loss
> on small IOs). It will also be synchronous, but if you do it
> from a separate thread anyways that should be fine.
>
> -Andi

If your target is a SCSI target you can gain up to 15% by using
sg. Search on the net for the "sg utils" package. The source code
of sg_dd and others are a grate example of how to do it.

Other wise O_DIRECT is your friend. Also look for asynchronous
I/O so you have a few pending IO buffers to keep the pipes full.

Boaz

2007-10-09 16:26:32

by Michael Tokarev

[permalink] [raw]
Subject: Re: howto boost write(2) performance?

Boaz Harrosh wrote:
[]
> If your target is a SCSI target you can gain up to 15% by using
> sg. Search on the net for the "sg utils" package. The source code
> of sg_dd and others are a grate example of how to do it.
>
> Other wise O_DIRECT is your friend. Also look for asynchronous
> I/O so you have a few pending IO buffers to keep the pipes full.

What's the advantage of sg_io over O_DIRECT to the block device?
I think sg devices are being (slowly?) obsoleted since most stuff
which has been in sg now works over normal block device, no?
At least, I haven't seen any significant difference between
sg_dd and dd with oflag=direct.

Thanks.

/mjt

2007-10-10 02:57:23

by Nick Piggin

[permalink] [raw]
Subject: Re: howto boost write(2) performance?

On Tuesday 09 October 2007 23:50, Michael Stiller wrote:
> Hi list,
>
> i'm developing an application (in C) which needs to write about
> 1Gbit/s (125Mb/s) to a disk array attached via U320 SCSI.
> It runs on Dual Core 2 Xeons @2Ghz utilizing kernel 2.6.22.7.
>
> I buffer the data in (currently 4) 400Mb buffers and use write(2) in a
> dedicated thread to write them to the raw disk (no fs).
>
> The write(2) performance is not good enough, the writer threads take to
> much time, and i ask you for ideas, howto to boost the write
> performance.

The kernel really cannot sustain 125MB/s? I assume the disk
array is capable?

Where is the bottleneck? Does it keep all disks busy, or are
the CPUs overloaded?

2007-10-10 06:26:48

by Michael Stiller

[permalink] [raw]
Subject: Re: howto boost write(2) performance?


>
> The kernel really cannot sustain 125MB/s? I assume the disk
> array is capable?

Yes, the array should be capable, LSI controller U320, SATA disks inside
the array.

> Where is the bottleneck? Does it keep all disks busy, or are
> the CPUs overloaded?

I'm not sure where the bottleneck is. CPU Load goes up with
many pdflush processes in D state.

Thanks for the suggestions with sg and O_DIRECT so far,
will try this.

-Michael



2007-10-11 13:50:43

by Michael Stiller

[permalink] [raw]
Subject: Re: howto boost write(2) performance?

On Tue, 2007-10-09 at 16:56 +0200, Andi Kleen wrote:
> Michael Stiller <[email protected]> writes:
> >
> > The write(2) performance is not good enough, the writer threads take to
> > much time, and i ask you for ideas, howto to boost the write
> > performance.
>
> You could use an O_DIRECT write if the data is suitably aligned
> and your IO sizes are big enough (O_DIRECT is usually a loss
> on small IOs). It will also be synchronous, but if you do it
> from a separate thread anyways that should be fine.

Thanks to all who answered and especially to Andi. Using O_DIRECT did
the trick.

Cheers,

Michael


2007-10-17 22:10:41

by Bill Davidsen

[permalink] [raw]
Subject: Re: howto boost write(2) performance?

Michael Stiller wrote:
> Hi list,
>
> i'm developing an application (in C) which needs to write about
> 1Gbit/s (125Mb/s) to a disk array attached via U320 SCSI.
> It runs on Dual Core 2 Xeons @2Ghz utilizing kernel 2.6.22.7.

People regularly report speeds higher than that on the RAID list, and I
can get that order of magnitude speed using dd with 1MB buffers to a
software RAID-0 array or cheap SATA drives. Are you using a decent
controller? Many "RAID" controllers have bandwidth limitations, buffer
size issues, etc. I had some chea "SCSI" arrays which were just SCSI
controllers in from of a bunch of cheap, slow, non-SCSI drives.
>
> I buffer the data in (currently 4) 400Mb buffers and use write(2) in a
> dedicated thread to write them to the raw disk (no fs).

I would limit the write size to a MB and see if that helps, regardless
of the buffer size. A circular queue of smaller buffers, like ptbuf, may
perform better.

>
> The write(2) performance is not good enough, the writer threads take to
> much time, and i ask you for ideas, howto to boost the write
> performance.
>
> Maybe mmaping the disk would work?

I don't think it would help, I'd really try limiting the size of the
write() calls first, assuming your hardware is adequate.

--
Bill Davidsen <[email protected]>
"We have more to fear from the bungling of the incompetent than from
the machinations of the wicked." - from Slashdot