]> git.ipfire.org Git - thirdparty/dracut.git/commit - dracut-functions.sh
fix(dracut-functions): implement a cache for get_maj_min
authorRenaud Métrich <rmetrich@redhat.com>
Wed, 5 May 2021 13:46:08 +0000 (15:46 +0200)
committerHarald Hoyer <harald@hoyer.xyz>
Thu, 6 May 2021 07:14:10 +0000 (09:14 +0200)
commitc3bb9d18dceed7db6d16f9c2a7f682c5934099d7
tree1dcadc8068b2eec978e318838d3ddb312aae0a3a
parent543b8014fc10fc6a92ba83db0dfc994fc1d2129b
fix(dracut-functions): implement a cache for get_maj_min

On systems with a large number of devices, usually multipath devices,
dracut can spend a lot of time stat'ing the devices to collect the
major/minor numbers, leading to huge slowness rebuilding the initramfs
when stat'ing devices is slow (seen with oracleasm file systems in
particular).
This commit implements a basic cache stored in a file under
DRACUT_TMPDIR storing the major:minor corresponding to the specified
device.

Reproducer: create N loopback devices used as a LVM extension to volume
group hosting the root file system

  # LVMVG="rhel"
  # NDEVICES=200
  # mkdir devices; for i in $(seq 1 $NDEVICES); do
    truncate -s 10m devices/$i; losetup loop$i devices/$i
  done
  # vgextend $LVMVG $(/bin/ls -1 /dev/loop[0-9]*)

With standard code (tested with RHEL8.3 dracut):

  # dracut -f --debug /tmp/initramfs.img $(uname -r) >/tmp/debug 2>&1
  # grep -c "stat -L -c" /tmp/debug
  2440

With this code:

  # dracut -f --debug /tmp/initramfs.img $(uname -r) >/tmp/debug_optim 2>&1
  # grep -c "stat -L -c" /tmp/debug_optim
  205

Signed-off-by: Renaud Métrich <rmetrich@redhat.com>
dracut-functions.sh
dracut.sh