有没有人知道使用普通的非托管Visual C++创建自定义性能计数器的方法?
我知道可以使用托管C++轻松完成,但我需要使用非托管Windows服务.
我也知道您可以检索性能计数器数据,但我需要创建一些自定义计数器并在应用程序运行时期间递增它们.
我有一个ASP.NET应用程序,它通过创建和写入自定义性能计数器来跟踪统计信息.有时,我会在错误日志中看到指示计数器无法打开,因为它们已在当前进程中使用过.我认为这是由于我的.NET appdomain已在同一个w3wp.exe进程中重置.当我的应用程序域被回收时,如何避免这些错误并重新建立与性能计数器的连接?
柜台建设:
PerformanceCounter pc = new PerformanceCounter();
pc.CategoryName = category_name;
pc.CounterName = counter_name;
pc.ReadOnly = false;
pc.InstanceLifetime =
PerformanceCounterInstanceLifetime.Process;
pc.InstanceName = instance_name;
Run Code Online (Sandbox Code Playgroud)
柜台使用:
pc.Increment()
Run Code Online (Sandbox Code Playgroud)
[2009年3月26日更新]收到的错误消息是:
实例'_lm_w3svc_1_root_myapp'已存在,其生命周期为Process.在删除它或使用它的进程退出之前,它不能重新创建或重用.已存在具有生命周期的过程.
我尝试通过初始化性能计数器并在瞬态AppDomain中写入其中一个来复制控制台应用程序中的异常.然后我卸载AppDomain并在第二个Appdomain中再次执行(相同的过程).他们都成功了.我现在不确定究竟是什么原因,我对ASP.NET中AppDomain回收的假设似乎是错误的.
我正在考虑在两个同时处于活动状态的线程中对QueryPerformanceCounter进行重复调用(旋转).我不确定这是否真的是一个问题,因为我没有看到任何关于它的文章,但是QueryPerformanceCounter线程安全吗?
谢谢
我了解使用Perfmon.msc您可以创建自定义性能计数器并使用计数器日志,您可以将计数器值写入文本文件.
我也理解我也可以通过使用创建性能计数器以编程方式使用它System.Diagnostics.PerformanceCounter,并使用NextValue()方法获取计数器值.是否有一种程序化的方法来告诉PerformanceCounter对象将日志写入文本文件(类似于Counter Log in perfmon.msc)?
我想在我的C#应用程序中阅读一些性能计数器,例如"Processor \%Idle Time",但这仅适用于英语系统.由于需要使用计数器类别和名称初始化性能计数器,如何使我的代码在不同的UI语言下运行?
我需要在运行时将唯一标识符附加到对象.标识符在应用程序期间必须是唯一的.我计划在我的对象模型的基类中有一个私有成员变量.此变量将在对象初始化时设置,并且该值将在对象的生命周期内保持不变.在应用程序的持续时间内,没有其他对象可以具有相同的标识符.
当然,我可以使用System.Guid,但每个对象需要128位存储空间,而且我希望消耗更少的资源.我尝试使用Int32并使用System.Environment.TickCount属性对其进行初始化,但是我得不到足够的分辨率,并且某些对象最终会分配相同的值.
TickCounter的文档说,TickCount属性将在~29之后滚动到负值,然后在另外29天内回到零.随着时间的推移,我会很乐意交换更多的分辨率.
我还有其他我不了解的选择吗?
我正在使用命令perf record来记录性能计数器frm linux。
我想将结果perf.data用作其他编程应用程序的输入。您知道如何读取和解析其中的数据perf.data吗?有没有办法将其转换为.text文件或.csv?
我试图找出为什么某些性能计数器没有在我们的生产服务器中更新,当我遇到这个奇怪的问题时 - 计数器似乎在RawValue不是只读时返回不同的值.只读时它始终为零,当不是只读时,它显示不同的值.
这是我的PowerShell会话显示:
PS C:\Users\doron> $counter = new-object Diagnostics.PerformanceCounter
PS C:\Users\doron> $counter.CategoryName = "My category"
PS C:\Users\doron> $counter.CounterName = "My counter name"
PS C:\Users\doron> $counter.ReadOnly = 1
PS C:\Users\doron> $counter
CategoryName : My category
CounterHelp : My counter name
CounterName : My counter name
CounterType : NumberOfItems64
InstanceLifetime : Global
InstanceName :
ReadOnly : True
MachineName : .
RawValue : 0
Site :
Container :
PS C:\Users\doron> $counter.ReadOnly = 0
PS C:\Users\doron> $counter
CategoryName : My category …Run Code Online (Sandbox Code Playgroud) 我有一个非常简单的问题,我认为以前已经回答过,但是我只是找不到与我要寻找的内容完全相同且简单的参考。
我有一个控制台实用程序应用程序,该应用程序根据每个输入参数获取每个Web应用程序或Windows服务的性能计数器列表。
我的简单问题是:应该使用NextValue读取哪些计数器,使用RawValue读取哪些计数器?
由于我的实用程序需要快速运行(不到2秒),因此我想高效地读取每个计数器。例如,我知道必须通过NextValue读取Process /%Processor Time,而可以通过RawValue读取Process / Working Set。
我试图让我的应用程序根据PerfCounterType(NumberItems32,CounterXXX等)来决定,该方法可以正常工作,但是我只需要有关如何读取它们的确切简单直接信息。
我的早期结论似乎是必须通过NextValue读取所有内容,以提高准确性,但是由于经验是某些人可以执行RawValue,因此最好通过第二次读取并避免需要1秒钟的睡眠。
这是潜在的计数器列表,我获得了Type:
# Bytes in all Heaps = NumberOfItems32
# Gen 0 Collections = NumberOfItems32
# Gen 1 Collections = NumberOfItems32
# Gen 2 Collections = NumberOfItems32
# Induced GC = NumberOfItems32
# of current logical Threads = NumberOfItems32
# of current physical Threads = NumberOfItems32
# of Exceps Thrown / sec = RateOfCountsPerSecond32
# of Exceps Thrown = NumberOfItems32
# of marshalling = NumberOfItems32
# of Sink Blocks in …Run Code Online (Sandbox Code Playgroud) 我只是想获得与任务管理器匹配的准确CPU使用率.到目前为止,我已经尝试了四种不起作用的推荐方法.
首先,我尝试了类似的解决方案或建议,我可以找到.这里的代码示例使用四种方法,所有方法都不准确.其次,我知道任务管理器会波动并取决于它何时被采样.这仍然没有考虑到差异.最后,我知道有不同的方法,任务管理器只使用一种方法.由于这适用于一般用户,因此需要靠近任务管理器.
public partial class MainWindow : Window
{
//*** Method 1 & 2
PerformanceCounter cpuCounterPi = new PerformanceCounter("Processor Information", "% Processor Time", "_Total");
PerformanceCounter cpuCounterP = new PerformanceCounter("Processor", "% Processor Time", "_Total");
//*** method 3
ManagementObjectSearcher query1 = new ManagementObjectSearcher("select loadpercentage from win32_processor");
//*** Mixed method usage below
CounterSample csPi1, csPi2, csP1, csP2;
double cpuPercentagePi, cpuPercentageP, cpuPercentageLoad;
int count = -1;
Boolean alternate = false;
System.Windows.Threading.DispatcherTimer dispatcherTimer = new System.Windows.Threading.DispatcherTimer();
public MainWindow()
{
InitializeComponent();
dispatcherTimer.Tick += new EventHandler(dispatcherTimer_Tick);
dispatcherTimer.Interval …Run Code Online (Sandbox Code Playgroud) c# ×5
.net ×3
asp.net ×2
windows ×2
appdomain ×1
c++ ×1
cpu-usage ×1
linux ×1
logging ×1
parsing ×1
perfmon ×1
performance ×1
powershell ×1
profiling ×1
visual-c++ ×1