【问题标题】:Getting the percentage of used space and used inodes in a mount获取挂载中已用空间和已用 inode 的百分比
【发布时间】:2022-01-27 23:23:42
【问题描述】:

我需要计算 Go 中挂载路径(例如 /mnt/mycustommount)的已用空间和已用 inode 的百分比。

这是我的尝试:

var statFsOutput unix.Statfs_t

err := unix.Statfs(mount_path, &statFsOutput)
if err != nil {
    return err
}

totalBlockCount := statFsOutput.Blocks // Total data blocks in filesystem
freeSystemBlockCount = statFsOutput.Bfree // Free blocks in filesystem
freeUserBlockCount = statFsOutput.Bavail // Free blocks available to unprivileged user

现在我需要的比例是这样的:

x : 100 = (totalBlockCount - free[which?]BlockCount) : totalBlockCount

x : 100 = usedBlockCount : totalBlockCount 。但我不明白BfreeBavail 之间的区别(“非特权”用户与文件系统块有什么关系?)。

对于 inode 我的尝试:

totalInodeCount = statFsOutput.Files
freeInodeCount = statFsOutput.Ffree
// so now the proportion is
// x : 100 = (totalInodeCount - freeInodeCount) : totalInodeCount

如何获取已用存储的百分比? 我做的 inode 计算是否正确?

【问题讨论】:

    标签: linux go filesystems storage disk


    【解决方案1】:

    您的评论表达式是无效的 Go,所以我无法在没有猜测的情况下真正解释它。 有了猜测,我认为它是正确的,但我猜到了你的实际意思,还是仅仅认为你的意思?换句话说,没有显示实际的代码,我只能想象你最终的代码会是什么。如果我想象的代码不是实际的代码,那么我想象的你写的代码的正确性就无关紧要了。

    除此之外,我可以在这里回答你的问题:

    (“非特权”用户如何处理文件系统块?)

    Linux statfs call 使用与 4.4BSD 相同的字段。默认的 4.4BSD 文件系统(称为“快速文件系统”)使用带有分段的块方法以一种stochastic 的方式分配块。此分配过程在 文件系统上运行良好,并且在有些满的文件系统上继续运行良好,不会出现极度减速。然而,对其行为的计算机建模显示,如果块使用率超过 90% 左右,则可能出现病态减速(或多或少相当于线性搜索)。

    (后来,对真实文件系统的分析发现,通常在块使用率超过 95% 时才会出现减速。但那时 10% 的“储备”的想法已经很成熟了。)

    因此,如果当时流行的 400 MB 大容量磁盘驱动器1 将 10% 用于 inode,另外 10% 用于保留块,这意味着普通用户可以分配大约 320 MB文件数据。那时驱动器是“100% 满的”,但它可以通过用完剩余的块达到 111%。不过,这些块是为超级用户保留的。

    如今,可以拥有可以授予或撤销的capability,而不是“超级用户”。但是,现在我们也不使用相同的文件系统。所以bfreebavail在你的系统上可能没有区别。


    1是的,the 400 MB Fujitsu Eagle 在当时是一个大型(在多种意义上:它使用 19 英寸机架安装设置)驱动器。今天,人们被他们的数 TB SSD 宠坏了。 ?

    【讨论】:

      猜你喜欢
      • 2017-02-18
      • 2020-12-28
      • 2014-04-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多