XFS & LVM: unexpected cp when issuing mv

Michael Monnerie
2009-11-29T13:53:03Z

[-- Attachment #1.1: Type: text/plain, Size: 2619 bytes --]

I have an unexpected behaviour and I hope someone can explain me the
reasons:

This is an openSUSE 11.2 virtual machine within XENserver. XENserver can
only create 2TB disks, but I needed more. So I create 2x 2TB disks for
that VM. These disks have no partitions, but are straight LVM:
# pvscan
PV /dev/xvdb VG sharestore lvm2 [1,95 TB / 0 free]
PV /dev/xvdc VG sharestore lvm2 [1,95 TB / 0 free]
Total: 2 [3,91 TB] / in use: 2 [3,91 TB] / in no VG: 0 [0 ]

I created one VG, and then one LV:
# vgscan
Reading all physical volumes. This may take a while...
Found volume group "sharestore" using metadata type lvm2
# lvscan
ACTIVE '/dev/sharestore/public' [3,91 TB] inherit

On that LV, I created an XFS filesystem, mounted from /etc/fstab:
/dev/sharestore/public /disks/sharestore xfs
noatime,nodiratime,logbufs=8,logbsize=256k,attr2,nobarrier,largeio,swalloc,inode64,prjquota

Now when I move from one dir to another, example
mv /disks/sharestore/upload/* /disks/sharestore/download/

within some dirs it's a simple mv where only metadata is moved, but with
some dirs it's a physical cp+rm of the files. You can easily see that by
the speed of the mv, plus with iostat:
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-
sz avgqu-sz await svctm %util
xvdb 0,00 0,00 0,00 647,31 0,00 28424,75
87,82 18,46 29,71 0,24 15,65
xvdc 0,00 0,40 631,14 2,40 26928,54 76,65
85,25 5,56 8,69 1,56 98,84

Until now I believed that a mv within one filesystem is always just a
metadata mv. But it seems I found a case now where even within the same
filesystem a physical cp+rm is done. Can someone explain me

1) why this happens
2) how I can prevent this?

We have files >5G there, often 20G or more, so a mv should just be a
metadata mv, everything else is inacceptable.
Could it be the way I created the VG + LV, that there's a cp instead mv?
How could I create all that to get a normal behaviour?

Maybe like this?:
1) create VG only on one disk
2) create LV on that disk
3) create XFS
4) extend VG to 2nd disk
5) extend LV to 2nd disk
6) xfs_growfs to 2nd disk