파일의 "스파 스 니스"를 어떻게 출력합니까?


15

실제로 데이터로 채워진 파일 공칭 크기를 어떻게 출력합니까? 마찬가지로 vmtouch쇼 얼마나 많은 파일은 현재 메모리에 ...

워크 플로는 다음과 같습니다.

$ fallocate -l 1000000 data 
$ measure_sparseness data
100%
$ fallocate -p -o 250000 -l 500000  data
$ measure_sparseness
50%

해결 방법 : 사용 du -bsh및 du -sh비교하십시오.


1
관련 : filefrag모든 파일 시스템 및 xfs_bmap -vplXFS의 경우 스파 스 파일 및 홀 펀칭으로 재생할 때 데이터의 위치 (사전 할당되지 않은 범위)를 표시하는 핵심 도구입니다.
— Peter Cordes

filefrag data-> 다중 FIBMAP: Invalid argument-> data: 1 extent found...
— Vi.

어떤 파일 시스템에서? filefrag -e적어도 XFS와 ext4에서 완벽하게 작동합니다. 나는 다른 사람들을 테스트하지 않았습니다. FIBMAP로 대체되는 FIEMAP (extent-map)을 사용합니다. 그것들 ioctl이 작동하지 않으면 유용하지 않습니다.
— Peter Cordes

tmpfs에서. 내가 filefrag없습니다 -e옵션을 선택합니다.
— Vi.

몇 살 e2fsprogs입니까? 최신 기능이 아니라고 확신합니다. 동일한 상세 정보와 일부 추가 헤더 행을 인쇄 하는 -v옵션 도 있습니다 . 아마 당신의 filefrag것입니다. 그러나 달리 xfs_bmap별도의 줄이있는 구멍을 명시 적으로 나타내지 않고 파일 위치에 불연속성이 있습니다. 어쨌든, tmpfsFIEMAP을 지원하지 않는 것은 놀랍지 않습니다. 백킹 스토어로 블록 장치가 없기 때문에 익스텐트 위치에 대한 합리적인 가치는 없습니다.
— Peter Cordes

답변:


19

find이 %S경우에도 "스파 스"라는 형식 지정자를

         %S     File's  sparseness.   This  is  calculated as (BLOCKSIZE*st_blocks / st_size).  The exact value you will get for an ordinary file of a certain
                 length is system-dependent.  However, normally sparse files will have values less than 1.0, and files which use indirect  blocks  may  have  a
                 value which is greater than 1.0.   The value used for BLOCKSIZE is system-dependent, but is usually 512 bytes.   If the file size is zero, the
                 value printed is undefined.  On systems which lack support for st_blocks, a file's sparseness is assumed to be 1.0.
$ fallocate -l 1000000 data
$ find data -printf '%S\n'
1.00352
$ fallocate -p -o 250000 -l 500000  data
$ find data -printf '%S\n'
0.507904

흥미 롭군 시스템의 대부분의 일반 파일은 1.0 이상의 sparseness를 가지며 디렉토리, 소프트 링크 및 소켓은 항상 정확히 1.0입니다.
— grochmal

일부 시스템은 데이터 블록을 전혀 사용하지 않고 inode에 직접 symlink를 저장하지 않았습니까? 그것의 희미 함이 무엇인지 궁금해하십시오. 게다가, 그 정의가 잘못된 방법이 아닙니까? 확실히 정상 (예를 들어, 스파 스가 아닌) 파일은 0의 sparseness를 가져야합니다. :)
— ilkkachu

@grochmal, ext4 (Linux) : ln -s foo link, "sparseness"of link: 0. 소켓과 FIFO의 길이는 0이므로 findsparseness 1을 보여줍니다.
— ilkkachu

1

당신이 경우 find해당 옵션, 70 년대이기 때문에 UNIX에 일이있는 방법이 없습니다 :

ls -ls file

사용 된 실제 블록 수와 기록 된 가장 높은 바이트를 인쇄합니다. 이를 통해 실제로 할당되지 않은 블록 수를 쉽게 계산할 수 있습니다.


0

find's %S는 간단한 출력을 인쇄 하지만 자세한 내용은 sparsetest내가 작성한 오픈 소스와 여기 github을 참조하십시오 . 모든 구멍을 인쇄하려면 (예를 들어) 자유롭게 수정하십시오.

스파 스 할당에 문제가 보여주는 블로그 기사 여기를 사용하여 sparsetest문제를 디버깅 할 수 있습니다.


파일 vmtouch -v에 캐시 된 영역의 맵을 인쇄하는 것과 같이 파일에서 범위의 "맵"을 인쇄 할 수 있습니까 ?
— Vi.

@Vi. 나는 전에 그것을 잘 작성하고 세부 사항을 잊어 버렸습니다. 실제로하는 일은 스파 스 파일을 만들고, 데이터를 쓰고, 통계를 인쇄하는 것입니다. 통계 작성 비트 만 원합니다. 당신이 필요합니다 구멍을 인쇄하려면 lseek로 SEEK_HOLE와 SEEK_DATA. 하기 쉽다.
— abligh
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.