我想问一个关于测试大型加拿大工程学会以下两种情况在同一台计算机上进行模拟。
- 纯净的 Ubuntu 系统
- Windows 10(WSL)中的 Ubuntu 系统
两种情况下的计算速度是否几乎相同或者不同?
答案1
您的模拟软件很可能CPU 受限或内存受限对于此类工作负载,人们不会期望在“裸机”上运行代码与在 WSL(或任何其他兼容层或使用本机执行的 VM),因为在任何一种情况下,当模拟代码直接在 CPU 上运行时,操作系统大部分时间都处于待命状态。
但是,您的模拟也可能至少部分受 I/O 限制,这就是可能出现差异的地方。显然,WSL(目前)有一个相当慢的文件系统接口层,可以显著降低磁盘 I/O 速度。* 话虽如此,虽然磁盘 I/O 可能是许多类型的批量数据处理任务的主要瓶颈,但“模拟”通常应该不是大部分时间都花在读取和写入文件上。如果您的计算机是这样的,您可能需要考虑从 RAM 磁盘(例如本机** Linux 上的 tmpfs)运行它,以避免不必要的物理磁盘访问。
无论如何,唯一可以确定的方法是在两种环境中测试您的模拟并计算运行时间。不过,在执行此操作之前,您可能需要查看现有的基准测试,例如Phoronix 于 2018 年 2 月发布的 WSL、Docker、VirtualBox 和原生 Linux 性能基准测试,并检查对与模拟相同的系统组件进行压力测试的任何结果。
(FWIW,Phoronix 的结果似乎与我上面概述的一般原则基本相符,尽管也存在一些值得注意的奇怪之处,例如 VirtualBox 在一些 I/O 绑定基准测试中明显优于原生 Linux,这显然是由于其虚拟磁盘并不总是立即将数据同步到物理磁盘。我上面没有提到的一个潜在相关问题是,基准测试显示不同主机环境之间的多线程 OpenMP 性能存在显著差异以及不同的 Linux 发行版之间即使在裸机上运行也是如此。事后看来,这并不太令人惊讶,因为线程和 IPC 由内核处理。我猜想发行版之间的大部分差异可能归结为不同的运行时和/或编译时内核调整参数。)
*) 根据这篇 MSDN 博客文章从 2016 年开始,WSL 中实际上有两个文件系统接口组件:VolFs,它通过 NTFS 紧密模拟本机 Linux 文件系统语义,用于挂载例如/
和/home
,以及 DrvFs,它提供大部分类似 Windows 的语义,用于通过/mnt/c
等访问主机 Windows 驱动器。如果你的软件没有特别需要本机 Linux 文件系统功能(例如指向同一文件的多个硬链接),请将其配置为将其数据文件存储在 DrvFs 文件夹中可能提高 WSL 上的文件访问性能。
**) 根据此 Reddit 帖子自 2017 年 5 月起,“tmpfs 目前使用磁盘模拟”在 WSL 上。除非去年发生了一些变化,否则这可能意味着在 WSL 上使用 tmpfs 不会比使用普通的磁盘文件系统带来任何性能优势。
答案2
Windows 中的 Ubuntu(WSL - 2017 Fall Creators Update)肯定比 Linux 环境中的“纯”Ubuntu 慢。
例如,Windows 10 中的屏幕绘制时间比 Ubuntu 16.04 中的长很多倍,也就是说,你实际上可以在 Windows 10 中看到光标移动:
WSL Bash 启动画面绘制大约需要 5 秒钟。相比之下,Ubuntu 16.04 中相同的启动画面大约需要 1.5 秒:
CPU 基准测试
第一部分显示了屏幕 I/O 有多慢,但是 CPU 基准测试又如何呢?
来自这个 Ask Ubuntu 问答:Linux 的 CPU 基准测试实用程序我在 Linux 和 Windows 上的 Ubuntu 16.04 上进行了测试。在 Linux 上大约需要 24 秒,在 Windows 10 版本 1709 上大约需要 31 秒。Linux 快 6 秒,快约 25%。但是我刚刚将 Windows 10 升级到版本 1803(Redstone 4 又名 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
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
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
笔记:Windows 10 2018 年春季更新(称为红石4) 于 5 月 9 日(4 天前)发布,我将很快安装它以查看改进之处。毫无疑问,改进之处很多。我知道让我感兴趣的是cron
启动时运行作业的能力。我需要它来自动每天备份到 gmail.com。
笔记2:我刚刚安装了 Windows 10 Build 1803(2018 年 4 月春季创意者更新,又名 Redstone 4),屏幕绘制速度快了很多。现在显示 Bash 启动画面只需 3 秒,而不是 5 秒。CPU 基准测试现在与 Linux 相当。
答案3
想想看 - 在 WSL 中,您的计算机运行完整的图形化 Windows 系统(这首先是一个可怕的资源消耗大户)以及 Ubuntu 子系统。在原生 Ubuntu 中,它只运行 Ubuntu。
答案4
我不知道这是否会特别影响你的模拟,但它可能会:
WSL 确实不是使用 RAM 作为共享内存!它使用磁盘!
这意味着,如果你的模拟使用共享内存(想想/dev/shm
),它可能会很慢并且/或者磨损你的存储设备!而性能损失来自一些层数:
文件系统驱动程序
存储驱动程序
存储介质
但如果不这样做,那么其性能应该与裸机 Ubuntu 相似(假设没有其他 I/O,正如其他人提到的)。