尾块会附加到 linux 内核中的文件吗?

Would tail block appending to file in linux kernel?

我们有两个进程:

  1. 附加到日志文件
  2. 跟踪日志文件并将其发送到集中监视器

我担心进程 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 由于并发问题在进行系统调用时被阻塞是一致的。