Как вывести, сколько номинального размера файла фактически заполнено данными? Как vmtouch
показывает, сколько файлов в данный момент находится в памяти ...
Я ожидаю, что рабочий процесс будет таким:
$ fallocate -l 1000000 data
$ measure_sparseness data
100%
$ fallocate -p -o 250000 -l 500000 data
$ measure_sparseness
50%
Временное решение: использование du -bsh
и du -sh
и сравнить их.
filefrag
для любой файловой системы иxfs_bmap -vpl
для XFS являются ключевыми инструментами, показывающими, где находятся данные (и где находятся предварительно выделенные неписанные экстенты) при игре с разреженными файлами и пробиванием дырок.filefrag data
-> несколькоFIBMAP: Invalid argument
->data: 1 extent found
...filefrag -e
отлично работает на XFS и ext4 по крайней мере. Я не проверял на других. Он использует FIEMAP (карта экстентов) с отступлением к FIBMAP. Если этиioctl
не работают, то это не будет полезно.filefrag
нет-e
выбора.e2fsprogs
? Я уверен, что это не последняя функция. Там же также-v
вариант , который печатает ту же информацию многословной (плюс некоторые дополнительные строки заголовка). Может быть, у васfilefrag
будет это. В отличие отxfs_bmap
этого, он явно не указывает дырки отдельными линиями, он просто имеет разрывы в позиции файла. В любом случае, я не удивлен, чтоtmpfs
не поддерживает FIEMAP, потому что нет блочного устройства в качестве резервного хранилища, поэтому нет разумного значения для местоположения экстентов.Ответы:
find
имеет%S
спецификатор формата, который даже называется "разреженность"источник
ln -s foo link
"разреженность" изlink
: 0. Сокеты и FIFO имеют нулевую длину, поэтомуfind
показывает разреженность 1.Если у вас
find
нет этой опции, метод, который работает в UNIX с 70-х годов:Который напечатает фактическое количество используемых блоков и самый большой байт, когда-либо написанный. Из этого вы можете легко вычислить, сколько блоков на самом деле не было выделено.
источник
В то время как
find
«s%S
напечатает вывод кратко, для более детальной информации вы можете посмотреть наsparsetest
котором я писал - с открытым исходным кодом, и на GitHub здесь . Не стесняйтесь изменять его, если вы хотите распечатать (например) каждую лунку.Блог статья показывает проблемы с редкими ассигнованиями здесь , используя
sparsetest
для отладки этой проблемы.источник
vmtouch -v
распечатать карту кэшированных областей в файле?lseek
сSEEK_HOLE
иSEEK_DATA
. Легко сделать.