详细内容,可参考 Jakob Engblom 的主页Intel Blog Post: Running Large Workloads on Simics -- in 1998 and 2018
这里将回顾 Simics 虚拟平台的过去、现在和未来。2018 年是 Simics 作为商业产品推出 20 周年。1998 年,Simics 由一家名为 Virtutech 的初创公司推向市场;该公司于 2010 年被Intel旗下的Wind River收购。
为了让真实世界的软件能在虚拟平台上运行,Simics 团队始终致力于提升目标系统的可扩展性和仿真速度。早在 20 年前,真实的服务器工作负载就已经可以在 Simics 上运行。然而,大型软件在当时和今天的定义已大不相同。让我们先回顾一下过去,再与 Simics 如今所能运行的软件进行比较。
过去
20 年前发表的一篇开创性论文描述了 Simics 如何在基于 sun4m 架构的四处理器虚拟 SPARCstation 上,使用从真实机器获取的磁盘镜像,启动未经修改的 Sun Solaris 2.6 和 Linux 2.0.30 操作系统。该配置用于运行 Mozilla 5.0 网页浏览器,以及事务处理委员会(Transaction Processing Council)的 TPC-D 数据库基准测试软件(使用 PostgreSQL 数据库)。这在当时堪称非凡之举------全系统仿真和虚拟平台仍属新兴技术,而直接从真实机器提取整套软件栈并在模拟器中以足够快的速度交互式运行,几乎是闻所未闻的。
所仿真的 sun4m 架构用于配备多种 32 位 SPARC V8 RISC 处理器的工作站和服务器,这些平台最多支持 512 MB 内存、四个处理器,主频最高达 200 MHz。
大多数实际硬件系统的配置更为普通,主频低于 100 MHz,内存不足 100 MB。当时的"大型软件"配置可能占用几百兆字节的内存------而如今,就在我撰写这篇博客时,我笔记本电脑上的 Microsoft Word 所占用的内存就达到了这个量级。
当时的 Simics 在核心仿真指令集处理引擎中采用纯解释器模式,使其运行速度比真实硬件慢 25 到 100 倍。尽管如此,它仍足以在合理时间内完成启动 Solaris 所需的约十亿条目标指令。这在当时已是尖端水平。
现在
如今,高端系统可配备 512 GB 内存(是上述 SPARCstation 的 1000 倍)、40 多个核心(10 倍),以及 2 至 5 GHz 的处理器主频(25 倍)。得益于微架构改进、新指令集及其他创新,当今系统运行代码的速度大约是 20 年前的 100 倍。
Simics 也与时俱进地进行了改进。1998 年使用的解释器模式如今已很少使用。取而代之的是 VMP 技术(利用 Intel 针对 IA-32、Intel 64 和 Intel 架构的虚拟化技术 VT-x,直接在主机上运行基于 Intel 架构的目标代码)以及即时编译(JIT)技术,将目标代码转换为主机代码。这些技术可将虚拟机的性能损耗降至接近 1 倍(即几乎无额外开销),从而使 Simics 能够在当代硬件模型上高效运行大型工作负载。
为了直观了解工作负载和虚拟平台规模的变化,我们来看看多年来在 Simics 上运行过的一些软件示例。首先是一些 Java 示例------1998 年,大多数服务器软件都是为特定处理器架构和操作系统原生编译的。但 Java 当时正从客户端起步,几年后便迅速转向服务器端。这得益于 Java 虚拟机(JVM)的使用:JVM 运行字节码而非原生代码,从而提供了一个基本与主机无关的业务应用开发环境。因此,如今在 Simics 上运行 JVM 已十分常见。
即时编译
在 Simics 上运行基于 Java 的基准测试,为我们展示了多层堆叠计算的有趣案例。最上层是 Java 代码,运行于 Java 虚拟机(JVM)之上;JVM 使用自身的 JIT 编译器将字节码转换为目标系统原生代码;接着,这些目标代码又运行在 Simics 虚拟平台上,而 Simics 自身也包含一个 JIT 编译器,负责将目标系统代码进一步转换为主机系统代码;最终,主机代码在 Simics 主机上执行。
这种虚拟平台与虚拟机的层层嵌套完全可行!此外,除了 JIT 技术,Simics 的VMP技术还能借助 Intel 虚拟化技术(Intel VT),直接在主机上运行 Intel 架构(IA)的目标代码。这使得 Simics 的性能接近于在真实硬件上运行典型虚拟机或hypervisor的水平。
Simics 上的 SpecJEnterprise
我们的第一个 Java 示例是 SpecJEnterprise 2010,这是标准性能评估公司(SPEC)联盟推出的一项基准测试,模拟一个由 Java 编写的业务应用服务器与后端数据库交互的场景。该配置包含一个驱动程序,向应用服务器发送请求,后者再调用数据库。SpecJEnterprise 衡量整个系统的性能,包括硬件、JVM、数据库引擎、网络及其他组件。我们将 SpecJEnterprise 作为平台测试用例在 Simics 上运行,因为它能有效验证操作系统、UEFI 和硬件平台的集成情况。
SpecJEnterprise 至少需要两台机器:一台运行数据库,另一台运行应用服务器(驱动程序可与应用服务器共置于同一台机器)。下图展示了 Simics 中的设置:两个目标系统运行于同一个 Simics 进程内。这种封装方式简洁高效,无需依赖外部软件或多进程协调。实践中,两个 Linux 发行版略有不同,因为每个软件栈都附带其推荐的 Linux 操作系统版本。
两台目标机器具有相同的硬件配置,并通过 10 Gbps 以太网连接。每台目标机拥有四个处理器核心(分布在两个插槽上)和 192 GB 模拟内存(每个插槽挂载 96 GB)。整个 Simics 配置共模拟了 384 GB 目标内存。每台目标机仅配置四个核心,已足以运行该基准测试;实际上,Simics 平台可支持远超此数量的核心。与 1998 年一样,Simics 依然支持从最小配置一直到物理平台极限甚至更复杂的配置。
运行此配置时,主机实际消耗 300 至 400 GB 物理内存------大部分模拟的目标内存都被实际使用,因此需在 Simics 中完整表示。若目标内存未用于活跃数据,Simics 可在不占用主机物理内存的情况下模拟超大内存空间。
两台系统各自拥有独立的模拟磁盘,每个磁盘使用独立的镜像文件。这些镜像是完整的可启动磁盘镜像,与在物理系统上使用的完全一致。这种在硬件问世前即可进行完整软件栈开发与执行的能力,正是虚拟平台的核心优势之一。
根据服务器负载不同,该虚拟平台的性能损耗约为 4 倍。每次基准测试在目标机上运行约 3.5 小时,对应现实时间(墙钟时间)约 12 至 14 小时,相当于约 4 倍的减速。对于此类工作负载而言,这一表现已相当出色------比 1998 年提升了整整一个数量级!
Simics 上的 SpecJBB
SpecJBB 2015 被称为Java 服务器业务基准测试,用于衡量 Java 虚拟机的性能,包含一个三层业务应用。SpecJBB 2015 可使用多个 JVM 实例,但在我们的配置中仅使用单个 JVM。该基准测试在真实环境和 Simics 上均运行于单台目标机器。
Simics 中的配置包含一台服务器目标系统,配备 384 GB 模拟内存和四个处理器核心(分布于两个插槽)。软件栈同样运行于 Linux 之上,与 SpecJEnterprise 类似。目标服务器使用所建模真实平台的 UEFI 固件启动,服务器模型是对特定硬件平台的完整复现,包含处理器核心、非核心部分(uncore)和平台控制器中枢(PCH)等所有细节与特性,并非通用系统,而是高度具体的模型。
目前,每次在 Simics 上运行 SpecJBB 约需 3.5 小时虚拟时间,对应现实时间约 12 小时(取决于 Simics 所在服务器的其他负载),减速比同样低于 4 倍,与 SpecJEnterprise 相当。
Simics 上的 HammerDB
HammerDB 是一款开源的数据库负载测试与基准工具。它本身并非数据库,而是一个通过大量事务访问数据库以测试其负载性能的工具。运行 HammerDB 需要两台独立机器:一台运行数据库,另一台运行 HammerDB 工具。我们在 Simics 中复制了这一设置,将两台服务器置于同一个 Simics 实例中,与 SpecJEnterprise 的做法一致。
HammerDB 在每台模拟目标机上仅需128 GB 内存(每个处理器插槽挂载 64 GB)。根据服务器上其他软件的负载情况,HammerDB 需要最多 20 小时的主机时间来完成 1.5 至 2 小时的虚拟时间运行------减速仍在 10 倍以内。考虑到系统规模,我认为这对虚拟平台而言已相当合理,且显著优于 1998 年的性能损耗。
HammerDB 提供图形用户界面(GUI)用于执行测试和查看结果,该 GUI 显示在连接到 Simics 模型的控制台上。其他大多数测试则使用串行控制台,因为服务器工作负载通常设计为无头(headless)运行。Simics 脚本用于自动化测试执行,确保每次运行结果可重现。
HHVM oss-performance
最后一个示例是面向 Web 的工作负载,使用了另一种虚拟机系统------HHVM(HipHop Virtual Machine),专为 PHP 和 Hack 语言设计,而非 Java。HHVM 是一个开源虚拟机,能高效运行众多 Web 应用和框架。oss-performance 基准测试在 HHVM 下使用 nginx 作为 Web 服务器,并通过 siege 基准工具生成流量,"围攻"Web 服务器以测试其处理能力。
整套软件运行于单个 Simics 目标机器内的单一 Linux 操作系统实例中:
运行 oss-performance 所需的硬件资源比前述软件栈更为 modest(适中)。24 GB 目标内存已足够。这体现了不同软件栈在规模上的显著差异------例如,SpecJBB 所需内存高出一个数量级,因而对目标系统的软硬件施加了截然不同的压力。
oss-performance 基准测试是一组按顺序执行的 Web 应用测试。每个组件测试首先启动 nginx 和 HHVM,然后在 HHVM 上启动待测 Web 应用。待应用启动后,siege 基准引擎开始运行,同时执行一个应用特定的基准程序。Siege 通过同一目标机内的网络套接字连接到 nginx。每个组件测试均由 Simics 脚本启动:脚本监控目标系统的串口输出字符串,并向串口发送命令------这是 Simics 从外部自动化执行目标系统复杂操作序列的绝佳范例。
根据主机负载不同,每次 oss-performance 基准测试约需 1 小时虚拟时间,对应现实时间 6 至 8 小时,减速比小于 10 倍。
二十年的虚拟平台演进
从当前用例可见,Simics 今天所做的事,与其 20 年前技术初现时并无本质区别:它仍在基于最新硬件建模的虚拟平台上运行真实世界软件,并且速度足够快,使开发者能在虚拟平台上使用完整规模的标准软件进行软件验证、集成测试和开发。
如今的工作负载在虚拟平台上消耗的内存和处理器时钟周期,比物理系统高出几个数量级。根据模拟的处理器频率,一个在虚拟时间中耗时一小时的工作负载,可能涉及 40 至 60 拍(peta)周期的目标时间,以及数万亿条指令。1998 年启动操作系统需十亿条指令,而今天的操作系统则需千万亿(quadrillion)级别。
幸运的是,主机系统和 Simics 本身也随工作负载一同演进。正如 Simics 能在 1998 年运行当时的服务器工作负载,它也能在 2018 年运行当代的服务器工作负载。实际上,随着 JIT 编译器、VMP 技术和多线程的引入,模拟机与主机之间的性能差距已显著缩小。