Azure角色回收 - 无限繁忙状态

时间:2017-01-28 13:45:01

标签: c# azure azure-worker-roles

此问题始于2017年1月24日星期二。在此日期之前,我从未遇到过工作人员角色回收问题。

美国东部时间晚上9点左右,我的工人角色进入忙碌状态。 CPU达到90%。它保持这种方式超过10个小时。它从一个角色开始,然后传播给其他角色。我的软件在白天工作正常。我的工作者角色使用标准A0超小尺寸。我尝试将大小增加到小标准A1,但错误仍然存​​在。

我的代码说StorageConnectionString。我运行了一个调试器,我只看到了一次这个错误:

类型' System.Data.SqlClient.SqlException'的异常发生在System.Data.dll中但未在用户代码中处理

附加信息:已成功与服务器建立连接,但在登录前握手期间发生错误。 (提供者:TCP提供者,错误:0 - 远程主机强行关闭现有连接。)

这导致异常并且角色停止了。不过,我再也没见过。

我必须将我的站点部署到登台服务器,停止生产服务器,然后单击交换以使其正常工作。它在当天晚些时候晚上9点再次破裂。

当我的角色忙时,这是我收到的错误:

忙碌(稳定角色... [01 / 28T13:28Z]角色将回收。最后OnRoleRun优雅地返回。最后退出时间:

我将远程桌面放入事件日志中。这是我收到的错误:

WaWorkerHost 无法加载角色程序集:XX.TaskRole,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null

enter image description here

以下是我的工作角色代码:



using System;
using System.Collections.Generic;
using System.Configuration;
using System.Diagnostics;
using System.Net;
using System.Threading;
using Microsoft.WindowsAzure.ServiceRuntime;
using Microsoft.WindowsAzure.Storage;
using Microsoft.WindowsAzure.Storage.Queue;
using Microsoft.Azure;

namespace XX.TaskRole
{
    public class WorkerRole : RoleEntryPoint
    {
        string conString = ConfigurationManager.ConnectionStrings["XX"].ConnectionString;
        CloudQueue queue;

        public WorkerRole()
        {
            ServicePointManager.DefaultConnectionLimit = 12;
            

        }

        public override void Run()
        {
            // This is a sample worker implementation. Replace with your logic.
            while (true)
            {
                GetTasks();
                Thread.Sleep(30000);
                Trace.TraceInformation("Working", "Information");
            }
        }

        public override bool OnStart()
        {
            try
            {
                CloudStorageAccount storageAccount = CloudStorageAccount.Parse(
                CloudConfigurationManager.GetSetting("StorageConnectionString"));

                // Create the queue client.
                CloudQueueClient queueClient = storageAccount.CreateCloudQueueClient();

                // Retrieve a reference to a queue.
                queue = queueClient.GetQueueReference("taskqueue");
                return base.OnStart();
            }
            catch (Exception e)
            {
                // Exception Handling & Logging
                // Return false for OnStart
                
                return false;
            }
        }

        public void GetTasks()
        {
            if (queue == null)
                return;

            try
            {
                //Pull 10 - 15 rows from database. Just numbers and letters. No XML.
            }
            catch (Exception ex)
            {
                
            }
        }
    }
}




2 个答案:

答案 0 :(得分:0)

  

此问题始于2017年1月24日星期二。在此日期之前,我从未遇到过工作人员角色回收问题。

     

美国东部时间晚上9点左右,我的工人角色进入忙碌状态。 CPU达到90%。它保持这种方式超过10个小时。它从一个角色开始,然后传播到其他角色

操作系统升级后似乎没有达到就绪状态。有关我们可以参考document

的更多信息
  

忙碌(稳定角色... [01 / 28T13:28Z]角色将循环使用。最后OnRoleRun正常返回。最后退出时间:   

  WaWorkerHost无法加载角色程序集:XX.TaskRole,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null

根据您提到的错误信息,它表示缺少运行时依赖性。以下内容摘自Common issues that cause roles to recycle

  

•如果使用Visual Studio,请确保项目中不属于Azure SDK或.NET Framework的每个引用程序集的“复制本地”属性设置为“True”。

     

•确保web.config文件未引用编译元素中任何未使用的程序集。

     

•每个.cshtml文件的Build Action都设置为Content。这可确保文件在包中正确显示,并使其他引用的文件显示在包中。

我还发现另一个article关于“云服务角色使用错误回收”System.IO.FileLoadException: Could not load file or assembly。更多细节信息请参考。

答案 1 :(得分:0)

Microsoft.WindowsAzure.ServiceRuntime发生了程序集引用错误。正确的引用是\ packages \ Microsoft.WindowsAzure.SDK.2.9.0 \ lib \ Microsoft.WindowsAzure.ServiceRuntime.dll。相反,我引用了我的C:驱动器上的那个。我使用NuGet将组件添加到我的项目中并且它有效。