【问题标题】:Only disk writes but iotop shows reads as well只有磁盘写入,但 iotop 也显示读取
【发布时间】:2010-07-26 12:34:41
【问题描述】:

我想了解以下问题:

一个进程在一个无限循环中只做写系统调用。当我提出 iotop 时,我希望看到与该过程相关的非零写入速度和零读取速度。但是 iotop 告诉 read 和 write 可以相等(取决于单个写入大小)。看一下C代码:

#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdio.h>
#define BUFSIZE 1000000

char buf[BUFSIZE];
const int write_size = 4000;

int main(){
  int fd;
  if ((fd = open("filename", O_RDWR | O_CREAT, 0666)) < 0){
    return -1;
  }
  ssize_t ret;
  while (1){
    ret = write(fd, buf, write_size);
    if (ret != write_size){
      return -1;
    }
  }
  return 0;
}

如果您为“write_size”分配不同的值,您将在 iotop 中看到不同的读取速度。如果值和上面的代码一样,iotop 显示 read 和 write 是相等的。

重要:
该问题仅在特定条件下出现:
- 在运行代码之前,必须创建文件并填充数据(假设至少 8GB)

操作系统配置:
Debian lenny,2TB 磁盘,(xfs 和 ext4 都经过测试), unname -a Linux g-6 2.6.26-bpo.1-xen-amd64 #1 SMP Mon Jan 12 14:32:40 UTC 2009 x86_64 GNU/Linux

提前感谢您解开谜团,
迈克尔。

【问题讨论】:

  • 这个问题的好文章!我希望每个新手都能写得这么好,并且在描述他们的问题时透彻。欢迎来到本站!

标签: c linux io


【解决方案1】:

您正在打开一个现有文件,其中包含数据。 您正在覆盖它(没有 O_APPEND)。 因此,在写入 X 数据时,文件系统需要获取内容(= 块),将您的写入覆盖它,然后将块推回磁盘上。

【讨论】:

    【解决方案2】:

    您以覆盖模式打开文件,但写入的块不是磁盘上块大小的倍数(4000 而不是 4096)。因此,该进程会时不时地刷新缓冲区,并且需要从磁盘读取一个块以弥补间隙。

    添加O_TRUNC 让谜团消失。请注意,该进程现在将在启动期间挂起,因为删除 8GB 需要一些时间。

    【讨论】:

      【解决方案3】:

      尝试使用 O_WRONLY | 打开文件O_CREAT,如果你想打开它只是为了写。它可能会解决问题 - 当您说文件必须在调用 open() 之前包含数据时,它看起来很合理。

      【讨论】:

        猜你喜欢
        • 2019-07-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-12-02
        • 2013-09-14
        • 2016-12-09
        • 2014-01-05
        相关资源
        最近更新 更多