Skip to contentSkip to conversation

btrfs hates lone HDDs on manycore systems

DISCUSSION Sergei Trofimovich 1 participant 1 message Jun 20, 2012 Btrfs file system

lore
Share & tools
lore
#0 lore raw

Most of io workers in btrfs don't take into account amount of disks they deal with:

    fs/btrfs/disk-io.c:        fs_info->thread_pool_size = min_t(unsigned long, num_online_cpus() + 2, 8);

It might not be a problem for 'write-only' workloads, but it's a serious problem for read/write ones.

Let's consider simple setup:
- dualcore (core2) laptop with sole HDD (5200 rpm)
- slightly aged btrfs: ~50% of 200GB is filled
and used as / (nothing special: stock mkfs.btrfs /dev/root)
- kernel does not matter much. any 3.3.0+ would fit.

     3.5.0-rc3 runs here

- tried both anticipatory and deadline schedulers. does not seem to matter that much

My "benchmark"[1] is gcc unpacking/perm-sanitizing. It emulates typical workload of source based package manager.

When [1] is ran as 'sh torture.sh':
- first we see at least 4 'btrfs-endio-wri' hammering disk with random reads and writes in the 'untar' phase
- then we see 4 'btrfs-delayed-m' with similar effect in the 'chmod' phase

If it would be a quad-cpu laptop (typical i5) we would get 6(!) threads chewing disk, so you get worse behaviour. System becomes completely unusable. Right now I try to mitigate it with 'thread_pool' mount option, but it looks like a crude hack.

Would be nice to have amount of parallel readers comparable to number underlying spinning devices.

Thanks for your patience!

[1] torture.sh:

    #!/bin/sh
    gcc_url=http://distfiles.gentoo.org/distfiles/gcc-4.7.0.tar.bz2
    gcc_tarball=gcc-4.7.0.tar.bz2
    gcc_dir=gcc-4.7.0
    [ -f "$gcc_tarball" ] || wget "$gcc_url"
    chatty() {
        echo "RUN: $@"
        /usr/bin/time "$@"
    }
    torture() {
        chatty rm -rf "${gcc_dir}"

        ### iotop pattern: scattered seeks/reads to death
        #25499 be/4 root       60.34 K/s   79.20 K/s  0.00 % 99.99 % [btrfs-endio-wri]
        #28151 be/4 root       56.57 K/s   60.34 K/s  0.00 % 99.73 % [btrfs-endio-wri]
        # 6181 be/4 root       56.57 K/s   71.66 K/s  0.00 % 96.96 % [flush-btrfs-1]
        #23881 be/4 root       52.80 K/s   52.80 K/s  0.00 % 93.70 % [btrfs-endio-wri]
        chatty tar -xjf "${gcc_tarball}"

        ### iotop pattern: scattered seeks/reads to death
        #29109 be/4 slyfox    870.05 K/s    0.00 B/s  0.00 % 97.05 % chmod -R 700 gcc-4.7.0/
        #28067 be/4 root      162.66 K/s  949.49 K/s  0.00 % 77.72 % [btrfs-delayed-m]
        #28164 be/4 root       22.70 K/s  215.62 K/s  0.00 % 14.23 % [btrfs-delayed-m]
        # 4690 be/4 root        0.00 B/s   15.13 K/s  0.00 %  0.00 % [btrfs-delayed-m]
        echo "now look at iotop"
        chatty chmod -R 700 "${gcc_dir}"/

        chatty sync
    }

    torture
    torture
    torture
    torture
Signature · 1 line
  Sergei