VSPerf 和 A​​zure 云服务

Posted

技术标签:

【中文标题】VSPerf 和 A​​zure 云服务【英文标题】:VSPerf and Azure Cloud Services 【发布时间】:2012-11-17 22:27:34 【问题描述】:

当我将云服务部署到 Windows Azure 时,它​​会导致许多 VSPerf.exe 实例启动 - 从 1 到 5。

在它们之间,它们消耗了所有 CPU,并且没有一个进程会自行终止。

如果我远程连接到实例并手动终止进程,它们会在下一个请求时重新启动。如果在请求期间进程终止,则请求成功,页面按预期显示和运行。

这与之前的部署的唯一区别是我已经升级到 .NET 4.5,因此将云服务升级到服务器 2012。

这可能是什么原因造成的?

更新

每次启动失败都会记录 2 个事件:

VsPerf Tool Error: Error starting data collection with a dedicated process D:\Program Files (x86)\Microsoft Visual Studio 11.0\Team Tools\Performance Tools\VSPerf.

.NET Runtime version 4.0.30319.18010 - Loading profiler failed during CoCreateInstance. Profiler CLSID: '44a86cad-f7ee-429c-83eb-f3cde3b87b70'. HRESULT: 0x80040111. Process ID (decimal): 1444. Message ID: [0x2504].

更新 2

创建新实例或重新映像计算机后不会出现 VSPerf 问题(至少目前是一个修复(一个烦人且耗时的修复)。

【问题讨论】:

你能解决这个问题吗?我看到了同样的问题:/ 恐怕不行,每次部署后我都必须重新映像:( 【参考方案1】:

检查 Visual Studio 中的 Azure 发布设置,我敢打赌您已在“高级”选项卡上启用了分析。

【讨论】:

正确!非常感谢 - 我从没想过要看那里。讽刺的是,CPU 采样“以低开销监控 CPU 绑定应用程序”被选中! 我也收到了。但是 CPU 采样不应占用 100% 的 CPU。这太疯狂了! 我也有这个,不过CPU采样很有用,我不想去掉。【参考方案2】:

同样的问题,VSPerf.exe 的 2 个进程在第二个角色实例上消耗 100% 的 CPU。 IIS 在该实例上变得无响应。 4 个月前我们遇到了完全相同的问题,当我们使用 MSFT 支持调试此问题时启用分析时“不知何故”消失了(MSFT 内部有人知道这个问题)。但由于无法重现问题(我们只有屏幕截图),它被丢弃了。

因为我在 5 分钟前再次看到它,并且由于 Azure SDK 2.0 可以轻松获取诊断日志(与 SDK 1.8 中的配置习惯不同),这里有一些有用的东西可以让下一个人理解

核心错误是Application VsPerf Tool Error: Error starting data collection with a dedicated process D:\Program Files (x86)\Microsoft Visual Studio 11.0\Team Tools\Performance Tools\VSPerf.,详细日志(4 个条目)如下。有趣的是,我有 2 个 VSPerf.exe 进程燃烧 100% 的 CPU,并且还有 2 个日志条目....

555908d1-a6d7-4695-8e1e-26931d2012f4  Service Control Manager 7011    System  A timeout (30000 milliseconds) was reached while waiting for a transaction response from the iphlpsvc service.  <Event xmlns='http://schemas.microsoft.com/win/2004/08/events/event'><System><Provider Name='Service Control Manager' Guid='555908d1-a6d7-4695-8e1e-26931d2012f4' EventSourceName='Service Control Manager'/><EventID Qualifiers='49152'>7011</EventID><Version>0</Version><Level>2</Level><Task>0</Task><Opcode>0</Opcode><Keywords>0x8080000000000000</Keywords><TimeCreated SystemTime='2013-06-23T17:37:25.557218700Z'/><EventRecordID>1269</EventRecordID><Correlation/><Execution ProcessID='520' ThreadID='1104'/><Channel>System</Channel><Computer>RD00155DA909B8</Computer><Security/></System><EventData><Data Name='param1'>30000</Data><Data Name='param2'>iphlpsvc</Data></EventData></Event>   WebApp_IN_1 6/23/2013 5:37 PM   2   520 1104
555908d1-a6d7-4695-8e1e-26931d2012f4  Service Control Manager 7011    System  A timeout (30000 milliseconds) was reached while waiting for a transaction response from the Schedule service.  <Event xmlns='http://schemas.microsoft.com/win/2004/08/events/event'><System><Provider Name='Service Control Manager' Guid='555908d1-a6d7-4695-8e1e-26931d2012f4' EventSourceName='Service Control Manager'/><EventID Qualifiers='49152'>7011</EventID><Version>0</Version><Level>2</Level><Task>0</Task><Opcode>0</Opcode><Keywords>0x8080000000000000</Keywords><TimeCreated SystemTime='2013-06-23T17:37:56.259560100Z'/><EventRecordID>1270</EventRecordID><Correlation/><Execution ProcessID='520' ThreadID='1104'/><Channel>System</Channel><Computer>RD00155DA909B8</Computer><Security/></System><EventData><Data Name='param1'>30000</Data><Data Name='param2'>Schedule</Data></EventData></Event>   WebApp_IN_1 6/23/2013 5:37 PM   2   520 1104
00000000-0000-0000-0000-000000000000    VSPERF  4100    Application VsPerf Tool Error: Error starting data collection with a dedicated process D:\Program Files (x86)\Microsoft Visual Studio 11.0\Team Tools\Performance Tools\VSPerf. <Event xmlns='http://schemas.microsoft.com/win/2004/08/events/event'><System><Provider Name='VSPERF'/><EventID Qualifiers='57635'>4100</EventID><Level>2</Level><Task>0</Task><Keywords>0x80000000000000</Keywords><TimeCreated SystemTime='2013-06-23T17:40:37.000000000Z'/><EventRecordID>266</EventRecordID><Channel>Application</Channel><Computer>RD00xxxxxxxxx</Computer><Security/></System><EventData><Data>Error starting data collection with a dedicated process D:\Program Files (x86)\Microsoft Visual Studio 11.0\Team Tools\Performance Tools\VSPerf.</Data></EventData></Event> WebApp_IN_1 6/23/2013 5:40 PM   2   0   0
00000000-0000-0000-0000-000000000000    VSPERF  4100    Application VsPerf Tool Error: Error starting data collection with a dedicated process D:\Program Files (x86)\Microsoft Visual Studio 11.0\Team Tools\Performance Tools\VSPerf. <Event xmlns='http://schemas.microsoft.com/win/2004/08/events/event'><System><Provider Name='VSPERF'/><EventID Qualifiers='57635'>4100</EventID><Level>2</Level><Task>0</Task><Keywords>0x80000000000000</Keywords><TimeCreated SystemTime='2013-06-23T17:40:41.000000000Z'/><EventRecordID>267</EventRecordID><Channel>Application</Channel><Computer>RD00xxxxxxxxx</Computer><Security/></System><EventData><Data>Error starting data collection with a dedicated process D:\Program Files (x86)\Microsoft Visual Studio 11.0\Team Tools\Performance Tools\VSPerf.</Data></EventData></Event> WebApp_IN_1 6/23/2013 5:40 PM   2   0   0

【讨论】:

【参考方案3】:

我发现最接近解决方法的是创建启动任务

<Task commandLine="VSPerf.cmd" executionContext="elevated" taskType="background" />

VSPerf.cmd 是一个简单的启动器

PowerShell -ExecutionPolicy Unrestricted .\VSPerf.ps1
exit /B 0

对于试图杀死过度活跃的 VSPerf 实例的 PowerShell 脚本:

function Restart-VSPerf 
    $procs = (
        gwmi -Query "SELECT IDProcess,PercentProcessorTime FROM Win32_PerfFormattedData_PerfProc_Process WHERE Name='vsperf' AND PercentProcessorTime > 25" |
        Foreach-Object  $_pid = $_.IDProcess ; gwmi -Query "SELECT Handle,CommandLine FROM win32_process WHERE Name='vsperf.exe' AND Handle=$_pid" | Select-Object Handle, CommandLine 
    )
    if ($procs) 
        # Get VSPerf path.
        # NB The regex uses conditional matching with an expression, as described in https://msdn.microsoft.com/en-us/library/36xybswe.aspx
        # to ensure that a single capturing group gets the contents of quoted arguments and unquoted arguments.
        $regex = [regex] '^(("?)((?(?<=")[^"]*|[^"\s]*))\2(\s+|$))+$'
        $vsperf = $regex.Match($procs[0].CommandLine).Groups[3].Captures[0].Value

        & $vsperf /detach

        # Kill
        $procs | Foreach-Object  Stop-Process -Force -Id $_.Handle 

        # Restart
        Start-Sleep -s 1
        $procs | Foreach-Object 
            $_args = ($regex.Match($_.CommandLine).Groups[3].Captures[1..99] |  Select-Object -ExpandProperty Value)
            Start-Process $vsperf -ArgumentList "$_args"
        
    


while (1) 
    Start-Sleep -s 180
    Restart-VSPerf

它有时会起作用,但并非总是如此。欢迎提出可靠性改进建议。

【讨论】:

以上是关于VSPerf 和 A​​zure 云服务的主要内容,如果未能解决你的问题,请参考以下文章

Azure 上的简单实现 websockets

DLL“vsperf140.dll”:找不到指定的模块

云服务概念解析

华为云服务之弹性云服务器ECS的深度使用和云端实践

阿里云服务器

阿里云邮件推送服务