xfs
[Top] [All Lists]

Re: [PATCH 1/2] xfs: limit speculative prealloc size on sparse files

To: Dave Chinner <david@xxxxxxxxxxxxx>
Subject: Re: [PATCH 1/2] xfs: limit speculative prealloc size on sparse files
From: Mark Tinguely <tinguely@xxxxxxx>
Date: Mon, 11 Feb 2013 16:00:44 -0600
Cc: xfs@xxxxxxxxxxx
Delivered-to: xfs@xxxxxxxxxxx
In-reply-to: <1360559102-20432-2-git-send-email-david@xxxxxxxxxxxxx>
References: <1360559102-20432-1-git-send-email-david@xxxxxxxxxxxxx> <1360559102-20432-2-git-send-email-david@xxxxxxxxxxxxx>
User-agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0
On 02/10/13 23:05, Dave Chinner wrote:
From: Dave Chinner<dchinner@xxxxxxxxxx>

Speculative preallocation based on the current file size works well
for contiguous files, but is sub-optimal for sparse files where the
EOF preallocation can fill holes and result in large amounts of
zeros being written when it is not necessary.

The algorithm is modified to prevent EOF speculative preallocation
from triggering larger allocations on IO patterns of
truncate--to-zero-seek-write-seek-write-....  which results in
non-sparse files for large files. This, unfortunately, is the way cp
now behaves when copying sparse files and so needs to be fixed.

What this code does is that it looks at the existing extent adjacent
to the current EOF and if it determines that it is a hole we disable
speculative preallocation altogether. To avoid the next write from
doing a large prealloc, it takes the size of subsequent
preallocations from the current size of the existing EOF extent.
IOWs, if you leave a hole in the file, it resets preallocation
behaviour to the same as if it was a zero size file.

Example new behaviour:

$ xfs_io -f -c "pwrite 0 31m" \
             -c "pwrite 33m 1m" \
             -c "pwrite 128m 1m" \
             -c "fiemap -v" /mnt/scratch/blah
wrote 32505856/32505856 bytes at offset 0
31 MiB, 7936 ops; 0.0000 sec (1.608 GiB/sec and 421432.7439 ops/sec)
wrote 1048576/1048576 bytes at offset 34603008
1 MiB, 256 ops; 0.0000 sec (1.462 GiB/sec and 383233.5329 ops/sec)
wrote 1048576/1048576 bytes at offset 134217728
1 MiB, 256 ops; 0.0000 sec (1.719 GiB/sec and 450704.2254 ops/sec)
/mnt/scratch/blah:
  EXT: FILE-OFFSET      BLOCK-RANGE      TOTAL FLAGS
    0: [0..65535]:      96..65631        65536   0x0
    1: [65536..67583]:  hole              2048
    2: [67584..69631]:  67680..69727      2048   0x0
    3: [69632..262143]: hole             192512
    4: [262144..264191]: 262240..264287    2048   0x1

Signed-off-by: Dave Chinner<dchinner@xxxxxxxxxx>
---

Works great. The above xfs_io example makes a good start of a test.

Reviewed-by: Mark Tinguely <tinguely@xxxxxxx>

<Prev in Thread] Current Thread [Next in Thread>