我是计算化学的研究生,可以访问 Linux 集群。该集群由一个非常大 (25 TB) 的文件服务器组成,其中连接了几十个计算节点。每个计算节点由 8 到 24 个英特尔至强内核组成。每个计算节点还包含一个大约 365 TB 的本地磁盘。
由于研究组的十几个用户经常访问文件服务器,文件服务器主要用于长期文件存储(每晚备份,而计算节点的本地磁盘从不备份)。因此,系统管理员指示我们在本地磁盘上运行模拟——它们的 I/O 速度比文件服务器快——以免其他用户的文件服务器变慢。
因此,我在本地磁盘上运行模拟,然后在完成后,将轨迹文件——我正在运行分子动力学 (MD) 模拟——复制到文件服务器进行存储。假设我有一个traj.trr在节点本地磁盘上的目录中调用的轨迹文件,/home/myusername/mysimulation1/traj.trr. 对于长期存储,我总是复制traj.trr到文件服务器中的一个目录,~/mysimulation1/traj.trr,其中~代表我在文件服务器中的目录,/export/home/myusername。复制之后,然后我习惯性地使用du -h验证它/home/myusername/mysimulation1/traj.trr与~/mysimulation1/traj.trr. 这样,我至少可以合理地确定传输到文件服务器是成功的。例如:
cd /home/myusername/mysimulation1/
cp -v traj.trr ~/mysimulation1/
du /home/myusername/mysimulation1/traj.trr -h
du ~/mysimulation1/traj.trr -h
Run Code Online (Sandbox Code Playgroud)
如果这两个调用du -h给出相同的人类可读文件大小,那么我可以合理地确定传输/复制成功。(我的典型traj.trr文件大小从大约 15 GB 到 20 GB 不等,具体取决于我运行的确切模拟。)如果我在这两个文件上运行du(即,没有-h开关)traj.trr,它们的字节大小通常非常非常相似 - - 通常在几个字节内。过去一年半我一直在使用这种整体方法,没有任何问题。
但是,最近我遇到了以下问题:有时du -h报告两个traj.trr文件的大小相差几GB。下面是一个例子: …
我有一个稀疏文件,其中只分配了一些块:
~% du -h --apparent-size example
100K example
~% du -h example
52K example
Run Code Online (Sandbox Code Playgroud)
我想知道实际分配了文件的哪些块。是否有系统调用或内核接口可用于获取分配列表或文件漏洞列表?
简单地检查足够长的零字符串(GNU cp、rsync 等使用的方法)无法正常工作:
~% cp example example1
~% du -h example1
32K example1
Run Code Online (Sandbox Code Playgroud)
它检测到实际分配的其他零序列。