smarter md minor search than "find_free_devnum" needed
Hi list,
I'm thinking about creation of many MD RAID 1 devices by automatic scripts. The MD minor numbers should be auto-determined. But if I do this with mdadm 3.2.5 and kernel 3.4.2 without udev, then it gets slower the more devices I create. I also had to patch mdadm to make "--symlinks=no" really work (preventing "/dev/md/*" symlinks to be created).
Looks like this:
# MDADM_NO_UDEV=1 mdadm -C auto --symlinks=no --assume-clean --force -l 1 -n 2 /dev/loop$i /dev/loop$j
Btw.: With udev it hangs for some seconds.
With this it is fast but can't use it for production (I only have the UUIDs):
# MDADM_NO_UDEV=1 mdadm -C /dev/md$k --assume-clean --force -l 1 -n 2 /dev/loop$i /dev/loop$j
What about caching the next free minor number in kernel space, taking it, finding the next free and updating it?
Or is there another possibility (putting this into a custom daemon should be avoided)?
If I identify the MD devices by UUID, I don't want to care which minor number they actually have upon creation/assembly.
Cheers,
Sebastian
Signature · 14 lines
Sebastian Riemer Linux Kernel Developer ProfitBricks GmbH • Greifswalder Str. 207 • 10405 Berlin, Germany www.profitbricks.com • [email protected] Sitz der Gesellschaft: Berlin Registergericht: Amtsgericht Charlottenburg, HRB 125506 B Geschäftsführer: Andreas Gauger, Achim Weiss -- To unsubscribe from this list: send the line "unsubscribe linux-raid" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
Hi all,
I've found a faster solution by reading the names of active MD devices from sysfs into memory and processing them from there. With 500 devices this lasts approx. 70 ms instead of 3 s with "find_free_devnum()" in mdadm.
Here I've got it as shell code. In C it can be implemented better.
#!/bin/bash
cd /sys/block
LIST=ls -1d md* 2>/dev/null | egrep -o '[0-9]*' | sort -n LIST_ARR=($LIST)
if [ "$LIST" == "" ]; then
echo "md0"
exit 0
fi
for ((i=0; i<1048575; i++)); do
if [ $i -ge ${#LIST_ARR[*]} ]; then
echo "md$i"
exit 0
elif [ ${LIST_ARR[$i]} -gt $i ]; then
echo "md$i"
exit 0 fi
done
exit 1
Of cause this needs locking until the MD device is created (further 0.8s).
Cheers,
Sebastian
Quoted 29 lines · Sebastian Riemer
Hi list,
I'm thinking about creation of many MD RAID 1 devices by automatic scripts. The MD minor numbers should be auto-determined. But if I do this with mdadm 3.2.5 and kernel 3.4.2 without udev, then it gets slower the more devices I create. I also had to patch mdadm to make "--symlinks=no" really work (preventing "
/dev/md/*" symlinks to be created).Looks like this:
# MDADM_NO_UDEV=1 mdadm -C auto --symlinks=no --assume-clean --force -l 1 -n 2/dev/loop$i/dev/loop$jBtw.: With udev it hangs for some seconds.
With this it is fast but can't use it for production (I only have the UUIDs):
# MDADM_NO_UDEV=1 mdadm -C/dev/md$k--assume-clean --force -l 1 -n 2/dev/loop$i/dev/loop$jWhat about caching the next free minor number in kernel space, taking it, finding the next free and updating it?
Or is there another possibility (putting this into a custom daemon should be avoided)?If I identify the MD devices by UUID, I don't want to care which minor number they actually have upon creation/assembly.
Cheers,
Sebastian