sol*_*ish 5 command-line disk-usage
我想知道“IO Block”在输出中的含义stat
以及该数字是如何计算的。
我知道文件夹/文件的物理大小以 4096 字节块来衡量。
然而,在下面的示例中,文件的大小超过 4096 字节,并且“IO Block”的值没有改变。
IO块的含义是什么以及如何更改?
stat yeni
File: 'yeni'
Size: 12890 Blocks: 32 IO Block: 4096 normal dosya
Device: 805h/2053d Inode: 2255976 Links: 1
Access: (0664/-rw-rw-r--) Uid: ( 1000/ ihsan) Gid: ( 1000/ ihsan)
Access: 2017-08-15 20:07:26.324017949 +0300
Modify: 2017-08-15 20:06:30.703053636 +0300
Change: 2017-08-15 20:07:26.324017949 +0300
Birth: -
Run Code Online (Sandbox Code Playgroud)
stat
是文件系统用于读写文件的首选字节数。一个 IO 块通常为4096 字节。“IO 块”是文件系统用于读写文件的首选字节数。
\n在我的 ext4 分区上,这个数字固定为 4096 字节。
\n4096 字节的块大小也是 512 MB 到 4 TB 之间的文件系统的默认值。请参阅man mke2fs.conf
中的选项/etc/mke2fs.conf
文档。-T
man mkfs.ext4
另一方面,“Blocks”给出了为磁盘上的文件分配的512 字节块的数量。请注意,“Blocks”中的块stat
与“IO Block”中的块具有不同的大小:
深入挖掘stat
\ 的源代码,我们发现这一行创建了默认输出stat
:
Size: %-10s\\tBlocks: %-10b IO Block: %-6o %F\\n\\\n
Run Code Online (Sandbox Code Playgroud)\n拆开来看:
\nSize: %-10s
:“Size:”打印文件的大小(以字节为单位),并使用 进行一些填充-10
。
Blocks: %-10b
:“Blocks”打印占位符的值%b
(带有一些填充)。什么是%b
?根据man 1 stat
:
\n\n%b 分配的块数(参见 %B)
\n
看一下%B
:
\n\n%B %b 报告的每个块的大小(以字节为单位)
\n
“Blocks”表示的块中有多少字节?
\nstat --format="%B" ~/small_file\n
Run Code Online (Sandbox Code Playgroud)\n这会打印“512”。好吧,“Blocks”的块大小是 512 字节。
\n接下来是打印“IO Block”的代码:
\nIO Block: %-6o
: 占位符是什么%o
?直接来自man 1 stat
:
\n\n%o 最佳 I/O 传输大小提示
\n
有趣的!“IO 块”是“最佳 I/O 传输大小提示”的缩写。
\n在 ext4 文件系统上运行:
\nstat --format="%o" ~/small_file\n
Run Code Online (Sandbox Code Playgroud)\n我们了解到“IO 块”是 4096 字节。这是一个相当大的尺寸差异:
\n把它们放在一起:
\nstat --format="File is %s bytes but needs %B*%b bytes on disk. Optimal I/O transfer size hint (alias IO Block): %o bytes" ~/small_file\n
Run Code Online (Sandbox Code Playgroud)\n在我的例子中打印以下内容:
\n\n\n文件为 116 字节,但在磁盘上需要 512*8 字节。最佳 I/O 传输大小提示(别名 IO 块):4096 字节
\n
人们很容易错误地认为Blocks 值计算的是磁盘上分配的 IO 块的数量。
\nstat
系统调用从中man 2 stat
我们可以了解更多关于IO传输大小提示,也称为“IO块”:
\n\nst_blksize 字段给出了高效文件系统 I/O 的“首选”块大小。(以较小的块写入文件可能会导致读取-修改-重写效率低下。)
\n
还引用了描述有助于理解“块”的man 2 stat
字段:st_blocks
stat
\n\n该字段指示分配给文件的块数,以 512 字节为单位。
\n
stat
以下是缩短的示例输出stat ~/small_file
:
File: /home/mb/small_file\nSize: 116 Blocks: 8 IO Block: 4096 regular file\n// Rest omitted\n
Run Code Online (Sandbox Code Playgroud)\nSize: 116
表示该文件中有116字节的数据。但它没有告诉我们使用了多少字节来在磁盘上存储该文件。这就是“块”的用途。Blocks: 8
表示该文件在磁盘上占用 8 * 512 = 4096 字节。鉴于该文件只有 116 字节的数据,这有点浪费。但我们不能使用更少的字节,因为我的系统上 ext4 的块大小是 4096 字节。多么浪费?让我们计算一下:116 / 4096 * 100 \xe2\x89\x88 2.8
这意味着分配的字节中只有大约 2.8% 实际用于存储文件的数据。IO Block: 4096
表示一次从磁盘读取或写入的首选字节数。另一个文件稍大的示例stat ~/larger_file
:
File: /home/mb/larger_file\nSize: 91246 Blocks: 184 IO Block: 4096 regular file\n// Rest omitted\n
Run Code Online (Sandbox Code Playgroud)\nSize: 91246
告诉我们该文件中的字节数,与我们的文件系统以及它在磁盘上物理占用的字节数无关。Blocks: 184
让我们计算一下该文件在磁盘上实际占用的字节数:184 * 512 = 94208 字节。这些分配的字节中有多少用于实际存储larger_file
数据?91246 / 94208 * 100 \xe2\x89\x88 96.9
。大约 96.6% 是文件的数据,这比我们之前使用~/small_file
.我怀疑您是否可以更改现有文件系统的“IO Block”值。这是对此的讨论。
\n如果您要创建新的文件系统,则可以选择-b
指定块大小(以字节为单位)。
mkfs.ext4 -b 2048 /dev/sdb1\n
Run Code Online (Sandbox Code Playgroud)\n从手册中:
\n\n\n有效的块大小值为每块 1024、2048 和 4096 字节。
\n
Linux 文件系统分为 4 个主要部分。
在超级块中有一个名为Block Size的参数,这意味着Linux将磁盘划分为4096个块。您可能知道块设备中的磁盘(检查ll /dev/sda
并查看左侧的b),并且您从磁盘读取块而不仅仅是字符。所以I/O块是指文件系统在读取磁盘的一部分时每读取4096个块。它与文件大小无关。为了更改 BS,您应该训练文件系统读取更小或更大的块(不推荐)。