Thanks for you comment Kern. > Hello, > > This is a problem I have been considering for some time. The problem is > that current architecture of Bacula just does not properly handle > multi-treading the FD. Yes, you can do it by running two Jobs, but if > you are not 100% on top of the design limitations of Bacula, it is > unlikely that restores will work. Perhaps you have some clever way > around this, so at some point in the future, I would like to look at > this with you. In between time, perhaps you can describe more in detail > what you propose.
We'll I actually think this is a "read problem" only .. getting data off
the devices. The need for restore parallel streams is a very different
use-case it attack. The tapedevices can stream an infinite stream of very
small files very quickly and if you have a raid with battery-backed raid
controller the disk-system can also absorb without much parallism.
It is on the read side the challenge gets in .. this test is done on
a local spinning disk with xfs ~8ms seek time. using CephFS (which
we do in prodution) file access latency can be way higher on harddisk
storage.
pseudocode:
for f in dir then:
posix_fadvise(f)
fi
for f in dir then:
read_file(f)
fi
Test C-code attached .. not pretty by demonstrates the approach to get
the OS to do the parallism.
Test script:
#!/bin/bash
for bs in 4096 8192 16384 32768 65536 131072; do
for i in $(seq 1 10000); do
dd if=/dev/zero of=$i.file bs=$bs count=1 status=none
done
echo 3 > /proc/sys/vm/drop_caches
echo "With fadvise blocksize $bs"
time ~jk/test f > /dev/null
echo 3 > /proc/sys/vm/drop_caches
echo "Without fadvise blocksize $bs"
time ~jk/test > /dev/null
done
With fadvise blocksize 4096
Issuing fadvise
real 0m0.419s
user 0m0.062s
sys 0m0.250s
Without fadvise blocksize 4096
real 0m0.554s
user 0m0.034s
sys 0m0.184s
With fadvise blocksize 8192
Issuing fadvise
real 0m0.443s
user 0m0.068s
sys 0m0.269s
Without fadvise blocksize 8192
real 0m0.613s
user 0m0.044s
sys 0m0.204s
With fadvise blocksize 16384
Issuing fadvise
real 0m0.394s
user 0m0.056s
sys 0m0.328s
Without fadvise blocksize 16384
real 0m0.727s
user 0m0.035s
sys 0m0.268s
With fadvise blocksize 32768
Issuing fadvise
real 0m0.596s
user 0m0.080s
sys 0m0.395s
Without fadvise blocksize 32768
real 0m1.210s
user 0m0.060s
sys 0m0.398s
With fadvise blocksize 65536
Issuing fadvise
real 0m0.897s
user 0m0.129s
sys 0m0.491s
Without fadvise blocksize 65536
real 0m1.788s
user 0m0.119s
sys 0m0.653s
With fadvise blocksize 131072
Issuing fadvise
real 0m19.406s
user 0m0.206s
sys 0m0.738s
Without fadvise blocksize 131072
real 0m35.755s
user 0m0.269s
sys 0m1.058s
Thus depending on file-size there is approximately a 2x read-side
improvement on this naive solution.
I'm not a C-coder (as the attached program demonstrates :-) - but
limiting the problem to "read-size/single job/single-stream" parallism
simplifies the solution and changes to the codebase. It is only the
callback stuff that I dont understand. I was thinking about just
overloading breaddir to have an internal buffer of the next X (1000 files
< 512KB) that it would advance the fadvise call on, but that would
also advise the files that would be skipped by an incremntal backup.
Hope above both explains background, concept and proves the benefits.
So the "clever way" for restores would be to ignore it, as it really isn't
that relevant to this problem. Thats
at least what I see from real-world production backup and restore scenarios.
--
Jesper
test.c
Description: Binary data
_______________________________________________ Bacula-users mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/bacula-users
