Apple M1,ARM / x86 Linux虚拟化和Boinc

2021-01-11 17:22:54

大约六个月前,我推测苹果公司将如何应对即将到来的(当时传闻的)ARM过渡。苹果公司做到了,已经交付了硬件,而且我现在有机会玩了一段时间。我也像往常一样走了一些怪异的道路-如ARM Linux虚拟化,x86 Linux仿真和ARM VM中的BOINC!

我使用过的最快的Linux机器是Apple M1上的硬件虚拟化安装-这篇文章介绍了如何做!

虽然我通常不习惯购买刚发布的全新硬件,但我为M1买了个例外,并购买了M1 Mac Mini来代替Intel Mac Mini(我已经替换了功能完善的2014 iMac如果显示器没有发生故障,仍然可以运行-使用的显示器组件在未破裂的情况下售价为600美元)。英特尔公司并没有满足我的大部分要求(说GPU烂透了,这是一种轻描淡写的说法),我一直在追求中端ARM台式机很久了,而且事情会破裂。它不会打扰我-对我来说这不是生产机器,所以我很高兴在流血的,略微断裂的边缘上运行。这是ARM台式机使用的共同主题,尤其是64位,因此没有什么不同。

如何?它很快。真的非常快。不仅是强大的功能-这也很棒,而且简单,平坦,可以将其用于其他用途。太奇妙了。我认为这真的很好,但是超越了它,超越了“是的,我称之为神奇……”的境界。风扇几乎永远不会闲置,功耗(我在太阳能办公室工作,还记得吗?)是一个舍入误差,它确实可以按我的要求快速完成。

我的意思是,它甚至可以播放具有相当不错的图形的Kerbal Space Program!那是一个没有本机端口的x86游戏,也不完全是CPU吸盘!

这确实意味着杰布再次陷入了他可能宁愿不被卡住的地方。锁定舞台,否则拇指抽搐可能会使您离开Mun之上100m,而没有附加下降(或上升!)的舞台…

您是否应该购买Apple的M1设备之一?可能不是-等待6个月以获取下一轮硬件,然后再购买。到那时,大多数软件生态系统的怪癖都将得到解决,并且几乎所有东西都将起作用。就目前而言,我建议您别无选择,除非您对此表示满意,并希望电池寿命和性能达到合理的水平,否则我建议您推迟一下。

是的,是的,我知道,您超频的AMD ThreadBlaster 7970XP具有足够的线程数,可以在400W上更快地构建内核。所有这些性能都在30W左右,这是他们的第一遍。等等...

现在,我们对疯狂的x86转换性能也有一个答案(付出或付出大约是本机性能的80%,是的,这的确意味着M1运行x86二进制文件的速度比许多x86硬件要快)。之前,我已经在ARM上运行过x86二进制文件,并且在Rpi4上获得了大约10%的本机性能。痛苦。苹果的Rosetta 2可以从预编译翻译器中受益匪浅(在大多数情况下-它仍然必须解释JIT类型的工作负载),但是大多数人认为,充其量可以使您获得50%的收益。 ARM内存模型与x86根本不同,您最终会在各处散布内存障碍以确保跨线程一致性,这确实损害了性能。

问题是在x86上,如果您按特定顺序写入内存地址,则所有其他内核将看到相同顺序的写入。如果您写入一些数据,然后写入“ Ready!”标记,等到其他内核看到标记更改值时,就可以确定已经写入了数据blob。没有明确的(且缓慢的)内存屏障指令,ARM无法提供此类保证,这就是为什么ARM Windows上的x86仿真很痛苦的原因-保证较弱的内存模型上已翻译二进制文件的正确性很慢。

事实证明,Apple并不仅仅是在软件方面做到这一点-他们的硬件中拥有Total Store Ordering支持!当M1运行翻译后的x86二进制文件时,操作系统只是告诉芯片:“嘿,为此线程使用x86内存排序。”本机为ARM构建的事物可以利用内存重新排序的性能提升,而需要严格排序的事物可以得到严格排序。这是一种非常,非常聪明的方法,可以完全绕开翻译后的二进制文件的内存排序问题,这在星球上的任何其他ARM芯片中都不是问题(我会说,但我真的不认为这会成为流行实施的东西-苹果公司建立自己的芯片的特权)。

现在,发布的核心内容是:构建qemu以运行硬件虚拟化的ARM Linux!我从这些出色的说明开始作为指导,但是我还抛出了一些额外的补丁程序(因为它无法在我的M1和11.1上运行x86仿真),并且在此过程中我还要做其他一些事情。

您需要安装XCode,并且我们将使用自制软件安装构建qemu的一些先决条件。加上源代码的一些补丁,……我保证,这一切都很好玩!我不保证这会完全适合您,尽管我会尽力!

是的,我知道Parallels可以进行技术预览,您仍然无法更改Linux guest虚拟机的分辨率。如果您可以使用1024x768,则可以使用它,但是…我们可以使用开源做得更好!

您将需要XCode命令行工具(gcc等)来构建它,因此,如果尚未安装,请继续从App Store安装XCode。很大。

据了解,如果您不想完全安装,也可以通过运行xcode-select --install从命令行安装它们。这是我使用任何Mac电脑所做的第一件事,因此我将它们放到了周围。您可能还必须同意一些许可条款-自从我进行全新安装以来已经有一段时间了。

如果您使用正常的Homebrew安装路径,则将获得在Rosetta下运行的x86 Homebrew。这对大多数用例来说都很好,并且肯定比ARM Homebrew更好(一半代码不会在ARM下构建),但对ARM本机依赖项没有好处,我们将构建ARM本机qemu。

如果您依靠x86自制软件,那么……呃……修复没有构建的ARM东西?我想还是要安装到另一个目录。抱歉,我对并行安装Homebrew没有很好的建议。

cd〜mkdir自酿&& curl -L https://github.com/Homebrew/brew/tarball/master | tar xz --strip 1 -C homebrewsudo mv homebrew / opt / homebrewecho' export PATH =" / opt / homebrew / bin:$ PATH"' >> 〜/ .zshrcsource〜/ .zshrcbrew更新

这将运行一些git fetch,一些构建,并且您通常应该有一个有效的brew安装。与XCode一样,这可能需要一段时间,具体取决于您的Internet连接。最近,我的ISP比平时吸吮更多,而且我没有本地制作Homebrew的镜像,所以……喝咖啡。

下一步:我们将下载qemu源码,签出正确的版本,应用几个补丁并进行构建!

第一个补丁程序系列是更新的核心-它增加了Hypervisor.framework支持(Apple最近的“所以,您想在没有内核模块的情况下进行硬件虚拟化……”框架),增加了对输出二进制文件进行签名以使其能够使用的功能。以及与Apple Silicon支持有关的各种其他事项。

运行硬件虚拟化实际上并不需要第二个修补程序系列,但是如果您想弄清楚M1上x86 VM的(有点糟糕,但仍然可以使用)性能,则需要此。 Apple Silicon防止内存页面同时可写和可执行,并且这添加了切换开关以正确处理事情,以便JIT引擎可以工作。

如果您没有应用第二个补丁,并且尝试运行x86系统仿真,则在尝试运行它时会收到极其无用的错误“无法分配动态翻译器缓冲区”。

而且,当然,如果您对x86仿真不感兴趣,则可以跳过目标列表中的x86_64-softmmu和i386-softmmu选项进行配置。

git clone https://git.qemu.org/git/qemu.gitgit结帐主-b wip / hvfcurl' https://patchwork.kernel.org/series/400619/mbox/' | git是--3waycurl' https://patchwork.kernel.org/project/qemu-devel/patch/ [受电子邮件保护] / mbox /&| git am --3waymkdir buildcd build ../ configure- -target-list = aarch64-softmmu,x86_64-softmmu,i386-softmmu --enable-cocoamake -j 8

坐下来,放松,等待……实际上,时间不长,该系统在所有8个内核上都运行很快,并且您应该有一些qemu二进制文件!

安装ARM版本的Ubuntu的方法有很多,但是现在可以通过https://cdimage.ubuntu.com/focal/daily-live/current/便捷地进行桌面构建-抓住focus-desktop-arm64.iso。您不希望使用“ amd64”版本-确保获得“ arm64”版本,否则将无法正常运行!

您还需要为ARM构建的EFI Blob。我正在按照的说明介绍如何使用自己的ARM VM进行构建(并包括指向一些已构建的ARM的链接),但是如果您碰巧需要的话,我还为您上传了一个:QEMU_EFI.fd

尽管您可以运行实时ISO,但这样做没有任何乐趣-为安装创建磁盘映像(您可以从刚刚进入的qemu / build目录中执行此操作,然后将映像快速粘贴到某处)。我假设您已将QEMU_EFI.fd文件放在同一目录中。

现在,让我们从安装程序CD中点亮虚拟机!它是Linux,因此我们仅使用所有virtio设备。 Virtio是虚拟化管理程序和来宾使用的一种方式,“您看,让我们跳过所有您在与真实硬件(我是假装)交谈的假装。我是系统管理程序,您知道我是,所以只要告诉我您想让我做什么,我会做的。”它比任何类型的硬件仿真都快得多(也使用更少的CPU),因此您绝对应该使用它。因为我们正在运行Linux guest虚拟机,所以它将做正确的事!

如果您只复制粘贴此内容,则将无法使用。正确设置文件路径。这将设置一个具有4GB RAM的4核VM,即使您使用的是8GB系统,它也可以正常工作。

./qemu-system-aarch64 \-串行stdio \ -M virt,highmem = off \ -accel hvf \ -cpu cortex-a72 \ -smp 4 \ -m 4096 \ -bios /path/to/QEMU_EFI.fd -device virtio-gpu-pci \-显示默认值,show-cursor = on \ -device qemu-xhci \ -device usb-kbd \ -device usb-tablet \ -device intel-hda \ -device hda-duplex \ -drive file = /path/to/Ubuntu.qcow2,if=virtio,cache=writethrough \ -cdrom /path/to/focal-desktop-arm64.iso

顺便说一句,如果您在Apple使其不成为默认设置之前对zsh的了解不多,则可以使用向上/向下箭头编辑这样的多行命令!超好!

如果一切顺利,您应该快速获得EFI屏幕,然后是引导加载程序!如果不是,请检查控制台上的串行输出,因为它可能告诉您一些重要的信息。

继续并选择“安装Ubuntu”-您应该很快在一个看起来非常熟悉的安装程序环境中迅速找到自己。在启动过程中的某个时候,您可能会弹出一个询问网络访问的弹出窗口-如果您想进行网络访问,则允许这样做(几乎可以肯定)。

qemu在实际注意到鼠标时有时会有些奇怪。如果看起来鼠标在VM中无法正常工作(您尝试与VM交互但没有任何反应),请尝试切换到另一个窗口然后再返回-它应该将其拾起。

安装Ubuntu。如果您深入了解有关Apple Silicon上VM的文章,则可能知道如何执行此操作。

完成后,更新软件包。对于后续的启动,您可以跳过-cdrom行,然后开始执行!我在此设置下重新启动了虚拟机,但运气不佳-仅关闭虚拟机并重新启动似乎更加可靠。

禁用访客中的监视器睡眠。在“设置”下->电源,黑屏。将其设置为“从不”。如果我出于无法完全理解的原因尝试运行该虚拟机,则可能会锁定它。

大多数人会做的第一件事是尝试设置合理的分辨率,并且有很多可用的方法。但是,我真正喜欢的(2560x1440)缺少是出于……原因?没关系,在qemu中的Linux下添加自定义分辨率很容易(这也适用于KVM)。

只需创建一个带有以下内容的神奇小脚本setres.sh并对其进行调用:./setres.sh 2560 1440

/ bin / bashMODELINE =`cvt $ 1 $ 2 |尾-n 1 | sed /#Model //" | sed' // g'`MODENAME =`cvt $ 1 $ 2 |尾-n 1 |切-d'"' -f 2``xrandr --newmode $ MODELINE''xrandr --addmode虚拟-1 $ MODENAME``xrandr-输出虚拟-1 --mode $ MODENAME`

如果您对虚拟机进行全屏显示,则实际上也不确定如何对其进行全屏显示。将其扔到另一个显示器上……这实际上并不是我如何使用虚拟机的问题。我喜欢它们在另一个显示器上全屏显示。如有疑问,请用三个手指(或F3)抬起头来。

因此,我们有了这个Linux VM。真的快吗?你能用它做真正的工作吗?

我不会在这里介绍完整的基准测试套件-当它是这个星球上性能更高的CPU之一时,我只是觉得不那么有趣。但是,我会同时抛弃速度计(在OS X上使用Chrome,在Linux上使用Chrome)。哪一个

其实你错了在VM中,Linux上的Chrome的运行速度比OS X中的Chrome快很多,而且还与“速度计”指标挂钩。从中得到什么。

作为参考,Raspberry Pi 4(超频至2GHz)大约为22,而我的办公室NUC大约为75。

而且,ARM虚拟机将在48分钟内构建我的博客(包括图像处理,我有很多),而在AMD 3700X上虚拟机则为62分钟(两种情况下都是单线程的),因此,它们的合成性和实用性较低。

实际上,我对基准撒谎了。我确实非常喜欢内存带宽,而M1确实非常擅长的事情之一就是内存带宽。是吗?我将在经常使用的几个系统上使用标准的dinky小内存带宽测试仪(mbw),然后在此Linux VM上使用。

我将运行mbw 1024并绘制每种memcpy类型的平均值…

好吧。 6770HQ具有eDRAM,3700X具有一定的余地,因为它运行的ECC速度较慢,i7-77070K是一个不错的盒子,而Mac Mini上的VM在此测试中绝对会杀死它们,峰值为41.2GB / s!这是一个愚蠢的小测试,并不是要非常聪明,因为大多数软件都不是,它只是使该系统上的内存速度增加了很多。

启动BOINC管理器,添加[受电子邮件保护](我知道它们具有ARM工作单元),然后观察系统运行情况!遵循以下有关CPU调度的怪癖之类的内容……

我听说您可以使用Rosetta2(有趣的是不同的Rosetta)运行BOINC,并且x86转换层的内存膨胀有问题。在本地运行ARM时没有此类问题!

如果您真的想让事情变得糟透了,请使用-smp 8启动您的虚拟机,以便它可以访问所有8个CPU!只要可见VM窗口且屏幕未处于睡眠状态等等。

我在这里注意到的有趣的事情之一是,在M1上,CPU调度对于将任务推送到“高效”内核(内核1-4)上确实非常积极。如果VM窗口可见,它将在Core 5-8(性能内核)上调度线程,但是如果将其最小化,或者屏幕进入睡眠状态,它们将被卸载,并且所有内容都将移交给效率内核-甚至8核心VM。您可以通过“活动监视器”中的“ CPU历史记录”窗口轻松看到这一点。

在运行BOINC的4 CPU VM且显示可见的情况下,计算位于性能核心上(如预期的那样)。这是一项与CPU绑定的任务,很难完成。性能核心很有意义。

但是在将其最小化后不久,看看会发生什么!我显然不关心最小化任务的性能,所以……bazoop!最重要的是效率核心。

如果您为VM提供8个核心,那么正如机器可能会希望的那样,它将在计算机启动并运行时在所有8个核心上保持调度。但是,只要锁定屏幕,就可以…

一切都推到了效率核心。如果将VM最小化,您将看到相同的行为。

现在,我不太介意-我的办公室在晚上用电池供电,所以我觉得很好。但这是一种怪异的行为,对于运行大量计算而言肯定是低效的,并且可能与Apple的应用QoS参数有关。我希望有一种简单的方法可以告诉OS X:“嘿,在性能核心上执行此操作。”我不确定这是什么...

但是,如果您想知道他们如何在笔记本电脑上获得如此惊人的电池寿命?这是一个主要提示-如果可以的话,它几乎可以在效率核心上运行几乎所有内容。而且似乎工作正常!除非您使用交流电源,否则不要运行任何东西。我将不得不对此进行处理。

应用第二套补丁程序后,您还可以在qemu中运行x86 VM。我们可以跳过x86的一些参数,我只是在这里运行LiveCD来说明我的观点,但是如果您确实有需要,可以添加磁盘。

./qemu-system-x86_64 \-串行stdio \ -M q35 \ -cpu qemu64 \ -smp 1 \ -m 4096 \ -device virtio-gpu-pci \-显示默认值,show-cursor = on \ -device qemu- xhci \-设备usb-kbd \-设备usb平板电脑\-设备intel-hda \-设备hda-duplex \ -cdrom /path/to/ubuntu-20.04-desktop-amd64.iso

如果要获得“适当的” SMP,则可以添加以下内容,并将-smp 1更改为-smp 4:

qemu-system-x86_64:--accel tcg,thread = multi:警告:来宾期望比主机提供更强的内存排序这可能会导致奇怪/难以调试的错误

应该有某种方法可以请求将TCO作为处理此问题的用户空间流程-这肯定是一种很好的用法。有一种方法可以使用前面提到的TSO启动器来实现,但是我只是不想为我不打算经常使用的东西构建内核模块。

但这是一台合法的x86 VM,运行Ubuntu 20.04 Desktop,尽管我不会将其称为“快速”,但也并非完全无法使用。我的意思是,您不应使用它,但可以使用。

QEMU正在执行JIT-即时编译。它将x86操作转换为ARM操作,根据需要模拟复杂的事物,然后运行它们。因此,性能不会接近原生。浏览器基准测试是双重打击,因为浏览器正在执行Javascript的JIT,然后必须通过另一个JIT运行x86转换,但是它们确实可以运行并完成。它可以运行,只是速度不是很快。它通常可以与我的旧上网本Clank或Raspberry Pi 3相提并论,但性能确实因任务而异。绝对不是您想大量使用的东西。

但是随后挂起-在这里,或者在黑屏上显示冻结的鼠标光标。 CPU仍根据主机上的CPU利用率执行某些操作,但是鼠标被冻结了,有些随意的拨动不能解决问题。

当然,如果愿意,您可以运行ARM Windows 10,并且愿意摆弄驱动程序之类的东西-我暂时不觉得这件事非常有趣。但是,此版本应该可以做到,而我正在按照的说明中包含有关如何实现此目的的信息!但是,根据其他报告,Win10 ARM构建可以在VM中正常运行,并且如果您确实需要,它将可以很好地运行x86应用程序。

在M1的硬件虚拟化中,Linux速度很快。就像,巨大,巨大,令人难以置信的快速。对于M1上“需要Linux”的任何事物绝对有用,而且很可能是您现在可以获得的用于单线程工作的最快的Linux计算机。

您可以在M1上运行完整的x86系统-现在非常缓慢。而且您可能不应该。

老读者可能已经注意到我正在使用新平台,新主机,新评论系统。如果您发现任何无法正常工作的内容,那么与我联系的最佳方法是我的对话论坛。博客的细节在于

......