linux - block 文件写入的优点是什么

标签 linux performance io

我想知道逐 block 写入文件的优点是什么。我认为它会减少 io 操作。但是在类似 Linux 的环境中,数据无论如何都会进入页面缓存和后台守护进程进行物理磁盘写入(如果我错了请纠正我)。在那种环境中, block 写入的优点是什么?

最佳答案

如果我对您的问题的理解正确,那么您是在询问使用更大块的优势,而不是逐个字符地编写。

您必须考虑到每次使用系统调用(例如 write())本身都有最低成本,无论正在做什么。此外,它可能导致调用进程受到 context switch 的影响。 ,这有其自身的成本,并且还允许其他进程使用 CPU,从而导致更严重的延迟。

因此 - 即使我们忘记了直接和同步 I/O 模式,在这些模式中每个操作都可能立即写入磁盘 - 从性能的角度来看,通过移动更大的数据 block 来减少这些恒定成本的影响是有意义的.

使用 dd 传输 1,000,000 字节的简单演示:

$ dd if=/dev/zero of=test.txt count=1000000 bs=1 # 1,000,000 blocks of 1 byte
1000000+0 records in
1000000+0 records out
1000000 bytes (1.0 MB) copied, 1.55779 s, 642 kB/s
$ dd if=/dev/zero of=test.txt count=100000 bs=10 # 100,000 blocks of 10 bytes
100000+0 records in
100000+0 records out
1000000 bytes (1.0 MB) copied, 0.172038 s, 5.8 MB/s
$ dd if=/dev/zero of=test.txt count=10000 bs=100 # 10,000 blocks of 100 bytes
10000+0 records in
10000+0 records out
1000000 bytes (1.0 MB) copied, 0.0262843 s, 38.0 MB/s
$ dd if=/dev/zero of=test.txt count=1000 bs=1000 # 1,000 blocks of 1,000 bytes
1000+0 records in
1000+0 records out
1000000 bytes (1.0 MB) copied, 0.0253754 s, 39.4 MB/s
$ dd if=/dev/zero of=test.txt count=100 bs=10000 # 100 blocks of 10,000 bytes
100+0 records in
100+0 records out
1000000 bytes (1.0 MB) copied, 0.00919108 s, 109 MB/s

作为一个额外的好处,使用更大的数据 block 可以让 I/O 调度器和文件系统的分配器对您的实际工作负载做出更准确的估计。

关于linux - block 文件写入的优点是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11444851/

相关文章:

Java - 从 jar 中删除 META-INF 不起作用

c++ - 为 ARM 交叉编译应用程序时与 sdl 链接时出错

c - 为什么我们在调用 bind() 时将 sockaddr_in 转换为 sockaddr?

python - fabric 没有获取 Django 环境

linux - 如何编辑 FreeBSD .gz 引导文件?

performance - "nscanned"查询上的 "update"值非常高 - 似乎高于所有索引中所有条目的总和

php - 连接和搜索具有一对多关系的多个 MySQL 表

c# - 重写结构体的 Equals 方法如何提高 C# 中的性能?

java - File.mkdirs() 创建目录而不是文件

java - 检查另一个用户是否有写文件的权限