【问题标题】:Azure Compute Service worker becomes "busy" following scale-upAzure Compute Service Worker 在扩展后变得“忙碌”
【发布时间】:2014-08-12 18:34:35
【问题描述】:

我在 Azure 中运行一项服务,其中包含 4 个工作程序实例。当我扩展到 5 个工作实例时,已启动的第一个实例进入“忙碌”状态。这是为什么?放大期间会发生什么?天蓝色是否重新运行所有启动任务?我很困惑,似乎找不到任何关于此的文档。

在扩展到 5 个实例后,第一个实例的状态更改为:

Busy (Waiting for role to start... Application startup tasks are running. [2014-08-12T18:36:52Z])

并且在那里运行的 java 进程停止。为什么会这样?!

任何帮助将不胜感激。

启动.cmd

REM   Log the startup date and time.
ECHO Startup.cmd: >> "%TEMP%\StartupLog.txt" 2>&1
ECHO Current date and time: >> "%TEMP%\StartupLog.txt" 2>&1
DATE /T >> "%TEMP%\StartupLog.txt" 2>&1
TIME /T >> "%TEMP%\StartupLog.txt" 2>&1

REM enable ICMP
netsh advfirewall firewall add rule name="ICMPv6 echo" dir=in action=allow enable=yes protocol=icmpv6:128,any

ECHO Starting WebService >> "%TEMP%\StartupLog.txt" 2>&1
tasklist /FI "IMAGENAME eq java.exe" 2>NUL | find /I /N "java.exe" >NUL 2>&1
if "%ERRORLEVEL%"=="0" GOTO running

SET %ERRORLEVEL% = 0
START /B java -jar WEB-SERVICE-1_0--SNAPSHOT.jar app.properties >> "%TEMP%\StartupLog.txt" 2>&1

:running
SET %ERRORLEVEL% = 0

【问题讨论】:

    标签: azure azure-worker-roles azure-cloud-services azure-configuration


    【解决方案1】:

    在扩展操作期间,Azure 将通过更改事件向所有现有实例发送 RoleEnvironmentTopologyChange。这允许这些实例发现新的角色实例,以便允许实例之间的通信。请注意,只有在您定义了内部端点时才会发生这种情况(如果您打开 RDP,那么您会隐式获得一个内部端点)。

    默认情况下,这些拓扑更改不会影响正在运行的实例。但是,如果您订阅了更改事件并设置了e.Cancel=True,那么角色实例将重新循环并再次运行您的启动任务。

    有关拓扑更改的更多信息,请参阅http://azure.microsoft.com/blog/2011/01/04/responding-to-role-topology-changes/

    所以这里有两个问题:

    1. 为什么您的角色无法从循环中恢复?这是一个重大问题,您必须解决这个问题才能获得可靠的服务。您可以从http://blogs.msdn.com/b/kwill/archive/2013/08/09/windows-azure-paas-compute-diagnostics-data.aspx 的故障排除工作流开始,尤其是http://blogs.msdn.com/b/kwill/archive/2013/09/06/troubleshooting-scenario-3-role-stuck-in-busy.aspx 的场景 3。
    2. 为什么要回收角色实例以响应拓扑更改?检查您的更改事件处理程序并确保您没有设置e.Cancel=true

    【讨论】:

    • 另外 - 确保您确实在查看“第一个”实例之一。在门户中,实例显示顺序将随着流程的展开而改变。展开“NAME”列,您可以看到创建实例的顺序(名称末尾的_x)。此外,在最右侧,请查看更新和故障域以获得更清晰的信息。
    • 这实际上是一个 Java 应用程序,我在 Eclipse 中使用 Azure 插件。我有一个startup.cmd 和一个run.cmd。在 startup.cmd 我基本上是在做 java.exe -jar app.jar 和一些日志记录。该插件为我生成所有 XML,因此我不确定如何处理那些额外的 RoleEnvironment 事件,例如“更改”。我目前在配置方面可以访问的是:msdn.microsoft.com/en-us/library/azure/gg557552.aspx 我绝对没有在任何地方明确设置 Cancel=true。在 run.cmd 我只是将 java.exe 传递给 util/whileproc.cmd
    • 嘿,凯文,非常感谢您抽出宝贵的时间,并意识到我实际上已经阅读了您关于该主题的文章。如果你能看看我的启动脚本(我更新了我的问题)并让我知道我在那里做错了什么,那就太棒了。非常感谢您的帮助。
    • 我在您的启动任务中没有发现任何明显错误。那篇场景 3 博客文章谈到了阅读 WaHostBootstrapper 日志以确定角色启动的位置,所以我将从那里开始。
    • 我有一个与 ASP.NET Web 角色类似的问题。我也没有事件实现,但即使我愿意,也会有一个角色停止,然后是访客代理初始化,这大约需要 10 分钟才能到达角色开始。所以 10 分钟没有我的代码在运行,环境正在重新启动。 @kwill 这是设计的吗?我应该打开一个新问题吗?
    【解决方案2】:

    这对评论来说太长了,只是补充一下 kwill 已经告诉过的内容:

    我的 ASP.NET Web 角色在任何地方都没有 e.Cancel = true,但仍然重新启动(或者更确切地说:回收,甚至在调用 OnStart() 10 分钟之前完全重新初始化环境,就像在新的部署)在横向扩展之后。所以我继续添加了一个事件处理程序,它应该设置已经是默认值:

    public class WebRole : RoleEntryPoint
    {
        public override bool OnStart()
        {
            RoleEnvironment.Changing += (sender, e) =>
            {
                if (e.Changes.Any(change => change is RoleEnvironmentTopologyChange))
                {
                    e.Cancel = false;
                }
            };
        }
    }
    

    这有帮助!角色仍然很忙,但只是几秒钟而不是 15-20 分钟。似乎只有角色中的网站重新启动(或者可能是整个 IIS),但角色没有重新启动,整个环境也没有重新初始化。

    【讨论】:

      猜你喜欢
      • 2020-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-04
      • 2014-10-03
      • 2019-01-20
      相关资源
      最近更新 更多