首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >只有磁盘写入,而iotop显示也读取。

只有磁盘写入,而iotop显示也读取。
EN

Stack Overflow用户
提问于 2010-07-26 12:34:41
回答 3查看 1.1K关注 0票数 3

我想了解以下问题:

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

代码语言:javascript
复制
#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显示读和写相等。

重要:

问题仅在特定条件下出现:

-在运行代码之前,必须创建文件并填充数据(比如至少8GB)。

OS conf:

Debian,2TB磁盘(包括xfs和ext4测试),uname -a Linux g-6 2.6.26-bpo.1-xen- and 64 #1 SMP Mon Jan 12 :32:40 UTC 2009 x86_64 GNU/Linux

提前感谢你解开这个谜团,

米哈尔。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-07-26 12:40:26

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

票数 3
EN

Stack Overflow用户

发布于 2010-07-26 12:40:47

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

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

票数 2
EN

Stack Overflow用户

发布于 2010-07-26 12:45:08

如果您想打开仅供编写的文件,请尝试使用O_WRONLY \ O_CREAT打开该文件。它可能解决了这个问题--当您说文件在调用open()之前必须包含数据时,它看起来是合理的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3334795

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档