测量每个asp.net Web应用程序/应用程序池的CPU时间

时间:2014-03-19 23:04:54

标签: asp.net performance iis

通过使用下面的代码,它很容易找到w3wp进程的pid并获得进程使用的CPU时间。我的设置一个aspnet应用程序有自己的应用程序池。

    using (ServerManager serverManager = new ServerManager())
    {
        foreach (var appPool in serverManager.ApplicationPools)
        {

            if (appPool.WorkerProcesses.Any())
            {

            }
        }
     }

如果此过程产生了任何其他进程。 (运行cmd进程的Web应用程序),是否有任何简单的方法来获取这些进程,这些cpu时间也可以被搞乱。

一直在研究使用性能conunters获取进程ID并创建进程ID但是这一切似乎变得复杂了,我想知道是否有什么东西在那里。

我也用过

  AddPerformanceCounterIfNotExist(dmConfig, string.Format(@"\ASP.NET Applications(_LM_W3SVC_{0}_ROOT)\Requests/Sec", ids[site.Name]));
  AddPerformanceCounterIfNotExist(dmConfig, string.Format(@"\ASP.NET Applications(_LM_W3SVC_{0}_ROOT)\% Managed Processor Time (estimated)", ids[site.Name]));
  AddPerformanceCounterIfNotExist(dmConfig, string.Format(@"\ASP.NET Applications(_LM_W3SVC_{0}_ROOT)\Managed Memory Used (estimated)", ids[site.Name]));

获取有关w3wp正在运行的asp.net应用程序的一些信息,但是每秒只有请求实际上给了麻烦。其他两个人只报告0。

2 个答案:

答案 0 :(得分:1)

http://msdn.microsoft.com/en-us/library/vstudio/s57a598e(v=vs.100).aspx上的MSDN文章指出,您需要在.NET Framework文件夹中的aspnet.config文件中启用它。

<?xml version="1.0" encoding="UTF-8" ?> 
<configuration> 
  <runtime> 
    <appDomainResourceMonitoring enabled="true"/> 
  </runtime> 
</configuration>

请参阅&#34;单个工作进程中的各个应用程序的性能监视&#34;。

答案 1 :(得分:0)

我建议使用性能计数器来测量CPU时间,但如果你不喜欢它们,那么试试Process类中提供的性能指标。可以使用以下属性:

  • PrivilegedProcessorTime
  • UserProcessorTime
  • TotalProcessorTime

请记住,为了以%计算CPU使用率,您需要获得系统时间。使用这些属性的示例任务管理器可能如下所示:

public static class Program
{
    [DllImport("kernel32.dll", SetLastError = true)]
    static extern bool GetSystemTimes(out long lpIdleTime, out long lpKernelTime, out long lpUserTime);

    internal class SystemTimes
    {
        internal long idle;
        internal long kernel;
        internal long user;

        public TimeSpan IdleTime {
            get { return new TimeSpan(idle); }
        }

        public TimeSpan KernelTime {
            get { return new TimeSpan(kernel); }
        }

        public TimeSpan UserTime {
            get { return new TimeSpan(user); }
        }

        public TimeSpan TotalTime {
            get { return new TimeSpan(user + kernel); }
        }
    }

    static SystemTimes GetSystemTimesManaged() {
        var st = new SystemTimes();

        if (!GetSystemTimes(out st.idle, out st.kernel, out st.user)) {
            throw new Win32Exception();
        }
        return st;
    }

    public static void Main() {
        long lastSystemTime = 0;
        var lastProcCpuTimes = new Dictionary<int, long>(100);
        while (true) {
            var procs = Process.GetProcesses();
            for (int j = 0; j < 10; j++) {
                var sdiff = GetSystemTimesManaged().TotalTime.Ticks - lastSystemTime;
                Console.Clear();
                Console.WriteLine("                      Name           PID      CPU");
                Console.WriteLine("                      ----           ---      ---");
                for (int i = 0; i < procs.Length; i++) {
                    try {
                        var proc = procs[i];
                        if (proc != null && !proc.HasExited) {
                            proc.Refresh();
                            if (!lastProcCpuTimes.ContainsKey(proc.Id)) {
                                lastProcCpuTimes.Add(proc.Id, proc.TotalProcessorTime.Ticks);
                                Console.WriteLine("{0,30}{1,10}     N/A", proc.ProcessName, proc.Id);
                            } else {
                                var diff = proc.TotalProcessorTime.Ticks - lastProcCpuTimes[proc.Id];
                                Console.WriteLine("{0,30}{1,10}{2,8:0.00}%", proc.ProcessName, proc.Id,
                                        (diff * 100.0 / sdiff));
                                lastProcCpuTimes[proc.Id] = proc.TotalProcessorTime.Ticks;
                            }
                        }
                    } catch (System.ComponentModel.Win32Exception) {
                        // probably access denied - just ignore it
                        procs[i] = null;
                    }
                }
                lastSystemTime = GetSystemTimesManaged().TotalTime.Ticks;
                Thread.Sleep(1000);
            }
        }
    }
}

您可以使用 AppDomain.MonitoringTotalProcessorTime 属性测量AppDomain CPU时间,但您需要将 AppDomain.MonitoringIsEnabled 设置为true。