【问题标题】:linux redirect 100GB stdout to file failslinux将100GB标准输出重定向到文件失败
【发布时间】:2015-10-16 21:13:47
【问题描述】:

我有这个命令可以将超过 100GB 的数据写入文件。

zfs send snap1 > file

在这个过程几个小时后似乎出现了问题。例如,如果我运行该作业两次,输出会略有不同。如果我尝试使用

处理文件
zfs receive snap2 < file

几个小时后报告错误。

出于调试目的,我猜测 shell 重定向中存在一些低概率故障。有没有其他人看到重定向大量数据的问题?有什么建议可以继续吗?

调试这个很乏味,因为小例子可以工作,而且每次运行大案例需要 3 多个小时。

之前我尝试过管道:

zfs send snap1| zfs receive snap2

然而,这总是失败的更小的例子,为此

zfs send snap1 > file; zfs receive snap2 < file

工作。 (我发布了一个关于此的问题,但没有得到有用的回复。)这是我怀疑 shell 的另一个原因。

谢谢。

【问题讨论】:

    标签: linux shell redirect bigdata


    【解决方案1】:

    与 zfs 中的错误或使用方式的问题相比,shell(或操作系统)发生故障的可能性可以忽略不计。

    只需几分钟即可检验您的假设:编译这个愚蠢的程序:

    #include<unistd.h>
    #include<string.h>
    
    #define BUF 1<<20
    #define INPUT 56
    
    int main(int argc, char* argv[]) {
      char buf[BUF], rbuf[BUF], *a, *b;
      int len, i;
      memset(buf, INPUT, sizeof(buf));
      if (argc == 1)
      {
        while ((len = read(0, rbuf, sizeof(rbuf))) > 0)
        {
          a = buf; b = rbuf;
          for (i = 0; i < len; ++i)
          {
            if (*a != *b)
              return 1;
            ++a; ++b;
          }
        }
      }
      else
      {
        while (write(1, buf, sizeof(buf)) > 0);
      }
      return 0;
    }
    

    然后在一个shell中尝试mkfifo a; ./a.out w &gt; a,在另一个shell中尝试pv &lt; a | ./a.out,看看需要多长时间才能获得任何位翻转。

    它应该会比较快地进入 TiB 区域...

    【讨论】:

      猜你喜欢
      • 2013-10-09
      • 1970-01-01
      • 2015-05-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多