2017-06-12 113 views
4

当VM迁移到不同的硬件时,是否可以通知在Google Compute VM上运行的应用程序?Google Compute上的虚拟机可以检测它们何时迁移?

我是一个大量使用矢量指令(SSE/AVX/AVX-512)的应用程序(HMMER)的开发人员。我正在开发的版本在启动时探测其硬件,以确定哪些向量指令可用,并选择最佳集合。

我们一直在考虑在Google Compute和其他云引擎上运行我们的程序,一个问题是,如果虚拟机在运行我们的程序时从一台物理机迁移到另一台物理机,则新机器可能支持不同的指令,导致我们的程序崩溃或执行得比它慢得多。

当虚拟机迁移时,有没有办法通知在Google Compute虚拟机上运行的应用程序?我发现的唯一相关信息是,您可以设置一个虚拟机在迁移时执行关机/重启序列,这会杀死任何当前正在执行的程序,但至少会让用户知道他们需要重新启动程序。

+0

实际上有一种方法在使用元数据服务器进行实时迁移时收到通知。此信息可直接在虚拟机上使用。我已将这些信息添加到我的答案中。您还可以检查出:https://cloud.google.com/compute/docs/storing-retrieving-metadata#maintenanceevents – Tuxdude

+0

谢谢!这正是我所寻找的信息。 –

回答

3

我们确保您的VM实例永远不会在物理机之间实时迁移,从而导致您的程序按照您描述的方式崩溃。

但是,对于您的用例,您可能需要指定最低CPU平台版本。您可以使用它来确保您的实例拥有新的Skylake AVX说明。有关更多详细信息,请参阅Specifying the Minimum CPU Platform上的文档。

+0

只是为了仔细检查,这是否意味着,如果我设置的Haswell或更好的最小的CPU平台,但实际上获得签发的SKYLAKE微架构EP机,虚拟机将永远活迁移到Haswell的机器?这就是我担心的一种情况 - 我们的软件将启动,检测到它在Skylake上,并使用AVX-512,如果它移动到Haswell,它将会崩溃。 –

+0

如果您设置了最低CPU平台并使用CPUID执行功能检测,则不会遇到任何崩溃。我没有在Compute Engine上工作,但我已要求相应的团队更新有关最小CPU平台功能的文档以提供更详细的信息。 –

4

作为每Live Migration文档:

实时迁移不改变的VM 本身任何属性或属性。实时迁移过程只是将正在运行的虚拟机从一台主机传输到另一台主机。所有虚拟机属性和属性保持不变,包括内部和外部IP地址,实例元数据,块存储数据和卷,操作系统和应用程序状态,网络设置,网络连接等内容。

Google确实提供了一些控件来设置instance availability policies,它还允许您控制实时迁移的各个方面。在这里他们还提到你可以寻找什么来确定什么时候发生了实时迁移。

Live migrate

默认情况下,标准的情况下被设置为实时迁移,其中谷歌 Compute Engine的自动迁移您的实例从 基础设施维护的事件了,和你的实例保持在迁移过程中运行 。您的实例可能会经历短时间的性能下降,尽管通常大多数情况下 都不会发现任何差异。这对于需要不间断正常运行时间并且可以容忍短时间减少的性能的情况是理想的。

当Google Compute Engine迁移您的实例时,它会报告发布到区域操作列表的系统 事件。您可以通过执行gcloud计算操作列表 - 区域 请求或查看Google Cloud 平台控制台中的操作列表,或通过API请求查看此事件的 。本次活动将出现 用以下文字:

compute.instances.migrateOnHostMaintenance 

此外,您可以在维护事件即将发生直接检测在虚拟机上。

Getting Live Migration Notices

元数据服务器提供有关的信息的实例的 scheduling options and settings,通过调度/ 目录和维护事件属性。您可以使用这些 属性来了解虚拟机实例的日程安排 选项,并使用此元数据在维护事件 即将通过maintenance-event属性发生时通知您。默认情况下,所有虚拟机实例均设置为实时迁移,以便在实时迁移VM 实例之前,元数据服务器将收到维护事件通知。如果您选择在维护过程中终止虚拟机实例 ,则计算引擎将自动终止并且如果设置了 automaticRestart属性,则可以选择性地重新启动您的VM实例。要了解有关在事件期间维护 事件和实例行为的更多信息,请阅读scheduling options and settings

您可以通过定期查询 maintenance-event属性来了解何时发生维护事件。在维护事件开始前,此 属性的值将发生变化60秒, 为您的应用程序代码提供了一种触发任何想要在维护事件(例如备份数据或 更新日志)之前执行的任务的方法。 Compute Engine还提供sample Python script 来演示如何检查维护事件通知。

当维护事件即将开始和结束时,您可以使用维护事件属性和等待 更新功能来通知您的脚本和应用程序。这可让您自动执行任何可能要在事件之前或之后运行的操作。以下Python示例中的 提供了一个示例,说明如何将这两个功能结合在一起。

您也可以选择终止并可选择重新启动您的实例。

Terminate and (optionally) restart

如果您不希望您的实例实时迁移,您可以选择 终止和可选重新启动您的实例。有了这个选项,Google Compute Engine会发出信号指示您的实例关闭,在短时间内等待 ,以便您的实例干净地关闭, 终止实例,并将其从维护 事件中重新启动。此选项非常适用于需要恒定最大性能的实例,并且您的整个应用程序的构建可处理 实例故障或重新启动。

请参阅Setting availability policies部分以了解有关如何配置此功能的更多详细信息。

如果您使用的实例与GPU或抢占实例注意实时迁移不支持:

Live migration and GPUs

实例附有不能实时迁移的GPU。必须将它们设置为 才能终止并可选择重新启动。计算引擎在连接GPU的VM实例终止之前提供60分钟的 通知。致 了解有关这些维护事件通知的更多信息,请阅读实况 迁移通知。

要了解有关使用GPU处理主机维护的更多信息,请参阅GPU文档中的 Handling host maintenance

Live migration for preemptible instances

不能配置preemptible instances到实时迁移。默认情况下,可抢占实例的 维护行为始终设置为 TERMINATE,并且不能更改此选项。这也是 不可能为可抢占 实例设置automatic restart选项。

正如Ramesh提到的那样,您可以指定最小CPU平台,以确保只迁移到至少具有指定的最小CPU平台的实例。 At a high level it looks like

总之,当你指定最小CPU平台:

  • 的Compute Engine总是使用最小的CPU平台,提供。
  • 如果最小CPU平台不可用或最小CPU平台比区默认年龄大了,一个新的CPU平台 提供相同的价格,计算引擎采用了较新的平台。
  • 如果最小CPU平台是不是在指定的区域有供应,有没有额外的费用没有可用的新平台,该 服务器返回400错误,指出CPU是不可用的。
+0

TL:DR:实时迁移无法从已运行的VM添加或删除CPUID功能标志,但停止并重新启动VM可能导致它在具有比以前更多或更少功能的计算机上启动。所以你只需要在每次重启时至少检测一次insn set扩展。 (因此,除非在重新启动后使用检查点/恢复系统恢复进程的状态,否则每个进程启动一次就没有问题。 –