IO Block的含义是什么以及如何计算?

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)

Mat*_*aun 5

简短说明

\n
    \n
  • \ 输出中的“IO Block”stat是文件系统用于读写文件的首选字节数。一个 IO 块通常为4096 字节
  • \n
  • 另一方面,“块”计算在磁盘上为文件分配了多少个512 字节块。
  • \n
\n

更详细的解释

\n

“IO 块”与“块”

\n

IO块

\n

“IO 块”是文件系统用于读写文件的首选字节数。

\n

在我的 ext4 分区上,这个数字固定为 4096 字节。

\n

4096 字节的块大小也是 512 MB 到 4 TB 之间的文件系统的默认值。请参阅man mke2fs.conf中的选项/etc/mke2fs.conf文档。-Tman mkfs.ext4

\n

积木

\n

另一方面,“Blocks”给出了为磁盘上的文件分配的512 字节块的数量。请注意,“Blocks”中的块stat与“IO Block”中的块具有不同的大小:

\n
    \n
  • “IO Block”块中的字节数:由文件系统定义。你和我的情况都是 4096 字节。
  • \n
  • “块”块中的字节数:始终为 512 字节。
  • \n
\n

我们如何知道“IO Block”和“Blocks”真正指的是什么?

\n

深入挖掘stat\ 的源代码,我们发现这一行创建了默认输出stat

\n
Size: %-10s\\tBlocks: %-10b IO Block: %-6o %F\\n\\\n
Run Code Online (Sandbox Code Playgroud)\n

拆开来看:

\n

Size: %-10s:“Size:”打印文件的大小(以字节为单位),并使用 进行一些填充-10

\n

Blocks: %-10b:“Blocks”打印占位符的值%b(带有一些填充)。什么是%b?根据man 1 stat

\n
\n

%b 分配的块数(参见 %B)

\n
\n

看一下%B

\n
\n

%B %b 报告的每个块的大小(以字节为单位)

\n
\n

“Blocks”表示的块中有多少字节?

\n
stat --format="%B" ~/small_file\n
Run Code Online (Sandbox Code Playgroud)\n

这会打印“512”。好吧,“Blocks”的块大小是 512 字节。

\n

接下来是打印“IO Block”的代码:

\n

IO Block: %-6o: 占位符是什么%o?直接来自man 1 stat

\n
\n

%o 最佳 I/O 传输大小提示

\n
\n

有趣的!“IO 块”是“最佳 I/O 传输大小提示”的缩写。

\n

在 ext4 文件系统上运行:

\n
stat --format="%o" ~/small_file\n
Run Code Online (Sandbox Code Playgroud)\n

我们了解到“IO 块”是 4096 字节。这是一个相当大的尺寸差异:

\n
    \n
  • “IO块”:4096字节
  • \n
  • “块”:512 字节
  • \n
\n

把它们放在一起:

\n
stat --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

文件为 116 字节,但在磁盘上需要 512*8 字节。最佳 I/O 传输大小提示(别名 IO 块):4096 字节

\n
\n

人们很容易错误认为Blocks 值计算的是磁盘上分配的 IO 块的数量。

\n

stat系统调用

\n

从中man 2 stat我们可以了解更多关于IO传输大小提示,也称为“IO块”:

\n
\n

st_blksize 字段给出了高效文件系统 I/O 的“首选”块大小。(以较小的块写入文件可能会导致读取-修改-重写效率低下。)

\n
\n

还引用了描述有助于理解“块”的man 2 stat字段:st_blocksstat

\n
\n

该字段指示分配给文件的块数,以 512 字节为单位。

\n
\n

更多示例stat

\n

以下是缩短的示例输出stat ~/small_file

\n
File: /home/mb/small_file\nSize: 116           Blocks: 8          IO Block: 4096   regular file\n// Rest omitted\n
Run Code Online (Sandbox Code Playgroud)\n
    \n
  • Size: 116表示该文件中有116字节的数据。但它没有告诉我们使用了多少字节来在磁盘上存储该文件。这就是“块”的用途。
  • \n
  • Blocks: 8表示该文件在磁盘上占用 8 * 512 = 4096 字节。鉴于该文件只有 116 字节的数据,这有点浪费。但我们不能使用更少的字节,因为我的系统上 ext4 的块大小是 4096 字节。多么浪费?让我们计算一下:116 / 4096 * 100 \xe2\x89\x88 2.8这意味着分配的字节中只有大约 2.8% 实际用于存储文件的数据。
  • \n
  • IO Block: 4096表示一次从磁盘读取或写入的首选字节数。
  • \n
\n

另一个文件稍大的示例stat ~/larger_file

\n
File: /home/mb/larger_file\nSize: 91246         Blocks: 184        IO Block: 4096   regular file\n// Rest omitted\n
Run Code Online (Sandbox Code Playgroud)\n
    \n
  • Size: 91246告诉我们该文件中的字节数,与我们的文件系统以及它在磁盘上物理占用的字节数无关。
  • \n
  • Blocks: 184让我们计算一下该文件在磁盘上实际占用的字节数:184 * 512 = 94208 字节。这些分配的字节中有多少用于实际存储larger_file数据?91246 / 94208 * 100 \xe2\x89\x88 96.9。大约 96.6% 是文件的数据,这比我们之前使用~/small_file.
  • \n
\n

更改“IO 块”的值

\n

我怀疑您是否可以更改现有文件系统的“IO Block”值。这是对此的讨论。

\n

如果您要创建新的文件系统,则可以选择-b指定块大小(以字节为单位)。

\n
mkfs.ext4 -b 2048 /dev/sdb1\n
Run Code Online (Sandbox Code Playgroud)\n

手册中:

\n
\n

有效的块大小值为每块 1024、2048 和 4096 字节。

\n
\n


Ali*_*our 0

Linux 文件系统分为 4 个主要部分。

  1. 引导块
  2. 超级街区
  3. I-列表
  4. 数据块

在超级块中有一个名为Block Size的参数,这意味着Linux将磁盘划分为4096个块。您可能知道块设备中的磁盘(检查ll /dev/sda并查看左侧的b),并且您从磁盘读取块而不仅仅是字符。所以I/O块是指文件系统在读取磁盘的一部分时每读取4096个块。它与文件大小无关。为了更改 BS,您应该训练文件系统读取更小或更大的块(不推荐)。