诊断分析报告中未显示的高 Azure 云服务 CPU 使用率

Diagnosing high Azure cloud service CPU usage which doesn't show in the profiling report

我有一个简单的 Azure 云服务,其中包含一个 Web 角色、没有辅助角色和两个实例。它配置为使用 A0 实例。当我部署它时,门户监控系统显示 CPU 使用率约为 98%,即使在一夜之间也没有下降到合理水平。

但是,如果我下载分析报告,它实际上显示 0% CPU 使用率。这并不奇怪,因为我实际上还没有调用该服务。在服务 运行 时缩减到一个实例有时会导致 CPU 使用率下降到合理水平(低于 10%),但并非总是如此。

我尝试将远程桌面连接到其中一个实例,但是当它们挂钩虚拟机时 CPU 远程桌面的响应时间太长:数据包嗅探显示我什至没有得到在 RD 显示 "Unable to connect" 错误之前返回 TCP ACK。我确实将云服务配置为接收 RD,因为当 CPU 不超过 90% 时我可以连接。

我看到 Azure 网站有一个工具 (Kudu Process Monitor) 提供有关 CPU 使用情况的信息,但它似乎不适用于云服务。

是否有任何其他工具可以查看 CPU 的使用情况?

TL;DR: 远程 PowerShell

与远程桌面相比,远程 PowerShell 对延迟的要求较低,因此一旦将其配置为可用,就可以连接到 运行 98% CPU 的实例并使用 Get-Counter '\Process(*)\% Processor Time' 与你想要的任何后续 formatting pipeline 。诀窍是启用它。

我按照 Remote Powershell to Azure PaaS 上的 MS 博客 post 中的说明进行操作,但它们对我来说并不完美。具体来说,用户创建似乎无声地失败了,因为日志显示用户已创建,但控制面板的用户列表却没有。所以修改后的指令是:

  1. .csdef 文件中,在 <WebRole> 配置中添加

    <Startup>
      <Task commandLine="EnableWinRM.cmd" executionContext="elevated" taskType="simple" />
    </Startup>
    

    并在 <WebRole><Endpoints> 内添加

    <InstanceInputEndpoint name="WinRM" localPort="5986" protocol="tcp">
      <AllocatePublicPortFrom>
        <FixedPortRange min="30000" max="30100" />
      </AllocatePublicPortFrom>
    </InstanceInputEndpoint>
    
  2. 在 web 角色的项目中,添加一个文件 EnableWinRM.cmd 并且 Copy Always:

    PowerShell -command Set-ExecutionPolicy -ExecutionPolicy Unrestricted
    PowerShell .\EnableWinRM.ps1
    exit /B 0
    

    和一个文件 EnableWinRM.ps1 Copy Always(替换指纹和主机名):

    $thumbprint = '<< Thumbprint for a suitable certificate >>'
    $certId = '<< Hostname >>'
    winrm create winrm/config/listener?Address=*+Transport=HTTPS `@`{Hostname=`"($certId)`"`;  CertificateThumbprint=`"($thumbprint)`"`}
    Set-Item WSMan:\localhost\Shell\MaxMemoryPerShellMB 2000
    
  3. 通过manage.windowsazure.com配置选项卡启用远程桌面,在底部任务中选择远程酒吧。这样做的目的是创建一个具有已知用户名和密码的特权用户,因为这是我在下一步中用来连接的用户。

  4. 使用远程桌面用户连接 PowerShell:

    $cred = Get-Credential
    Enter-PSSession -ComputerName <<Hostname>> -Port 30000 -UseSSL -Credential $cred
    

PS 对于任何好奇的人,过度 CPU 的使用归因于 vsperf