Files
apfstests/tests/generic/166
T
Dave Chinner 132f37916d generic/166: speed up on slow disks
generic/166 is takes way too long to run on iscsi disks - over an
*hour* on flash based iscsi targets. In comparison, it takes 18s to
run on a pmem device.

The issue is that it takes 3-4s per file write cycle on slow disks,
and it does a thousand write cycles. The problem is taht reflink is
so much faster than the write cycle that it's doing many more
snapshots on slow disks than fast disks, and this slows it down even
more.

e.g. the pmem system that takes 18s to run does just under 1000
snapshots - roughly one per file write. 20 minutes into the iscsi
based test, it's only done ~300 write cycles but there are almost
10,000 snapshots been taken. IOWs, we're doing 30 snapshots a file
write, not ~1.

Fix this by rate limiting snapshots to at most 1 per whole file
write. This reduces the number of snapshots taken on fast devices by
~50% (runtime on pmem device went from 18s -> 8s) but reduced it to
1000 on slow devices and reduced runtime from 3671s to just 311s.

Signed-Off-By: Dave Chinner <dchinner@redhat.com>
Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com>
Signed-off-by: Eryu Guan <eguan@redhat.com>
2017-10-12 11:05:49 +08:00

105 lines
2.6 KiB
Bash
Executable File

#! /bin/bash
# FS QA Test No. 166
#
# Test for races or FS corruption when DIO writing to a file that's also
# the source of a reflink operation.
#
#-----------------------------------------------------------------------
# Copyright (c) 2015 Oracle, Inc. All Rights Reserved.
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License as
# published by the Free Software Foundation.
#
# This program is distributed in the hope that it would be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write the Free Software Foundation,
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
#-----------------------------------------------------------------------
#
seq=`basename $0`
seqres=$RESULT_DIR/$seq
echo "QA output created by $seq"
here=`pwd`
tmp=/tmp/$$
status=1 # failure is the default!
trap "_cleanup; exit \$status" 0 1 2 3 7 15
_cleanup()
{
cd /
rm -rf $tmp.* $finished_file
wait
}
# get standard environment, filters and checks
. ./common/rc
. ./common/filter
. ./common/reflink
# real QA test starts here
_supported_os Linux
_require_scratch_reflink
_require_cp_reflink
_require_odirect
echo "Format and mount"
_scratch_mkfs > $seqres.full 2>&1
_scratch_mount >> $seqres.full 2>&1
testdir=$SCRATCH_MNT/test-$seq
finished_file=/tmp/finished
do_snapshot=/tmp/snapshot
rm -rf $finished_file
mkdir $testdir
loops=1024
nr_loops=$((loops - 1))
blksz=65536
echo "Initialize file"
echo >> $seqres.full
_pwrite_byte 0x61 0 $((loops * blksz)) $testdir/file1 >> $seqres.full
_scratch_cycle_mount
# Snapshot creator...
#
# We rate limit the snapshot creator to one snapshot per full file write. this
# limits the runtime on slow devices, whilst not substantially reducing the the
# number of snapshots taken on fast devices.
snappy() {
n=0
while [ ! -e $finished_file ]; do
if [ ! -e $do_snapshot ]; then
sleep 0.01
continue;
fi
out="$(_cp_reflink $testdir/file1 $testdir/snap_$n 2>&1)"
res=$?
echo "$out" | grep -q "No space left" && break
test -n "$out" && echo "$out"
test $res -ne 0 && break
n=$((n + 1))
rm -f $do_snapshot
done
}
echo "Snapshot a file undergoing directio rewrite"
snappy &
seq $nr_loops -1 0 | while read i; do
_pwrite_byte 0x63 $((i * blksz)) $blksz -d $testdir/file1 >> $seqres.full
touch $do_snapshot
done
touch $finished_file
wait
# success, all done
status=0
exit