尾块会附加到 linux 内核中的文件吗?
Would tail block appending to file in linux kernel?
我们有两个进程:
- 附加到日志文件
- 跟踪日志文件并将其发送到集中监视器
我担心进程 2 在读取文件时是否会阻塞进程 1?这里 kernel/disk 驱动程序中是否存在锁争用?
这两个请求需要在文件系统级别(在内核中)进行同步。编写器通过锁定与文件对应的 inode 来阻止 reader 一段时间。实际性能损失取决于您使用的文件系统和您追加的数据量。
这里有一个小实验来验证这一点。我们首先创建一个打开文件的程序,反复查找文件末尾,并尝试读取它找到的任何内容。同时,我们有一个不同的过程,可以连续向文件追加一个零字节。
1 #include <stdio.h>
2
3 int main() {
4 int i;
5 char buf[8192];
6 int fd = open("test", 'r');
7 while (i<100000000) {
8 lseek(fd, 0, SEEK_END);
9 read(fd, buf, sizeof(buf));
10 i++;
11 }
12 return 0;
13 }
现在我们在 ext4 文件系统中创建 "test" 文件并开始追加:
dd if=/dev/zero of=test bs=1M count=1
while true ; do dd if=/dev/zero of=test bs=1 oflag=append; done
运行 追加时的程序:
time ./readfile
real 1m24.393s
user 0m4.173s
sys 1m15.518s
虽然 运行 没有追加:
time ./readfile
real 0m30.480s
user 0m3.130s
sys 0m27.349s
如您所见,修改文件时读取速度要慢得多,主要区别在于系统时间。这与 reader 由于并发问题在进行系统调用时被阻塞是一致的。
我们有两个进程:
- 附加到日志文件
- 跟踪日志文件并将其发送到集中监视器
我担心进程 2 在读取文件时是否会阻塞进程 1?这里 kernel/disk 驱动程序中是否存在锁争用?
这两个请求需要在文件系统级别(在内核中)进行同步。编写器通过锁定与文件对应的 inode 来阻止 reader 一段时间。实际性能损失取决于您使用的文件系统和您追加的数据量。
这里有一个小实验来验证这一点。我们首先创建一个打开文件的程序,反复查找文件末尾,并尝试读取它找到的任何内容。同时,我们有一个不同的过程,可以连续向文件追加一个零字节。
1 #include <stdio.h>
2
3 int main() {
4 int i;
5 char buf[8192];
6 int fd = open("test", 'r');
7 while (i<100000000) {
8 lseek(fd, 0, SEEK_END);
9 read(fd, buf, sizeof(buf));
10 i++;
11 }
12 return 0;
13 }
现在我们在 ext4 文件系统中创建 "test" 文件并开始追加:
dd if=/dev/zero of=test bs=1M count=1
while true ; do dd if=/dev/zero of=test bs=1 oflag=append; done
运行 追加时的程序:
time ./readfile
real 1m24.393s
user 0m4.173s
sys 1m15.518s
虽然 运行 没有追加:
time ./readfile
real 0m30.480s
user 0m3.130s
sys 0m27.349s
如您所见,修改文件时读取速度要慢得多,主要区别在于系统时间。这与 reader 由于并发问题在进行系统调用时被阻塞是一致的。