2010-07-26 61 views
3

我想明白了以下問題:只有磁盤寫入,但iotop顯示讀取以及

一種方法是做只寫SYS通話,無限循環。當我提出iotop時,我期望看到與該進程相關的非零寫入速度和零讀取速度。但是iotop告訴讀寫可以相等(取決於單個寫入大小)。看一看的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顯示讀取和寫入相等。

重要:
的問題似乎只在一定的條件:
- 運行代碼

OS的conf之前,必須創建該文件並填充數據(可以說至少8GB):
Debian lenny,2TB磁盤,(經過xfs和ext4測試), uname -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

Thanks in advan ce解決這個謎題,
Michal。

+0

這個問題的優秀文章!我希望每個新手都能很好地描述他們的問題。歡迎來到這個網站! – 2010-07-26 12:47:53

回答

3

您正在打開一個包含數據的現有文件。 您正在覆蓋它(無O_APPEND)。因此,在寫入X數據時,文件系統需要獲取內容(=塊),將其寫入,然後將塊推回到磁盤上。

2

以覆蓋模式打開文件,但是以不是磁盤上塊大小倍數的塊(4000而不是4096)寫入塊。因此,每隔一段時間,該進程將刷新緩衝區,並且需要從磁盤讀取一個塊以彌補差距。

添加O_TRUNC使神祕消失。請注意,該進程現在將在啓動過程中掛起,因爲刪除8GB需要一些時間。

0

嘗試用O_WRONLY打開文件| O_CREAT,如果你想打開它只是爲了寫作。它可以解決這個問題 - 並且在你調用open()之前說文件必須包含數據時看起來是合理的。