【问题标题】:How do I make use of all cores in my worker role on Windows Azure?如何在 Windows Azure 上以我的辅助角色使用所有内核?
【发布时间】:2011-08-29 10:56:35
【问题描述】:

假设我指定我希望我的辅助角色在 4 核虚拟机上运行。如何使用所有内核?

看起来我重写了 RoleEntryPoint.Run() 方法来安装我的请求处理程序。

如何处理使用所有内核的请求?我是手动生成线程并将处理委托给它们,还是有一些现成的聪明抽象可以帮助自动完成?

【问题讨论】:

    标签: concurrency azure cloud scalability azure-worker-roles


    【解决方案1】:

    您应该在 WorkerRole::OnStart() 中添加多个工人,如此处所述http://www.31a2ba2a-b718-11dc-8314-0800200c9a66.com/2010/12/running-multiple-threads-on-windows.html

    【讨论】:

    • 你说 Azure 会在我的线程产生后立即杀死它们,但你链接到的代码也会产生线程。
    • 当我创建自己的线程时,它们会在几秒钟后被杀死,但我不知道为什么(我猜这与 Azure plummings 的工作方式有关)。当我使用上面的设计模式时,线程工作正常。该模式还监视并重新启动被未捕获异常杀死的工作角色线程,这是一个很好的奖励功能。
    【解决方案2】:

    生成线程或使用 .Net 4 Tasks 让 .Net 使用线程池安排您的作业。

    【讨论】:

    • 您不应该生成自己的线程,因为 Azure 会在大约 30 秒后将它们杀死。最好添加工人角色(见我的帖子)
    • @Inge:你为什么说 Azure 会杀死工作角色的线程?它不适合我。
    • 这很奇怪。您是否添加了一些跟踪对话框以确保?由于新线程不在主线程中,因此它会安静地死掉,因此不会在 Visual Studio IDE 中弹出异常。
    • 我确定。我启动了应用程序工作不可或缺的长时间运行的线程。
    【解决方案3】:

    +1 to Oliver - 在每个请求上生成 TPL 任务,框架运行时应该从那里处理所有事情。

    【讨论】:

      【解决方案4】:

      另一种让所有 4 个核心保持忙碌的方法是将应用程序扩展到 Web 角色的多个实例,以便 每个核心都在其实例中运行(请注意,在 Windows Azure 中,每个实例都运行在自己的虚拟机中)。由于在 Windows Azure 中您按小时为每个核心付费,因此在 4 个 Worker Role 实例中的每一个上使用一个核心的成本与在单个 Worker Role 实例上运行 4 个核心的成本相同。

      使用 4 个 Worker Role 实例的好处是,您可以更方便地调整为 3 个、2 个或 10 个实例,具体取决于您在任何时间点需要承担的计算量。更改运行实例的数量很容易 - 您无需重新部署应用程序。要更改实例的大小,您需要重新部署。此外,只有实例大小的粒度较小:部分、1、2、4 和 8 个核心。没有实例大小,比如 6 核。

      另请注意,如果您只有一个实例,则 Windows Azure SLA 无效。在各种 SLA 启动之前,至少需要 2 个实例。这部分是为了让 Azure 的 Fabric 控制器可以更新应用程序的某些部分(例如使用 O/S 补丁),而无需关闭整个应用程序。

      警告:对于设计时未考虑到云的遗留代码,在运行多个实例时,可能会出现无法正常运行的代码。换句话说,它不能有效地“向外扩展”;在这种情况下,您可以通过在更大的实例大小(例如 4 核)上运行它来“扩大规模”。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-07-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-11
        • 2011-10-05
        • 1970-01-01
        相关资源
        最近更新 更多