xfs_fsr이 "개선되지 않습니다"라는 메시지와 함께 종료되는 경우 XFS 파일 시스템 조각 모음을 수행하는 방법은 무엇입니까?

xfs_fsr이 "개선되지 않습니다"라는 메시지와 함께 종료되는 경우 XFS 파일 시스템 조각 모음을 수행하는 방법은 무엇입니까?

CentOS 6.6 시스템에서 심하게 조각난 XFS 파일 시스템의 조각 모음을 시도하고 있습니다.

[root@server opt]# xfs_db -c frag -r /dev/md3
actual 598, ideal 215, fragmentation factor 64.05%

그러나 유틸리티를 시작하려고 하면 xfs_fsr다음 메시지와 함께 종료됩니다 No improvement will be made (skipping).

[root@server opt]# xfs_fsr -t 25200 /dev/md3 -v
/opt start inode=0
ino=536871105
No improvement will be made (skipping): ino=536871105

조각 모음을 실행하려면 어떻게 해야 합니까?

답변1

고쳐 쓰다

검사 후xfs_fsr의 소스 코드제가 찾은 부분은 이렇습니다.

/* Check if the temporary file has fewer extents */
new_nextents = getnextents(tfd);
if (dflag)
    fsrprintf(_("Temporary file has %d extents (%d in original)\n"), new_nextents, cur_nextents);
if (cur_nextents <= new_nextents) {
    if (vflag)
        fsrprintf(_("No improvement will be made (skipping): %s\n"), fname);
    free(fbuf);
    close(tfd);
    return 1; /* no change/no error */
}

(디버그 플래그)를 사용하여 명령을 다시 실행했는데 -d다음이 반환되었습니다.

xfs_fsr /dev/md1 -v -d
/mnt/disk1 start inode=0
ino=133
ino=133 extents=4 can_save=3 tmp=/mnt/disk1/.fsr/ag0/tmp23917
DEBUG: fsize=30364684107 blsz_dio=16773120 d_min=512 d_max=2147483136 pgsz=4096
Temporary file has 4 extents (4 in original)
No improvement will be made (skipping): ino=133

즉, HDD 플래터에 있는 원본 파일은 4개의 파일 부분으로 구성되어 있고 생성된 새 조각 모음 파일은 여전히 ​​4개의 파일 부분으로 구성되므로 이 파일을 건너뛰었습니다. 그런데 왜 병합할 수 없나요? 모르겠어요 그래서 나는kernel.org bugzilla에 문의하세요..

업데이트 2

나는 답장을 받았습니다. 내 XFS 파일 시스템(그리고 아마도 귀하의 시스템도 마찬가지)의 블록 크기는 4KB이므로 파일 부분의 최대 크기는 8GB보다 클 수 없습니다.XFS 문서에 명시된 대로:

파일 길이가 0바이트이면 확장 영역이 없으며 di_nblocks 및 di_nexents는 0이 됩니다. 데이터를 포함하는 모든 파일에는 최소한 하나의 범위가 있으며 각 범위는 파일 시스템에서 100만 개에서 200만 개가 넘는 블록을 사용할 수 있습니다(221). 기본 4KB 블록 크기 파일 시스템의 경우 단일 익스텐트 길이는 최대 8GB입니다.

따라서 "개선이 이루어지지 않습니다"는 "개선이 불가능합니다"를 의미합니다. ;)

원래 답변

나는 같은 문제가 있었고 발견했습니다.xfs_fsr이 조각 모음을 건너뛰는 경우가 많습니다.:

 * mandatory locks are present
 * file is marked immutable, append-only, or nodefrag
 * filesystem is shut down
 * change/modify times have been altered since defrag started
 * original file is mmapped

사용된 경우 -v건너 xfs_fsr뛴 파일의 inode 번호를 반환합니다.

xfs_fsr /dev/md1 -v
/mnt/disk1 start inode=0
ino=133
No improvement will be made (skipping): ino=133
ino=135
No improvement will be made (skipping): ino=135
....

이 inode 번호를 사용하면 다음 을 사용하여 bmap -a파일 속성을 확인할 수 있습니다 xfs_db.

xfs_db -r /dev/md3
xfs_db> inode 133
xfs_db> bmap -a
xfs_db> bmap -d
data offset 0 startblock 1314074773 (4/240332949) count 2097151 flag 0
data offset 2097151 startblock 1316171924 (4/242430100) count 2097151 flag 0
data offset 4194302 startblock 1318269075 (4/244527251) count 2097151 flag 0
data offset 6291453 startblock 1320366226 (4/246624402) count 1121800 flag 0
xfs_db> quit

보시다시피 제 경우에는 속성 플래그가 없기 때문에 null 값을 반환합니다.

그래서 다음으로 잠금 상태를 확인해 보았습니다. 처음에 우리는inode의 파일 이름을 가져옵니다.다음과 같이:

find /mnt/disk1 -xdev -inum 133
/mnt/disk1/foo/bar.dat

그럼 우리는 시도잠금 상태 가져오기:

lsof /mnt/disk1/foo/bar.dat

결과가 비어있어서 파일을 잠글만한 내용은 없는 것 같습니다.

이제 마지막 조각 모음 시도 이후 파일이 변경되었는지 확인해 보겠습니다.

ls -l /mnt/disk1/foo/bar.dat
-rw-rw-rw- 1 nobody users 30364684107 Nov 18  2019 /mnt/disk1/foo/bar.dat

아니요, 여전히 '오래된' 것처럼 보입니다.

관련 정보