Google
  Web www.spinics.net

Re: Slow USB storage device?

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]


[ Moving Alan Stern and Greg to the cc, this seems to not be an USB issue 
  as much as a blkid and udev thing.  So I added util-linux-ng and Karel 
  and Kay to the recipients list..

  Background: I have a _really_ slow USB disk-like device. Or more 
  properly, my wife does - it's an embroidery machine that has a USB 
  storage interface. And the thing gets about 16kB/s.

  Yes. 16 _kB_ per second. Not MB. Which is actually perfectly fine, since 
  the designs you upload to it are generally in the 20kB range. Who cares 
  how fast or slow it is?

  Except it takes about half a minute to show up as a disk, because udev 
  and blkid take _forever_, and try to read a hell of a lot more than 
  they should. Can somebody please fix this? ]

On Thu, 14 Jan 2010, Linus Torvalds wrote:
> 
> Right you are. dmesg shows /dev/sdc1, but udev hasn't actually created the 
> file yet. 

Yeah, and it is indeed waiting for blkid (and then later apparently 
hald-probe-volume). I had stupidly thought that udev would create the 
trivial device names that don't need any translation immediately. Not so.

> I've seen it with two very different computers, so I don't think that's 
> it. But I did use the same cable etc, so who knows..

Tried a third computer, and different cable. Same deal. Except now your 
hint made me look at what's going on, and it is indeed all waiting for 
some ID that will never give any interesting results.

On a Fedora-12 machine, it's /sbin/blkid, on an older setup it seems to be 
/lib/udev/vol_id like Alan said.

And it really is the same speed on all computers, so it's simply that the 
hardware really is that slow. 16kB/s.

> > Probably they are caused by udev and hal.  Those packages each include
> > a program that scans new drives and partitions looking for volume IDs:
> > 
> > 	/lib/udev/vol_id
> > 	/usr/libexec/hald-probe-{volume or storage, I forget which}
> 
> Will try. Will also double-check with a third computer and a different 
> cable, just in case.

Well, I can make those go away, and then the device shows up largely 
immediately. However, then I still don't get the automagic mount, so it 
looks like the fundamental problem is how blkid/vol_id is really slow, and 
after being really slow it still doesn't actually get any ID.

On that machine, with the embroidery machine plugged in:

	[root@EeePC torvalds]# time blkid -o udev -p /dev/sdc
	
	real	0m13.736s
	user	0m0.002s
	sys	0m0.007s

and:

	[root@EeePC torvalds]# time blkid -o udev -p /dev/sdc1
	ID_FS_SEC_TYPE=msdos
	ID_FS_VERSION=FAT12
	ID_FS_TYPE=vfat
	ID_FS_USAGE=filesystem
	
	real	0m13.491s
	user	0m0.003s
	sys	0m0.005s

ie it took a total of 27s+ to just do blkid on first the whole disk (which 
had nothing on it, of course), and then the first partition (which just 
has an empty FAT filesystem on it).

Half a minute to figure out something like that, and then it doesn't even 
mount anything, apparently because it has no UUID!

The reason is almost purely that it does this:

	15:51:05.466494 _llseek(3, 0, [0], SEEK_SET) = 0 <0.000107>
	15:51:05.466930 read(3, ""..., 69632) = 69632 <8.186289>

ie it does that one large read (which is indeed big enough that the kernel 
will start read-ahead, so the 68kB read turns into a 120kB one)

There's a few other ones that are in the "just under a second" range 
because this thing is a really slow disk, but that one read obviously 
accounts for 60% of it all.

After it has done the blkid on both devices, it then also does

	/lib/udev/devkit-disks-part-id /dev/.tmp-block-8:33

which takes an additional second, and results in

	Entering MS-DOS parser (offset=0, size=505856)
	MSDOS_MAGIC found
	looking at part 0 (offset 16384, size 505344, type 0x01)
	new part entry
	looking at part 1 (offset 0, size 0, type 0x00)
	new part entry
	looking at part 2 (offset 0, size 0, type 0x00)
	new part entry
	looking at part 3 (offset 0, size 0, type 0x00)
	new part entry
	Exiting MS-DOS parser
	MSDOS partition table detected
	DKD_PARTITION=1
	DKD_PARTITION_SCHEME=mbr
	DKD_PARTITION_NUMBER=1
	DKD_PARTITION_TYPE=0x01
	DKD_PARTITION_SIZE=505344
	DKD_PARTITION_LABEL=
	DKD_PARTITION_UUID=
	DKD_PARTITION_FLAGS=boot

so that udev tool gets all the same information, and does it _much_ 
faster.

So a few questions:

 - can we please not use 'blkid' at all in udev? It looks like the udev 
   native 'devkit-disks-part-id' is much better at this, and since udev 
   does it _anyway_ afterwards, how about doing it up-front instead?

 - maybe blkid could be improved to not be such a pig. Even if you don't 
   have a really slow device like mine, I bet people could see some of the 
   same issues with a USB floppy drive.

 - Why do we try to even identify /dev/sdc, when the kernel has already 
   partitioned it and we'd be much better identifying just the partition?

 - What am I supposed to do with a disk that has no UUID? It doesn't get 
   mounted by hald at all. That kind of sucks. I'd like to see the 
   filesystem, despite it not having an ID. Or maybe it doesn't get 
   mounted for some other reason (I thought it was just because everything 
   was so slow and the disk read failed when it tried to mount things, but 
   since this is all driven by udev anyway, I'm now assuming that that 
   wasn't the case, and it's the missing uuid)

And no, I can't just add a UUID to the thing. It's a piece of external 
hardware with odd firmware that I don't control.

			Linus
--
To unsubscribe from this list: send the line "unsubscribe util-linux-ng" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Site Home]     [Netdev]     [Ethernet Bridging]     [Linux Wireless]     [Kernel Newbies]     [Memory]     [Security]     [Linux for Hams]     [Netfilter]     [Bugtraq]     [Rubini]     [Photo]     [Yosemite]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux RAID]     [Linux Admin]     [Samba]     [Video 4 Linux]     [Linux Resources]

Powered by Linux