所以,马上就不知道这个问题是否更适合另一个StackExchange站点.
我有一个在Windows Server 2008和IIS 7.5上运行的ASP.NET MVC 3 Web应用程序
网站最初运行良好,但我可以看到内存使用量逐渐增长.大约12个小时后,它几乎没有内存,网站窒息.
我正在使用大量的缓存,所以我认为这与一些可能的内存泄漏相结合是导致问题的原因.
所以我的问题 -在运行ASP.NET MVC的Web服务器上监视内存使用情况的最佳方法(例如工具)是什么?
在过去,我使用了旧的'perfmon并将IIS计数器用于测量这些东西.
这仍然是最好的方式,如果是这样,有人可以为我的场景推荐一个好的perfmon计数器模板吗?
如何使用PerfMon计数器记录C#中方法的平均执行时间?
到目前为止,我只找到了增加或减少PerfMon计数器的示例代码.
我想检查一下我服务中的内存泄漏问题.我试过以下一组perfmon计数器.
我在这里提到了上面的集合
还提到以下集:
我在这里提到了上面的集合
是否有任何参数/标准或任何其他最佳方法来识别内存泄漏的perfmon计数器?
任何人都可以建议我使用一组计数器来检查内存泄漏吗?或以上设置涵盖内存泄漏?
performance memory-leaks perfmon performancecounter memory-leak-detector
我正在为应用程序创建一些自定义性能计数器.我写了一个简单的C#工具来创建类别和计数器.例如,下面的代码片段基本上就是我正在运行的代码片段.然后,我运行一个单独的应用程序,无休止地刷新计数器的原始值.当它运行时,计数器和虚拟实例在perfmon本地可见.
我遇到的问题是我们使用的监控系统无法看到我从另一台服务器远程查看时创建的多实例计数器中的实例.当使用perfmon浏览计数器时,我可以看到类别和计数器,但实例框显示为灰色,我甚至无法选择"所有实例",也无法单击"添加".使用其他访问方法,如[typeperf][1]
展示类似的问题.
我不确定这是服务器还是代码问题.这只能在我需要的生产环境中重现.在我的桌面和开发服务器上,它运行良好.我是所有服务器上的本地管理员.
CounterCreationDataCollection collection = new CounterCreationDataCollection();
var category_name = "My Application";
var counter_name = "My counter name";
CounterCreationData ccd = new CounterCreationData();
ccd.CounterType = PerformanceCounterType.RateOfCountsPerSecond64;
ccd.CounterName = counter_name;
ccd.CounterHelp = counter_name;
collection.Add(ccd);
PerformanceCounterCategory.Create(category_name, category_name, PerformanceCounterCategoryType.MultiInstance, collection);
Run Code Online (Sandbox Code Playgroud)
然后,在一个单独的应用程序中,我运行它来生成虚拟实例数据:
var pc = new PerformanceCounter(category_name, counter_name, instance_name, false);
while (true) {
pc.RawValue = 0;
Thread.Sleep(1000);
}
Run Code Online (Sandbox Code Playgroud) 好的,所以我基本上试图创建一个已安装的性能计数器类别列表,就像你在PerfMon中获得的那样.为此,我正在使用
System.Diagnostics.PerformanceCounterCategory.GetCategories()
Run Code Online (Sandbox Code Playgroud)
这看起来很有效,直到你检查清单,并发现有些东西丢失了.我发现缺少的第一个是ReadyBoost Cache.这是因为该项目设置为在"x86"上编译.将此更改为"任何CPU"修复了该问题.
然而,仍然有一些缺失,例如,其中一个测试机器有一个"授权管理器应用程序"类别(我的没有,似乎没有人知道原因,或者它来自哪里)但是,在那台机器上,性能计数器类别显示在PerfMon中,但在GetCategories()
从C#调用方法时则不显示.
有谁知道为什么?有更可靠的方法PerformanceCounterCategories
吗?这是因为我正在使用.Net吗?我可以使用一些原生API吗?
编辑
对不起,我还是不明白.我编写这段代码或许可以更好地说明它:
using System;
using System.Diagnostics;
using System.Linq;
using System.Text.RegularExpressions;
using Microsoft.Win32;
namespace PccHack
{
class Program
{
private static readonly Regex Numeric = new Regex(@"^\d+$");
static void Main(string[] args)
{
var pcc1 = PerformanceCounterCategory.GetCategories();
Console.Out.WriteLine("Getting automatically from the microsoft framework gave {0} results.", pcc1.Count());
string[] counters;
using (var regKey = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Perflib\009"))
{
counters = regKey.GetValue("Counter") as string[];
}
var pcc2 = counters.Where(counter => !Numeric.IsMatch(counter)).ToList();
pcc2.Sort();
Console.Out.WriteLine("Getting manually from …
Run Code Online (Sandbox Code Playgroud) 我用了创建了一个.coverage
文件Vsperfmon.exe
我目前正在使用VS 2012 professional for web
许可版.该.coverage
结果不能被打开VS Professional
.谷歌搜索后,我知道VS Ultimate
可以打开它
而不是使用VS Ultimate
,是否有任何插件VS professional 2012
或任何第三方解决方案
在哪里可以找到Perfmon二进制.blg文件格式的详细的低级规范?或者甚至更好,是否有人编写了一个低级别的开源库(最好用C语言,但任何语言都可以)来解析.blg文件?
当我尝试运行此代码时:
var categories = System.Diagnostics.PerformanceCounterCategory.GetCategories();
Run Code Online (Sandbox Code Playgroud)
我得到一个ArgumentException异常.
我已经尝试了以下但没有运气:
无论我是在Windows 7 Enterprise SP1 64位计算机上运行Visual Studio 2008,2010还是2012,我都会得到相同的结果.
我将不胜感激任何帮助.
谢谢.
我正在各种虚拟机上收集一些性能数据.DataCollectorSet初始化如下:
set.Subdirectory = set.name;
set.SubdirectoryFormat = AutoPathFormat.plaYearMonthDay;
var schedule = set.Schedules.CreateSchedule();
schedule.Days = WeekDays.plaEveryday;
schedule.StartDate = DateTime.Now;
set.Schedules.Add(schedule);
set.Commit(set.name, null, CommitMode.plaCreateNew);
Run Code Online (Sandbox Code Playgroud)
然后我添加一个收藏家:
var collector = (IPerformanceCounterDataCollector)set.DataCollectors.CreateDataCollector(DataCollectorType.plaPerformanceCounter);
collector.FileName = counterPath.Replace("\\", "_");
collector.LogAppend = true;
collector.FileNameFormat = AutoPathFormat.plaYearMonthDay;
collector.SampleInterval = 60u;
collector.SegmentMaxRecords = 1440;
collector.LogFileFormat = FileFormat.plaTabSeparated;
set.DataCollectors.Add(collector);
var counters = new string[1];
counters[0] = counterPath;
collector.PerformanceCounters = counters;
set.Commit(set.name, null, CommitMode.plaCreateOrModify);
Run Code Online (Sandbox Code Playgroud)
当我\LogicalDisk(_Total)\% Disk Time
在几十台机器上运行时,我得到的值看起来像预期的百分比 - 它们大多在0.00到5.00左右,但有时候,在高活动期间,会达到两位数.
但是,在一台机器上,所有值都高于100.无论机器是否显示繁忙,它们都显示在大约120和170之间.同时,使用相同的计数器手动运行perfmon显示可能正确的值 - 忙时接近100%,否则保持在10%以下.
这是来自具有预期结果的机器的前几个输出线:
"(PDH-TSV 4.0)(MitteleuropäischeSommerzeit)( - 120)""\ BR-DOMAIN \LogischerDatenträger(_Total)\ Zeit(%)""08/04/2015 01:00:18.425""""08/04/2015 01:01:18.407""2.4181960253316448""08/04/2015 …
提出这个问题的最佳方式是举例.
拿柜台
\ ASP.NET \请求执行时间&\ ASP.NET \请求等待时间
ASP.NET Applications存储桶中有一些具有相同名称的计数器
\ ASP.NET应用程序\请求执行时间和\ ASP.NET应用程序\请求等待时间
谁知道两者之间的区别?有区别吗?是一个是另一个的子集/超集吗?
谢谢.
perfmon ×10
.net ×3
c# ×3
asp.net ×2
performance ×2
.net-4.0 ×1
asp.net-mvc ×1
binary ×1
file-format ×1
memory-leaks ×1
permissions ×1
registry ×1
webserver ×1