获取挂载中已用 space 和已用 inode 的百分比
Getting the percentage of used space and used inodes in a mount
我需要计算 Go 中挂载路径(例如 /mnt/mycustommount
)已用 space 和已用 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
。但我不明白 Bfree
和 Bavail
之间的区别('unprivileged' 用户对文件系统块做了什么?)。
对于 inode 我的尝试:
totalInodeCount = statFsOutput.Files
freeInodeCount = statFsOutput.Ffree
// so now the proportion is
// x : 100 = (totalInodeCount - freeInodeCount) : totalInodeCount
如何获取已用存储空间的百分比?
我做的 inode 计算是否正确?
您的评论表达式在 Go 中无效,所以我不能不猜测就真正解释它。 由于猜测,我认为它是正确的,但我猜到了你的实际意思,还是只是我认为你的意思?换句话说,在不显示实际 code 的情况下,我只能想象您最终的 code 会是什么。如果我想象的代码不是实际代码,那么我想象你将编写的代码的正确性是无关紧要的。
除此之外,我可以在这里回答你的问题:
(what's 'unprivileged' user go to do with filesystem blocks?)
Linux statfs
call uses the same fields as 4.4BSD. The default 4.4BSD file system (the one called the "fast file system") uses a blocks-with-fragmentation approach to allocate blocks in a sort of stochastic 方式。此分配过程在 空 文件系统上运行良好,并且在有些满的文件系统上继续运行良好,不会出现极度减速。然而,对其行为的计算机化建模显示,如果块使用率超过 90% 左右,则可能出现病理性减速(或多或少相当于线性搜索)。
(后来,对真实文件系统的分析发现,通常直到块使用率超过 95% 时才会出现减速。但那时 10%“保留”的想法已经很成熟了。)
因此,如果当时流行的 400 MB 大容量磁盘驱动器1 为索引节点提供 10%,为保留块提供 10%,这意味着普通用户可以分配大约 320 MB 的文件数据。那时驱动器是“100% 满”,但它可以通过用完剩余的块来达到 111%。不过,这些块是为超级用户保留的。
如今,人们可以拥有一个可以授予或撤销的 capability,而不是“超级用户”。然而,现在我们也不使用相同的文件系统。所以在你的系统上 bfree
和 bavail
可能没有区别。
1是的,the 400 MB Fujitsu Eagle 当时是一个很大的(从多种意义上说:它使用 19 英寸机架安装设置)驱动器。如今,人们被数 TB 的 SSD 宠坏了。
我需要计算 Go 中挂载路径(例如 /mnt/mycustommount
)已用 space 和已用 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
。但我不明白 Bfree
和 Bavail
之间的区别('unprivileged' 用户对文件系统块做了什么?)。
对于 inode 我的尝试:
totalInodeCount = statFsOutput.Files
freeInodeCount = statFsOutput.Ffree
// so now the proportion is
// x : 100 = (totalInodeCount - freeInodeCount) : totalInodeCount
如何获取已用存储空间的百分比? 我做的 inode 计算是否正确?
您的评论表达式在 Go 中无效,所以我不能不猜测就真正解释它。 由于猜测,我认为它是正确的,但我猜到了你的实际意思,还是只是我认为你的意思?换句话说,在不显示实际 code 的情况下,我只能想象您最终的 code 会是什么。如果我想象的代码不是实际代码,那么我想象你将编写的代码的正确性是无关紧要的。
除此之外,我可以在这里回答你的问题:
(what's 'unprivileged' user go to do with filesystem blocks?)
Linux statfs
call uses the same fields as 4.4BSD. The default 4.4BSD file system (the one called the "fast file system") uses a blocks-with-fragmentation approach to allocate blocks in a sort of stochastic 方式。此分配过程在 空 文件系统上运行良好,并且在有些满的文件系统上继续运行良好,不会出现极度减速。然而,对其行为的计算机化建模显示,如果块使用率超过 90% 左右,则可能出现病理性减速(或多或少相当于线性搜索)。
(后来,对真实文件系统的分析发现,通常直到块使用率超过 95% 时才会出现减速。但那时 10%“保留”的想法已经很成熟了。)
因此,如果当时流行的 400 MB 大容量磁盘驱动器1 为索引节点提供 10%,为保留块提供 10%,这意味着普通用户可以分配大约 320 MB 的文件数据。那时驱动器是“100% 满”,但它可以通过用完剩余的块来达到 111%。不过,这些块是为超级用户保留的。
如今,人们可以拥有一个可以授予或撤销的 capability,而不是“超级用户”。然而,现在我们也不使用相同的文件系统。所以在你的系统上 bfree
和 bavail
可能没有区别。
1是的,the 400 MB Fujitsu Eagle 当时是一个很大的(从多种意义上说:它使用 19 英寸机架安装设置)驱动器。如今,人们被数 TB 的 SSD 宠坏了。