Windows操作系统提供了查看性能监视器的功能,用于监视CPU使用率、内存使用率,硬盘读写速度,网络速度等。您可以在开始-->运行-->输入Perfmon,就可以打开性能监视器。

  我们知道,云计算的特点之一是:弹性计算。如果在某一时间点,用于对云计算资源的使用量超过了实际部署的硬件水平,我们就可以通过修改:

  • 增加单个计算节点的硬件配置,比如配置VM Size,从Small改成Extra Large。来提高硬件水平以响应更多的客户请求。
  • 多个计算节点并行计算,比如修改Instance Count,从1(单个计算节点),改成2或者更多(多个计算节点)。这样也可以提高服务水平。

  但是Windows Azure毕竟是在远程数据中心的托管服务,我们在本地是无法监视和查看Windows Azure托管服务的资源使用情况。如果我们想查看Windows Azure的性能监视器,你可能会想到:

  • 使用远程桌面连接。因为Windows Azure提供远程桌面(RDP)连接查看Azure 计算节点的功能,所以您在部署完托管服务后,可以登录到一个计算节点的远程桌面,然后运行Perfmon进行查看。

  但是这种方法的缺点显而易见:

  • 首先,你只能查看到某一个计算节点的性能监视器而无法查看所有的计算节点。
  • 其次,使用远程桌面的步骤是及其繁琐的,需要连接、输入用户名密码、输入命令行查看。
  • 而且,通过远程桌面查看到Windows Azure性能监视器的内容,无法保存在客户端。

  考虑到这些问题,微软创建了Windows Azure Diagnostics(诊断)的机制。Windows Azure Diagnostics可以诊断检索许多内容,比如跟踪日志,奔溃事件日志等,并且保存下来。在本章里,我将侧重于Peformance Counter(性能计数器),该功能可以提供WIndows Azure应用程序的关键信息。实际上,性能计数器,可以帮助您隔离性能问题。最重要的是,它可以帮您省钱,让Windows Azure的资源得到最佳利用。

Windows Azure Diagnostics

  每一个Windows Azure计算节点都有一个内置的诊断进程(DiagnosticsAgent.exe),负责定期收集诊断数据,并缓存到本地文件,并最终存储到一个预定义的Azure存储。请注意,在诊断过程中,也可以手动触发。

  具体来说,Peformance Counter的数据被保存到Windows Azure Storage的Table中,表名为WADPerformanceCountersTable。其他Diagnostics,比如跟踪日志,事件日志等数据也都存储在指定的表,像WadLogsTableWADDiagnosticInfrastructureLogsTable。更多信息,可以参考这里

  每一个Role Instance都有一个Configuration File (配置文件),位于Azure Storage Blob下,Container(概念上类似于文件夹)为wad-control-container。配置文件主要收集性能计数器数据和相关的使用率。

  下面显示的是Disnostics Configuration File的位置。你可以下载Cloud Storage Manager访问wad-control-container。

配置文件中使用了一个标准的XML格式,并可以手动修改(不推荐)。

使用代码

在这篇文章中,我们会研究

  1.如果配置Role.cs,并且从外部程序读取Peformance Counter

  2.如何访问Azure Storage Table中的数据

  3.性能计数器的快速分析

Windows Azure诊断API

参考自MSDN

  为了Diagnostics 你的Role,你必须先在ServiceDefinition.csdef中修改配置文件。具体的您可以参考我的博文Windows
Azure Platform (二十)使用Windows Azure诊断收集日志记录数据

在WebRole.cs中修改代码

public class WebRole : RoleEntryPoint {     /// <summary>     /// Entry point before starting the Role     /// </summary>     public override bool OnStart()     {         // Get the Role instance Diagnostics configuration.          var config = DiagnosticMonitor.GetDefaultInitialConfiguration();          // Define interval for persisting the performance counter data to azure storage.         config.PerformanceCounters.ScheduledTransferPeriod = TimeSpan.FromMinutes();         // CPU Utilization Counter         PerformanceCounterConfiguration cpuUtilizationCounter =                  new PerformanceCounterConfiguration()         {             CounterSpecifier = @"\Processor(_Total)\% Processor Time",             //define the sample internal for the specific performance counter             SampleRate = TimeSpan.FromSeconds()         };         if (!config.PerformanceCounters.DataSources.Contains(cpuUtilizationCounter,                      new PerformanceCounterComparer()))         {             config.PerformanceCounters.DataSources.Add(cpuUtilizationCounter);         }         // Start diagnostic monitor with the new configuration.         DiagnosticMonitor.Start     ("Microsoft.WindowsAzure.Plugins.Diagnostics.ConnectionString", config);         return base.OnStart();     }      /// <summary>     /// Performance Counter Comparer     /// </summary>     private class PerformanceCounterComparer :          IEqualityComparer<PerformanceCounterConfiguration>     {         public bool Equals(PerformanceCounterConfiguration a,                  PerformanceCounterConfiguration b)         {             //Check whether the compared objects reference the same data.             if (Object.ReferenceEquals(a, b)) return true;             //Check whether any of the compared objects is null.             if (Object.ReferenceEquals(a, null) || Object.ReferenceEquals(b, null))                 return false;             // Check if the counter specifier and the sampling rate are the same.             return (a.CounterSpecifier == b.CounterSpecifier &&                  a.SampleRate == b.SampleRate);         }         public int GetHashCode(PerformanceCounterConfiguration counter)         {             //Check whether the object is null             if (Object.ReferenceEquals(counter, null)) return ;             //Get hash code for the CounterSpecifier field if it is not null.             int hashCounterSpecifier = counter.CounterSpecifier ==                             null ?  : counter.CounterSpecifier.GetHashCode();             //Calculate the hash code for the counter.             return hashCounterSpecifier ^ counter.SampleRate.GetHashCode();         }     } }

远程配置 Performance Counter(性能计数器)

使用 Microsoft.WindowsAzure.Diagnostics.Management.

const string storageAccoutName = "Storage-Name-Here";  const string privateKey = "Storge-Private-Key-Here"; const string deploymentId = "Deployment-Id-Here"; var storageAccount = CloudStorageAccount.Parse(String.Format(     "DefaultEndpointsProtocol=https;AccountName={0};AccountKey={1}",      storageAccoutName, privateKey));  // Get the diagnostics manager for the entire storage account. var diagnosticManager = storageAccount.CreateDeploymentDiagnosticManager(deploymentId);  // Get diagnostics manager for the specific role instance. RoleInstanceDiagnosticManager roleDiagManager =    diagnosticManager.GetRoleInstanceDiagnosticManager("WebRole1", "WebRole1_IN_0");  //Modify current configuration var currentConfiguariton = roleDiagManager.GetCurrentConfiguration(); currentConfiguariton.PerformanceCounters.ScheduledTransferPeriod =                          TimeSpan.FromMinutes(); currentConfiguariton.PerformanceCounters.DataSources.Add             (new PerformanceCounterConfiguration() {     CounterSpecifier = @"\Processor(_Total)\% Processor Time",     SampleRate = TimeSpan.FromSeconds() });  //Commit the changes roleDiagManager.SetCurrentConfiguration(currentConfiguariton);

检索性能计数器数据

  现在,我们已经配置了我们要监视的计数器。让我们访问Azure Storage Table(表名WADPerformanceCountersTable),并显示出来。

  我创建了PerformanceDataContext,派生自TableServiceContext。这是为了连接到Azure表,Microsoft提供的ADO扩展的一部分。你可以使用LINQ查询以检 索数据。

/// <summary> /// Query helper for retrieving data from the WADPerformanceCountersTable /// </summary> public class QueryExecuter {     /// <summary>     /// Cloud storage account client     /// </summary>     private CloudStorageAccount accountStorage;     /// <summary>     /// Default Constructor - Use development storage emulator.     /// </summary>     public QueryExecuter()     {         accountStorage = CloudStorageAccount.DevelopmentStorageAccount;     }     /// <summary>     /// Constructor     /// </summary>     /// <param name="accountName">Azure storage name</param>     /// <param name="privateKey">Azure storage private key</param>     public QueryExecuter(string accountName, string privateKey)     {         accountStorage = CloudStorageAccount.Parse(String.Format(           "DefaultEndpointsProtocol=https;AccountName={0};AccountKey={1}", account     }     /// <summary>     /// Retrieve Performance counter data     /// </summary>     /// <param name="counterFullName">Counter specifier full name</param>     /// <param name="deploymentid">Deployment id</param>     /// <param name="roleName">Role name</param>     /// <param name="roleInstanceName">Role instance name</param>     /// <param name="startPeriod">Start sample date time</param>     /// <param name="endPeriod">End sample date time</param>     /// <returns></returns>     public List<PerformanceData> QueryPerformanceCounter(string counterFullName,          string deploymentid, string roleName,          string roleInstanceName, DateTime startPeriod, DateTime endPeriod)     {         PerformanceDataContext context = new PerformanceDataContext(           accountStorage.TableEndpoint.ToString(), accountStorage.Credentials);         var data = context.PerfData;         CloudTableQuery<PerformanceData> query = null;         query = (from d in data                  where d.PartitionKey.CompareTo("" + startPeriod.Ticks) >=                                          && d.PartitionKey.CompareTo                     ("" + endPeriod.Ticks) <=                                           && d.CounterName == counterFullName                                              && d.EventTickCount >= startPeriod.Ticks                                                  && d.EventTickCount <= endPeriod.Ticks                                                       && d.DeploymentId == deploymentid                                                          && d.Role == roleName                                                              && d.RoleInstance ==                              roleInstanceName                  select d).AsTableServiceQuery<PerformanceData>();         List<PerformanceData> selectedData = new List<PerformanceData>();         try         {             selectedData = query.Execute().ToList<PerformanceData>();         }         catch         {         }         return selectedData;     } }

此演示,我创建了一个WindowsForm,将Diagnostics Table中的数据填充到图表中。

显示的是过去2个小时内,某一个Role Instance的CPU使用率。

第三方工具

Quest 软件公司开发了一个非常方便和容易使用的工具。称为Spotlight on Azure。为我们对整个Azure订阅提供了深度监控的功能,包括Role Instance,数据聚合,历史数据展示,提醒机制,用户自定义深度分析计数器。

Windows Azure Platform 性能监视器(转载)的更多相关文章

  1. Windows Azure Platform Introduction (11) 了解Org ID、Windows Azure订阅、账户

    <Windows Azure Platform 系列文章目录> 了解和掌握Windows Azure相关的基础知识是非常重要的. 问题1:什么叫做Org ID Org ID是Azure C ...

  2. Windows Azure Platform 系列文章目录

    Windows Azure Platform (一) 云计算的出现 Windows Azure Platform (二) 云计算的分类和服务层次 Windows Azure Platform (三) ...

  3. Windows Azure Platform (一) 云计算的出现

    <Windows Azure Platform 系列文章目录> 最近的一年一直致力于微软云计算技术的推广和研究,对于微软的云计算平台Windows Azure Platform有一定的了解 ...

  4. Windows Azure Platform Introduction (14) 申请海外的Windows Azure账户

    <Windows Azure Platform 系列文章目录> 本文的最后更新时间为:2017-12-27 本文介绍国内用户,注册和使用海外Azure账户. 前提: 1.需要一个有效的Wi ...

  5. 使用 windows server 2012 性能监视器

    监控Windows server的内存.CPU.磁盘IO等性能 配置方法: 打开Aministrator Tools --> Performance Monitor Performances - ...

  6. Windows Azure Storage (21) 使用AzCopy工具,加快Azure Storage传输速度

    <Windows Azure Platform 系列文章目录> Update 2016-09-28 想要在Azure云端,使用AzCopy工具,从Azure China 上海数据中心存储账 ...

  7. Windows Azure Virtual Machine (26) 使用高级存储(SSD)和DS系列VM

    <Windows Azure Platform 系列文章目录> Update: 2016-11-3,如果大家在使用Linux VM,使用FIO进行IOPS测试的时候,请使用以下命令: su ...

  8. Windows Azure Storage (18) 使用HTML5 Portal的Azure CDN服务

    <Windows Azure Platform 系列文章目录> Update:2015-04-15 如果读者使用的是国内由世纪互联运维的Azure China服务,请参考笔者的文档:Azu ...

  9. Windows Azure Storage (19) 再谈Azure Block Blob和Page Blob

    <Windows Azure Platform 系列文章目录> 请读者在参考本文之前,预习相关背景知识:Windows Azure Storage (1) Windows Azure St ...

随机推荐

  1. CDOJ 1279 班委选举 每周一题 div2 暴力

    班委选举 题目连接: http://acm.uestc.edu.cn/#/status/list?problemId=1279 Description 高考的脚步越来越近了--时间如山涧小溪一般悄无声 ...

  2. C#反射读取和设置类的属性

    C#反射技术的简单操作(读取和设置类的属性) http://www.cnblogs.com/william-lin/archive/2013/06/05/3118233.html 泛型方法通过反射创建 ...

  3. JavaScript里的循环方法:forEach,for-in,for-of

    JavaScript诞生已经有20多年了,我们一直使用的用来循环一个数组的方法是这样的: for (var index = 0; index < myArray.length; index++) ...

  4. for of 与 for in的区别2

    遍历数组通常使用for循环,ES5的话也可以使用forEach,ES5具有遍历数组功能的还有map.filter.some.every.reduce.reduceRight等,只不过他们的返回结果不一 ...

  5. [Android实例] 推荐给你们一个好用的ListView、RecyclerView适配器

    https://github.com/vihuela/RecyclerViewHelpper 如果用过RecyclerView的人都知道,高度不会包裹,然后写法好像也不是很简洁,甚至点击事件不好设 置 ...

  6. 一步一步在Windows下搭建React Native Android开发环境

    搭建JAVA开发环境 依据操作系统分为x86或x64位的.下载jdk1.8以上的版本号. 本机安装时的java版本号:jdk-8u45-windows-x64.exe 配置JAVA的环境变量 JAVA ...

  7. HDU3001 Travelling 状压DP

    哭瞎啊,每一个城市能够经过至多两次,但没有要求必须经过两次.想用 两个状压来乱搞搞.结果自觉得会T.结果 WA了,搞了一下午.没想到用三进制啊.智商捉急,參考了 http://blog.csdn.ne ...

  8. sftp子系统申请已拒绝 请确保ssh连接的sftp子系统设置有效

    一.sftp子系统申请已拒绝,请确保ssh连接的sftp子系统设置有效 1.修改配置文件 [root@nulige ~]# vi /etc/ssh/sshd_config # override def ...

  9. 理解Vue的计算属性

    计算属性是一个很邪门的东西,只要在它的函数里引用了 data 中的某个属性,当这个属性发生变化时,函数仿佛可以嗅探到这个变化,并自动重新执行. 上述代码会源源不断的打印出 b 的值.如果希望 a 依赖 ...

  10. apache2.4 的安装

    Apache2.4 安装包下载地址 http://httpd.apache.org/docs/current/platform/windows.html#down 选择ApacheHaus 进入后 这 ...