通过使用下面的代码,它很容易找到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。
答案 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类中提供的性能指标。可以使用以下属性:
请记住,为了以%计算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。