war story: some USB flash memories are very slow

D. Hugh Redelmeier hugh-pmF8o41NoarQT0dZR+AlfA at public.gmane.org
Tue Dec 10 20:39:39 UTC 2013


TL;DR:

When dding to a raw USB flash memory, you can save perhaps half the
time by:

1) using a reasonably sized buffer.  1M seems enough.
2) using direct I/O.

Example:
	dd if=Fedora-20-Beta-x86_64-DVD.iso of=/dev/sdi oflag=direct bs=16M && eject /dev/sdi


The Story
=========

The "normal" way of installing Fedora is via DVD.  There are other ways, 
such as over the LAN.

I don't want to waste DVDs, so I like to use a USB flash memory stick.

Today I downloaded and installed the Fedora 20 beta.  This was the install 
DVD image, not the live image.

I dded the image to a USB stick.  This seems to be the way you have to do 
it for this image.  The dd took 36 minutes for 4.6 GB.  That seems very 
slow to me.  That's about 20k / second.

The command was:
	time sudo dd if=Fedora-20-Beta-x86_64-DVD.iso of=/dev/sdi
The time might be an underestimate because some blocks were probably not 
yet flushed to the stick.

Should I have specified a (larger) block size?  I assume that caching 
makes that moot.

[enter Science Mode]

Apparatus:

- desktop computer:  I7-4770 processor, 24G RAM, Fedora 19 desktop with 
  some firefox windows/tabs open

- source file is on an SSD.  In fact everything is.

- USB stick: Kingston 8GB DataTraveler 101.  Not known for speed.

Should I have used the direct I/O and a larger block size?
This command took only 20 minutes:
	time sudo dd if=Fedora-20-Beta-x86_64-DVD.iso of=/dev/sdi oflag=direct bs=1M
Seems to make a significant difference.

Is caching distorting things?
Right after the previous command, I did the following:
	time sudo dd if=Fedora-20-Beta-x86_64-DVD.iso of=/dev/sdi bs=1M
and it took only 12 seconds!
But then I did:
	time sync
and that took 31.5 minutes!
So caching significantly distorts timing.


Time for fresh experiments.

su for these (to avoid possible sudo password delays).

Eject USB drive & reinsert, clearing all caching:
	eject /dev/sdi
	# remove and re-insert USB drive
	umount /dev/sdi1

Time the naive dd:
	time dd if=Fedora-20-Beta-x86_64-DVD.iso of=/dev/sdi ; time eject /dev/sdi
real    38m7.526s
real    0m0.254s
Note: almost no time required for flushing the cache (eject must do
that).  Quite surprising.

Re-insert drive & unmount.

Time the naive dd with a larger buffer:
	time dd if=Fedora-20-Beta-x86_64-DVD.iso of=/dev/sdi bs=1M ; time eject /dev/sdi
real    31m54.402s
real    0m0.733s
Note: larger buffer made a difference even when going through buffer
cache.

Re-insert drive & unmount.

time the direct I/O version with a larger buffer:
	time dd if=Fedora-20-Beta-x86_64-DVD.iso of=/dev/sdi oflag=direct bs=1M ; time eject /dev/sdi
real    20m7.544s
real    0m0.003s
Note: direct I/O made a significant difference.

Re-insert drive & unmount.

time the direct I/O version with a still larger buffer:
	time dd if=Fedora-20-Beta-x86_64-DVD.iso of=/dev/sdi oflag=direct bs=16M ; time eject /dev/sdi
real    20m7.903s
real    0m0.004s
Note: the still larger buffer made no difference with direct I/O.

I'm too lazy to try smaller sizes: I can easily spare 1M of RAM for
this command.
--
The Toronto Linux Users Group.      Meetings: http://gtalug.org/
TLUG requests: Linux topics, No HTML, wrap text below 80 columns
How to UNSUBSCRIBE: http://gtalug.org/wiki/Mailing_lists





More information about the Legacy mailing list