Только запись на диск, но iotop показывает чтение также - PullRequest
3 голосов
/ 26 июля 2010

Я бы хотел понять следующую проблему:

Процесс выполняет только вызов sys write в бесконечном цикле. Когда я поднимаю 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 показывает, что чтение и запись равны.

Важно:
Проблема появляется только при определенных условиях:
- Файл должен быть создан и заполнен данными (скажем, не менее 8 ГБ) перед запуском кода

OS conf:
Debian lenny, диск 2 ТБ, (протестированы как xfs, так и ext4), uname -a Linux g-6 2.6.26-bpo.1-xen-amd64 # 1 SMP понедельник, 12 января 14:32:40 UTC 2009 x86_64 GNU / Linux

Заранее спасибо за разгадку тайны,
Михал.

Ответы [ 3 ]

3 голосов
/ 26 июля 2010

Вы открываете существующий файл с данными.Вы перезаписываете его (нет O_APPEND).Таким образом, при записи данных X файловая система должна получить содержимое (= блок), поместить запись поверх него, а затем отодвинуть блок на диск.

2 голосов
/ 26 июля 2010

Вы открываете файл в режиме перезаписи, но записываете куски, не кратные размеру блока на диске (4000 вместо 4096).Так что время от времени процесс будет очищать буферы, и ему нужно будет прочитать блок с диска, чтобы восполнить пробел.

Добавьте O_TRUNC, чтобы загадка исчезла.Обратите внимание, что теперь процесс зависает при запуске, поскольку для удаления 8 ГБ требуется некоторое время.

0 голосов
/ 26 июля 2010

Попробуйте открыть файл с помощью O_WRONLY | O_CREAT, если вы хотите открыть его только для записи. Это может решить проблему - и выглядит разумно, когда вы говорите, что файл должен содержать данные перед вызовом open ().

...