有没有办法跟踪进程释放的磁盘空间?

有没有办法跟踪进程释放的磁盘空间?

我熟悉跟踪磁盘 I/O 的各种方法,包括读写操作的速率(例如字节/秒)和累积(例如字节),但是我不知道(也找不到)任何方法跟踪进程释放的磁盘空间量。我怀疑这可能与定义何时/如何“释放”磁盘空间的复杂性有关。

例如,rm file不会用某种形式的“无”覆盖文件的内容,而是清除指针等。换句话说,它基本上释放了与file.但还有许多其他方法可以释放磁盘空间。对于预先存在的非空file,执行操作echo '' >file会清除其内容。由多个进程打开的硬链接和文件可能会使跟踪磁盘使用情况进一步复杂化,因为何时/如何释放空间的定义存在一定程度的模糊性。

答案1

“进程释放的磁盘空间”并不是一个非常有用的概念,因为它非常模糊。如果进程 A 删除了进程 B 中仍处于打开状态的文件,您是否认为 A 在删除文件时释放了空间(即系统承诺释放磁盘空间),还是认为 B 在关闭文件时释放了空间(即当系统承诺释放磁盘空间时)?空间实际上被释放了)?如果一个文件有两个硬链接,并且两个进程大约在同一时间删除一个硬链接,那么将释放的空间归功于第二个硬链接而不是第一个硬链接真的有意义吗?如果一个进程覆盖了文件的一部分,这是否算作释放被覆盖的数据? (如果文件系统执行重复数据删除,你的答案会改变吗?)等等。

您可以选择一个定义并检测内核代码来跟踪它,但这将是一个有点武断的选择,并且实际用途有限,这就是为什么它不是一个常用功能的原因。每个功能都有成本:程序员实现它的时间、程序员稍后维护它的时间、它引入的错误风险、内存和 CPU 消耗……

您可以使用现有的调试功能(例如 Linux 上的 Systemtap)针对常见场景实现这一点(再次选择一个特定的定义)。

相关内容