我使用 Lustre 文件系统。我注意到,如果我查看%S
某个文件的 find 的稀疏值 ( ),然后使用 打印该文件hexdump
,然后再次查看 find 的稀疏值,则有时 find 的稀疏值 ( %S
) 会发生变化。为什么会改变?
查看%S
文件的查找稀疏值 ( )的命令myvideo.mp4
:
find myvideo.mp4 -printf "%S"
myvideo.mp4
使用以下命令读取文件hexdump
:
hexdump myvideo.mp4
我注意到几个文件上的这种行为。 find 稀疏值变化的示例 ( %S
):
0.000135559
到0.631297
0.00466808
到0.228736
是否因为使用 读取时文件在本地部分缓存hexdump
?我注意到此更改并非特定于,例如(以及可能读取该文件的任何其他程序)hexdump
也会发生同样的情况:nano
dernoncourt@server:/videos$ find myvideo.mp4 -printf "%S"
0.00302331
dernoncourt@server:/videos$ nano myvideo.mp4
dernoncourt@server:/videos$ find myvideo.mp4 -printf "%S"
0.486752
答案1
从find 的手册页(格式是我的):
%S
:文件的稀疏性。其计算公式为(BLOCKSIZE*st_blocks / st_size
)。对于特定长度的普通文件,您将获得的确切值取决于系统。但是,通常稀疏文件的值小于 1.0,而使用间接块的文件的值可能大于 1.0。使用的值BLOCKSIZE
取决于系统,但通常为 512 字节。如果文件大小为零,则打印的值未定义。在不支持 的系统上st_blocks
,文件的稀疏度假定为 1.0。
注意:
BLOCKSIZE*st_blocks
对应于磁盘使用情况,st_size
对应于表观尺寸。
因此,%S
== BLOCKSIZE*st_blocks / st_size
。diskusage/apparentsize
此外,这回答解决了文件的表观大小有时远大于实际磁盘使用情况的原因分层存储系统,例如 Lustre即使它可能根本不稀疏。它还提到,将大文件完全恢复到前端存储是不寻常的。
hexdump
由于使用或等程序读取时,文件有时会部分恢复到前端存储,因此nano
它会增加该st_blocks
值,从而减少,这意味着( )%S (=BLOCKSIZE*st_blocks / st_size)
报告的文件稀疏度减少。find
%S
由于find myvideo.mp4 -printf "%S"
知道 Lustre 文件系统上的文件是否稀疏是没有用的,因此可以使用以下命令解决方案经过弗罗斯特舒茨了解文件是否稀疏:
file = "myvideo.mp4"
if [ "$((`stat -c '%b*%B-%s' -- "$file"`))" -lt 0 ]
then
echo "$file" is sparse
else
echo "$file" is not sparse
fi
请注意,此解决方案有一些限制,如评论区。
另外,请注意光泽才不是目前直接支持SEEK_HOLE/SEEK_DATA
接口,所以我们不能使用使用该解决方案了解 Lustre 上的文件是否稀疏。