在纯 Ubuntu 上与在 Windows (WSL) 中的 Ubuntu 上运行模拟

ABC*_*MMM 17 windows benchmarks windows-subsystem-for-linux

想请教一下在同一台电脑上测试大型CAE仿真的问题,有以下两种情况。

  1. 纯Ubuntu系统
  2. Windows 10 (WSL) 中的 Ubuntu 系统

两种情况下的计算速度几乎相同还是不同?

Ilm*_*nen 20

您的模拟软件很可能受 CPU 限制或内存限制。对于此类工作负载,人们只会看到在“裸机”或 WSL(或任何其他兼容层或使用本机执行的 VM)内部运行代码之间的任何显着差异,因为在任何一种情况下,操作系统大多只是待命而仿真代码直接在 CPU 上运行。

但是,也有可能您的模拟至少部分受 I/O 限制,这就是可能出现差异的地方。显然,WSL(目前)有一个相当慢的文件系统接口层,可以显着减慢磁盘 I/O。*也就是说,虽然磁盘 I/O 可能是多种批量数据处理任务的主要瓶颈,但“模拟”通常应该把大部分时间花在阅读和编写文件上。如果是,您可能需要考虑从 RAM 磁盘(例如本机** Linux 上的 tmpfs)运行它,以避免不必要的物理磁盘访问。

在任何情况下,唯一可以确定的方法是在两种环境中测试您的模拟并确定运行所需的时间。但是,在此之前,您可能需要查看现有的基准测试,例如Phoronix 从 2018 年 2 月开始的 WSL vs. Docker vs. VirtualBox vs. native Linux 性能基准测试,并检查对相同组件施加压力的任何测试的结果系统就像您的模拟一样。

(FWIW,Phoronix 结果似乎大多符合我上面概述的一般原则,尽管有一些值得注意的奇怪之处,例如 VirtualBox 在一些 I/O 限制基准测试中明显优于原生 Linux,这显然是由于其虚拟磁盘并不总是立即同步数据到物理磁盘。我上面没有注意到的一个潜在相关问题是,即使在裸硬件上运行时,基准测试也显示不同主机环境之间以及不同 Linux 发行版之间的多线程 OpenMP 性能存在显着差异。事后看来,这并不奇怪,因为线程和 IPC 是由内核处理的。我猜想发行版之间的大部分差异可能归结为不同的运行时和/或编译时内核调整参数。)


*) 根据2016 年的这篇 MSDN 博客文章,WSL 中实际上有两个文件系统接口组件:VolFs,它通过 NTFS 密切模拟本地 Linux 文件系统语义,用于挂载 eg /and/home和 DrvFs,它主要提供类似 Windows 的语义并用于通过/mnt/c等访问主机 Windows 驱动器。如果您的软件不特别需要本机 Linux 文件系统功能(如指向同一文件的多个硬链接),将其配置为将其数据文件存储在 DrvFs 文件夹中可能会提高文件访问性能WSL。

**) 根据2017 年 5 月的Reddit 帖子,WSL 上的“当前使用磁盘模拟 tmpfs”。除非去年发生了一些变化,否则这可能意味着在 WSL 上使用 tmpfs 不会比使用普通的磁盘文件系统带来性能优势。


Win*_*nix 12

Windows 中的 Ubuntu(WSL - 2017 秋季创作者更新)肯定比 Linux 环境中的“纯”Ubuntu 慢。

例如,与 Ubuntu 16.04 相比,Windows 10 中的屏幕绘制时间要长很多倍,即您实际上可以看到光标在 Windows 10 中移动:

WSL bash 启动.gif

WSL Bash 启动画面绘制大约需要 5 秒钟。相比之下,Ubuntu 16.04 中相同的启动画面大约需要 1 1/2 秒:

Ubuntu 终端 splash.gif


CPU 基准测试

第一部分显示了屏幕 I/O 有多慢,但 CPU 基准测试呢?

从这个 Ask Ubuntu Q&A: CPU benchmarking utility for Linux,我在 Linux 和 Windows 上的 Ubuntu 16.04 上运行了测试。在 Linux 上大约 24 秒在 Windows 10 版本 1709 上大约 31 秒。Linux 快 6 秒或大约 25%。但是,我刚刚将 Windows 10 升级到版本 1803(Redstone 4 aka Spring Creators 2018 年 4 月更新),它用了 24 秒,与 Linux 相同。

Linux 上的 Ubuntu 16.04

$ sysbench --test=cpu --cpu-max-prime=20000 run
sysbench 0.4.12:  multi-threaded system evaluation benchmark

Running the test with following options:
Number of threads: 1

Doing CPU performance benchmark

Threads started!
Done.

Maximum prime number checked in CPU test: 20000


Test execution summary:
    total time:                          23.5065s
    total number of events:              10000
    total time taken by event execution: 23.5049
    per-request statistics:
         min:                                  2.13ms
         avg:                                  2.35ms
         max:                                  8.52ms
         approx.  95 percentile:               2.76ms

Threads fairness:
    events (avg/stddev):           10000.0000/0.00
    execution time (avg/stddev):   23.5049/0.00
Run Code Online (Sandbox Code Playgroud)

Windows 10 版本 1709 上的 Ubuntu 16.04

$ sysbench --test=cpu --cpu-max-prime=20000 run
sysbench 0.4.12:  multi-threaded system evaluation benchmark

Running the test with following options:
Number of threads: 1

Doing CPU performance benchmark

Threads started!
Done.

Maximum prime number checked in CPU test: 20000


Test execution summary:
    total time:                          30.5350s
    total number of events:              10000
    total time taken by event execution: 30.5231
    per-request statistics:
         min:                                  2.37ms
         avg:                                  3.05ms
         max:                                  6.21ms
         approx.  95 percentile:               4.01ms

Threads fairness:
    events (avg/stddev):           10000.0000/0.00
    execution time (avg/stddev):   30.5231/0.00
Run Code Online (Sandbox Code Playgroud)

Windows 10 版本 1803 上的 Ubuntu 16.04

$ sysbench --test=cpu --cpu-max-prime=20000 run
sysbench 0.4.12:  multi-threaded system evaluation benchmark

Running the test with following options:
Number of threads: 1

Doing CPU performance benchmark

Threads started!
Done.

Maximum prime number checked in CPU test: 20000


Test execution summary:
    total time:                          23.7223s
    total number of events:              10000
    total time taken by event execution: 23.7155
    per-request statistics:
         min:                                  2.21ms
         avg:                                  2.37ms
         max:                                  4.53ms
         approx.  95 percentile:               2.73ms

Threads fairness:
    events (avg/stddev):           10000.0000/0.00
    execution time (avg/stddev):   23.7155/0.00
Run Code Online (Sandbox Code Playgroud)

注意: 2018 年的 Windows 10 春季更新(称为Redstone 4)于 5 月 9 日(4 天前)发布,我将很快安装它以查看改进。毫无疑问,有很多。我知道的一个让我感兴趣的是cron在启动时运行作业的能力。我需要它来自动每日备份到 gmail.com。

注意 2:我刚刚安装了 Windows 10 Build 1803(2018 年 4 月 Spring Creators Update AKA Redstone 4)并且屏幕绘制要快得多。现在只需 3 秒而不是 5 秒即可显示 Bash 启动画面。CPU 基准测试现在与 Linux 相当。

  • 请注意,这是误导性的 - 这并没有区分 I/O 性能和其他计算性能。众所周知,WSL 对于 I/O 很慢(参见 Phoronix 基准测试)。这并没有说明 OP 的计算是否可以在 WSL 中以同样快的速度完成。 (8认同)
  • 老实说,我很惊讶在两种情况下都不能有效地即时绘制启动画面。您的计算机(大概)很乐意在几毫秒内执行更复杂的屏幕更新,例如在播放视频时。我最后一次看到像你第一次录音一样慢的终端是在 90 年代初,当时在我的 2400 bps 调制解调器上拨打 BBS。 (7认同)
  • 老实说,这种基准对于任何类型的现实程序都完全没有用,因为任何本质上衡量控制台绘制速度的基准都是如此。要么您的程序瓶颈是控制台 I/O(即使在具有大多数终端模拟器的 Linux 上也非常慢),或者这不是任何有用的可靠衡量标准。 (3认同)
  • @WinEunuuchs2Unix 据我所知,几乎没有计算。但是很多 I/O:从某个地方获取天气,读取日期和时间,并以某种格式打印出来,读取系统信息等等。无论如何,你使用过 Abaqus 吗?运行实际模拟时,像它或 Ansys 或 Simulink 这样的模拟软件*不*屏幕 I/O 绑定,除非您强制模拟如此。这些完全有可能根据完成的模拟显示最终结果。 (2认同)

Jim*_*ock 7

想一想 - 在 WSL 中,您的计算机正在运行完整的图形 Windows 系统(这首先是一个可怕的资源猪)加上 Ubuntu 子系统。在本机 Ubuntu 中,它只运行 Ubuntu。

  • Windows GUI 会消耗一些内存,但在不执行任何操作时不会占用太多 CPU。我不明白为什么这会产生重大影响? (3认同)
  • @MichaelEricOberlin:更改为另一个 VT 不会影响运行级别!只是文本控制台在启动 GDM 的运行级别中*仍然可用*。(顺便说一句,运行级别基本上已经成为过去;`systemd` 不像 SysV `init` 那样工作。此评论的前半部分是假装你正在运行一个 5 或 10 年的 Linux 发行版和一个旧的 - school `init` 设置。)但是,是的,退出 X 会话并停止 X11/GDM 将释放资源,特别是如果您没有交换空间,或者您的桌面有垃圾,即使在“空闲”时也经常唤醒。 (2认同)