长时间写入操作期间 CPU 异常高

长时间写入操作期间 CPU 异常高

我有一组大文件,有时会在 Linux 机器和 Windows 机器之间来回复制。每个文件大约 2 GB,通常有 10 个左右(它们是 VM 映像)。VM 在 Linux(qemu)上运行,我将其备份到 Windows 机器。在这种情况下,VM 未运行。

当我将文件从 Linux 机器复制到 Windows 机器时,一切都运行正常。当我将文件从 Windows 机器复制回 Linux 机器时,Linux 机器的 CPU 使用率异常高且持续存在,文件传输非常(非常)缓慢。

我使用 socat、lz4 和 tar 来传输文件。在 Windows 机器上,我使用 cygwin 来执行 socat、tar 等(但这并不重要,因为 Windows 机器运行良好)。我选择 lz4 是因为它非常(非常)快并且(像 gzip 等)提供校验和。

当我从 Linux 机器复制文件时,Linux 命令是: tar cvf - *vmdk | lz4 -B64 | socat - TCP-LISTEN:7777,reuseaddr而 Windows 命令是socat TCP:linuxserver:7777 - > bigbackup.tar.lz4。这工作正常,我的网络利用率达到 25% 到 100%,所有系统的 CPU 使用率都低于 25%。

当我将文件复制回 Linux 机器时,Linux 命令是:socat TCP-LISTEN:7777,reuseaddr - | lz4 -d | tar xvf -而 Windows 命令是cat bigbackup.tar.lz4 | socat - TCP:linuxserver:7777

当我运行此恢复操作将文件复制回我的 Linux 机器时,传输工作在几秒钟内按预期进行,然后传输开始停滞并变慢,Linux 机器上的 CPU 开始飙升,然后稳定在 100%,所有其他程序都变得响应较慢(有时甚至没有响应)。如果我不管它,传输最终会完成,但速度大约只有我认为应该速度的 5%,并且 CPU 一直处于稳定状态。

如果我使用 Windows 任务管理器的“网络”选项卡或 Linux gnome-system-monitor,网络历史记录会很奇怪 - 数据传输时间约为 25%,传输利用率为 2 到 5 秒,然后 30 到 40 秒内为零。这种情况会重复发生,直到传输完成。整个过程中 CPU 都为 100%。使用 htop (Linux),socat 和 lz4 进程的 CPU 使用率为 0 到 2%,tar 进程有时会飙升至 25%,但即使这些进程的总和很低,一些未说明的线程也会使用剩余的 CPU。我尝试对 tar 进程使用 renice,但没有效果。

如果我在其他 (Windows) 机器上运行恢复过程(使用相同的命令),传输会顺利进行,网络利用率会从 25% 到 100%,与备份一样。不幸的是,我没有其他 Linux 机器可以测试。

出现此问题对我来说就像周二无法左转的汽车一样令人困惑。如果 Linux 机器中的磁盘由于写入速度慢而停滞(它是 SSD),我预计内核线程会阻塞,让 CPU 保持可用状态。

以下是有关硬件和系统的一些信息。

  • Debian GNU/Linux 9.1(延伸)
  • Intel NUC NUC5CPYB,配备赛扬 CPU N3050 @ 1.60GHz(2 核)
  • 8 GB DRAM
  • Realtek RTL8111/8168/8411 PCI Express 千兆 (板载)
  • SanDisk SSD PLUS 480GB
  • 该系统用作网络路由器和 VM 主机(小型实用程序 VM),典型 CPU 为 25% 到 50%

我查看了 TAR 的文档,似乎没有任何标志可以控制系统如何写入文件(例如缓冲、缓存、同步写入等)。

有人知道为什么会发生这种情况吗?有什么方法可以解决它或减少其影响吗?

答案1

在 Windows 系统上,您是否尝试过禁用防病毒软件?

您还可以使用 wireshark 查看您得到的结果。

但听起来 Linux 和 Windows 之间似乎有些不一致,这听起来有点愚蠢,但看看在 Windows 上启动到带网络连接的安全模式时会发生什么,看看是否可以通过这种方式传输文件,或者至少看看是否能获得更好的结果。如果您注意到传输速度更快,那么您可能需要尝试干净启动以找出哪个程序导致了 CPU 峰值。

还要确保两个盒子之间的互联网稳定。(如果您的网速很慢,也可能是这个原因)

相关内容