我正在摆弄azure提供的选项来平衡多个webroles之间的负载.
我发现了三种可行的方法.
第一个是什么都不做,让默认(循环)实现完成这项工作.
第二种可能性是在ServiceDefinitionFile中定义一个自定义的LoadBalancerProbe,我试过并且没有工作:根据我的理解,每次对角色执行状态检查时都会调用自定义aspx页面.根据http响应代码,角色将其状态更改为忙碌. - 但这永远不会发生.此外,我无法找到任何定义自定义LoadBalancingProbe的示例.
因此,我寻找另一种方法来做到这一点.
现在我订阅了RoleEnvironment.StatusCheck事件,它允许我实现一些逻辑,并根据结果将角色状态设置为busy和available.
我的问题:1)假设自定义LoadBalancerProbe按照MSDN中的描述工作,订阅StatusCheckEvent和使用自定义探针有什么区别?
2)为什么我的自定义负载平衡器探针不起作用? - 我现在正在使用azure模拟器进行测试,并且我很清楚流量仍会被路由到webrole实例,尽管它们在模拟器中设置为忙碌.但我的自定义探测器根本不会改变webroleinstances的状态.
这是非常基本的代码,据我所知,应该将webrole instance_n_0的状态设置为busy.
public class LoadBalanceController : Controller
{
public ActionResult Index()
{
WebOperationContext woc = WebOperationContext.Current;
if(RoleEnvironment.CurrentRoleInstance.Id.ToLower().Contains("_0"))
{
woc.OutgoingResponse.StatusCode = System.Net.HttpStatusCode.ServiceUnavailable;
}else
{
woc.OutgoingResponse.StatusCode = System.Net.HttpStatusCode.OK;
}
return View(); //not relevant
}
Run Code Online (Sandbox Code Playgroud)
我还调用了servicedefinition文件,并在调用自定义探针中定义的healthcheck.aspx时将Route设置为重定向到此控制器/操作.
<LoadBalancerProbes>
<LoadBalancerProbe name="WebRoleBalancerProbeHttp" protocol="http" path="healthcheck.aspx" intervalInSeconds="5" timeoutInSeconds="100"/>
</LoadBalancerProbes>
...
<InputEndpoint name="EndpointWeb" protocol="http" port="80" loadBalancerProbe="WebRoleBalancerProbeHttp"/>
Run Code Online (Sandbox Code Playgroud)
路线:
routes.MapRoute(
name: "HealhCheck",
url: "healthcheck.aspx",
defaults: new { controller = "LoadBalance", action = "Index", id = UrlParameter.Optional }
);
Run Code Online (Sandbox Code Playgroud) 我正在努力监控Azure服务的性能.
目前有两个Web角色实例(针对同一网站)运行 - 每个实例都有自己的W3WP.exe(w3wp和w3wp#1)
如何找出哪个w3wp进程属于哪个角色实例?
有了这些信息,我想给azure.diagnostics.monitor提供一些性能计数器 - 即Process(w3wp)\ ProcessorTime(%)和Thread Count.但是为了获得任何有意义的数据,我必须将w3wp进程的进程ID附加到性能计数器(例如Process(w3wp_PID)\ processorTime(%)) - 不知道语法是否正确,但有一种方法可以附加PID)
所以AzureStorage表中的最终结果WADPerformanceCounters只有以下条目:
WebRoleInstance_n_0 | process(w3wp_1033)\processorTime (%) | 12.4
WebRoleInstance_n_1 | process(w3wp_1055)\processorTime (%) | 48.4
Run Code Online (Sandbox Code Playgroud)
atm就像
WebRoleInstance_n_0 | process(w3wp)\processorTime (%) | 12.4
WebRoleInstance_n_1 | process(w3wp)\processorTime (%) | 12.4
Run Code Online (Sandbox Code Playgroud)
我想:如果我为每个角色启动了DiagnosticsMonitor,那么监视器将使用正确的进程 - 属于启动监视器的Roleinstance.但实际上这不起作用 - 或者我认为它不起作用 - 至少在查看结果值之后.
// update:在manage.windowsazure门户上,您可以为性能监视定义自定义指标.这里可以选择专门监控的webrole实例.这也是我想要做的.对此页面实际执行的操作的见解也可能有所帮助.
比较:http: //puu.sh/1xp7q
他们只想到获取此信息的愚蠢方式是:获取每个w3wp启动前后所有进程的列表 - 确定添加了哪个进程,然后确定代码库上下文明智地启动了哪个角色实例.
multiple-instances w3wp azure performance-monitor azure-web-roles
我试图为我的Azure服务设置一个CustomLoadBalancerProbe.
根据这些信息:http://msdn.microsoft.com/en-us/library/windowsazure/jj151530.aspx#LoadBalancerProbes
应该可以将标记添加到服务定义文件中.但是当我尝试这个时,我只收到一条消息,说这对于servicedefinition文件来说是无效的.
然后我google了一下,发现了这个:http://www.windowsazure.com/en-us/manage/windows/common-tasks/how-to-load-balance-virtual-machines/
这里它告诉我,虚拟机的负载平衡仅在azure的预览版本中可用.
所以我现在有点困惑:
1)VM的负载平衡与架构中描述的负载均衡探测器的使用有区别吗?(链接1)
2)如果否:是否只是不支持?
3)如果是:为什么我无法将探针输入服务定义文件?