为什么 tar -c dir | pigz > /mnt/nfs/dir.tgz 使用网络,然后循环使用 CPU,而不是同时使用两者(存在一个瓶颈)

为什么 tar -c dir | pigz > /mnt/nfs/dir.tgz 使用网络,然后循环使用 CPU,而不是同时使用两者(存在一个瓶颈)

我想通过 1Gbit 网络以最高效的方式将多 TB 目录传输到 nfs 挂载目录(可能是限制因素)

3 个选项 -

  1. tar 并压缩,然后复制
  2. 复制,然后 tar 并压缩
  3. tar | 压缩

在我看来,#3 显然是最高效的,因为我只读取和写入数据一次。不幸的是,我的命令 (tar -c dir | pigz > /mnt/nfs/dir.tgz ) 似乎先 tar 一段时间,然后 zip 一段时间,然后 tar 一段时间……并且网络大部分时间处于空闲状态,然后 CPU 处于空闲状态。

我是否错过了一些选项?

PS我的问题似乎与这个问题但这并没有答案,并没有真正提出关于网络和 CPU 饱和度交替的确切问题。

答案1

您可能忘记了这样一个事实:在 UNIX/Linux 中,一个进程每次只能执行一个 BLOCKING I/O 操作。tar 或 compress 函数中不包含并发读取或写入操作。这两个进程在其 I/O 调用期间也不进行任何数据处理。

有一些缓冲过滤器尝试通过使用共享内存和两个进程(一个用于读取,另一个用于写入)来减轻这种影响。

在这种模型下,您必须重新分析您的选项以确定瓶颈和实际的系统运行顺序。

相关内容