Skip to contentSkip to conversation

Recovery speed at 1MB/s/device, unable to change

DISCUSSION Anssi Hannula 2 participants 6 messages Apr 23, 2006 – Apr 24, 2006 MD RAID

lore
Share & tools
lore
#0 lore raw

I created a raid array:
---

# mdadm --create /dev/md_d0 -ap --level=5 --raid-devices=2 \
/dev/sda1 missing
---

Then partitioned it:
---
# LANGUAGE=C fdisk -l /dev/md_d0

Disk /dev/md_d0: 250.0 GB, 250056605696 bytes
2 heads, 4 sectors/track, 61048976 cylinders
Units = cylinders of 8 * 512 = 4096 bytes

      Device Boot      Start         End      Blocks   Id  System
/dev/md_d0p1               1    61048976   244195902   83  Linux

---

Then made a ext3 filesystem in /dev/md_d0p1 with mke2fs.

Then I added another device:
---

# mdadm --manage /dev/md_d0 --add /dev/sdb1
---

Currently status is:
---

# cat /proc/mdstat
Personalities : [raid0] [raid5] [raid4]
md_d0 : active raid5 sdb1[2] sda1[0]
      244195904 blocks level 5, 64k chunk, algorithm 2 [2/1] [U_]
      [>....................]  recovery =  1.0% (2588800/244195904)
finish=2100.4min speed=1916K/sec

unused devices: <none>
---

The speed is only 2000K/sec, even after I set:
---

# cat /proc/sys/dev/raid/speed_limit_min
10000
# cat /proc/sys/dev/raid/speed_limit_max
400000
---

The system is about 90% idle, so there should be more bandwidth.

---

# cat /proc/version
Linux version 2.6.17-rc2-git4 ([email protected]) (gcc version 4.0.1
(4.0.1-5mdk for Mandriva Linux release 2006.0)) #1 Sun Apr 23 00:56:30
EEST 2006
---

Any tips?

Signature · 1 line
Anssi Hannula
#1 lore raw
Quoted 8 lines · Anssi Hannula

The speed is only 2000K/sec, even after I set:
---

# cat /proc/sys/dev/raid/speed_limit_min
10000
# cat /proc/sys/dev/raid/speed_limit_max
400000
---
Quoted 8 lines

The system is about 90% idle, so there should be more bandwidth.

---

# cat /proc/version
Linux version 2.6.17-rc2-git4 ([email protected]) (gcc version 4.0.1
(4.0.1-5mdk for Mandriva Linux release 2006.0)) #1 Sun Apr 23 00:56:30
EEST 2006
---

Hmm... I don't know if this is related, but something seems to be really wrong.

I run the following set of commands:

# dd if=/dev/zero of=ohase count=5K
# dd if=/dev/zero of=ohase2 count=5K
# losetup /dev/loop0 ohase
# losetup /dev/loop1 ohase2
# mdadm --create /dev/md_d1 -ap --level=5 --raid-devices=2 /dev/loop0
missing
# fdisk /dev/md_d1
(created one partition)
# mkfs.ext3 /dev/md_d1p1
# mount /dev/md_d1p1 /mnt/test
# echo jopajoo > /mnt/iso/test
# mdadm --manage /dev/md_d1 --add /dev/loop1
# mdadm --grow /dev/md_d1 --raid-devices=3 --backup-file backupfile
mdadm: Need to backup 128K of critical section..
mdadm: /dev/md_d1: Cannot get array details from sysfs

Strace shows that it's trying to access
"/sys/block/md_d4/md/component_size".

Why is this?

Signature · 1 line
Anssi Hannula
#2 lore raw
Quoted 8 lines · On Monday April 24, [email protected] wrote:
# mdadm --grow /dev/md_d1 --raid-devices=3 --backup-file backupfile
mdadm: Need to backup 128K of critical section..
mdadm: /dev/md_d1: Cannot get array details from sysfs

Strace shows that it's trying to access
"/sys/block/md_d4/md/component_size".

Why is this?

Because I didn't test my code properly :-(

Following patch should fix it.

Re: the recovery speed problem: I would try dding from one drive to the other and see what sort of speed you get then:
dd if=/dev/sda of=/dev/sdb bs=1024k count=1000
or something like that.

Thanks,
NeilBrown

### Diffstat output

 ./sysfs.c |    2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
sysfs.c renamed from sysfs.c~current~ +1 -1
diff ./sysfs.c~current~ ./sysfs.c
@@ -206,7 +206,7 @@ unsigned long long get_component_size(in
 			minor(stb.st_rdev));
 	else
 		sprintf(fname, "/sys/block/md_d%d/md/component_size",
-			minor(stb.st_rdev)/16);
+			minor(stb.st_rdev)/64);
 	fd = open(fname, O_RDONLY);
 	if (fd < 0)
 		return 0;
#3 lore raw

(sorry, prev post missed the list)

Quoted 9 lines · Neil Brown
Quoted 7 lines · On Monday April 24, [email protected] wrote:
# mdadm --grow /dev/md_d1 --raid-devices=3 --backup-file backupfile
mdadm: Need to backup 128K of critical section..
mdadm: /dev/md_d1: Cannot get array details from sysfs

Strace shows that it's trying to access
"/sys/block/md_d4/md/component_size".

Quoted 6 lines
Quoted 1 line

Why is this?

Because I didn't test my code properly :-(

Following patch should fix it.

Okay, will test.

Quoted 4 lines

Re: the recovery speed problem: I would try dding from one drive to the other and see what sort of speed you get then:
dd if=/dev/sda of=/dev/sdb bs=1024k count=1000
or something like that.

# export LANGUAGE=C; export LANG=C; export LC_ALL=C; date; dd
if=/dev/sda skip=20000 of=/dev/sdb bs=1024k count=1000; date
Mon Apr 24 01:14:48 EEST 2006
1000+0 records in
1000+0 records out
Mon Apr 24 01:15:42 EEST 2006

So the speed is about 20MB/s.

Signature · 1 line
Anssi Hannula
#4 lore raw
In reply to Neil Brown

(resend, prev post missed the list)

Quoted 9 lines · Neil Brown
Quoted 7 lines · On Monday April 24, [email protected] wrote:
# mdadm --grow /dev/md_d1 --raid-devices=3 --backup-file backupfile
mdadm: Need to backup 128K of critical section..
mdadm: /dev/md_d1: Cannot get array details from sysfs

Strace shows that it's trying to access
"/sys/block/md_d4/md/component_size".

Quoted 7 lines
Quoted 1 line

Why is this?

Because I didn't test my code properly :-(

Following patch should fix it.

It appears you missed another occurrence (patch attached).

However, it got stuck after
mdadm: Need to backup 128K of critical section..

I did ctrl-c, and according to /proc/mdstat it was successfully reshaped, nor can I restart the reshape.

But "umount /mnt/test" (/mnt/test is where /dev/md_d1p1 is mounted) blocks, and this time it becomes unkillable.

/proc/mdstat reports:
md_d1 : active raid5 loop1[1] loop0[0]

      4992 blocks level 5, 64k chunk, algorithm 2 [3/2] [UU_]
Signature · 1 line
Anssi Hannula
sysfs.c renamed from sysfs.c.old +1 -1
@@ -69,7 +69,7 @@
 			sprintf(sra->name, "md%d", minor(stb.st_rdev));
 		else
 			sprintf(sra->name, "md_d%d",
-				minor(stb.st_rdev)/16);
+				minor(stb.st_rdev)/64);
 	} else {
 		if (devnum >= 0)
 			sprintf(sra->name, "md%d", devnum);
#5 lore raw
Quoted 17 lines · Anssi Hannula
Quoted 15 lines · Neil Brown
Quoted 8 lines · On Monday April 24, [email protected] wrote:
# mdadm --grow /dev/md_d1 --raid-devices=3 --backup-file backupfile
mdadm: Need to backup 128K of critical section..
mdadm: /dev/md_d1: Cannot get array details from sysfs

Strace shows that it's trying to access
"/sys/block/md_d4/md/component_size".

Why is this?

Because I didn't test my code properly :-(

Quoted 7 lines
Quoted 2 lines

Following patch should fix it.

It appears you missed another occurrence (patch attached).

However,

[...strange problems...]

The rest of my problems, including the slow speed of reconstruction were solved by reboot and I'm unable to reproduce them.

Neil, thank you very much for the speedy replies :)

Signature · 1 line
Anssi Hannula