以编程方式在Windows上读取程序的页面错误计数

时间:2011-06-20 18:57:29

标签: windows winapi etw

我希望我的Windows C ++程序能够读取它造成的硬页面错误的数量。该程序未以管理员身份运行。 编辑添加:要清楚,我对整个系统的聚合页面错误计数不感兴趣。

看起来ETW可能会为此导出计数器,但我在查找API方面遇到了很多困难,而且与管理员相比,普通用户无法理解这一点。

有没有人有这种功能的例子?或者它在Windows上根本不可能?

(OT,但是这对* nix?gerusage()有多容易,并且你已经完成了。)

6 个答案:

答案 0 :(得分:4)

afai可以告诉我们这样做的唯一方法是使用ETW(Windows事件跟踪)来监控内核硬页面错误。事件有效负载具有一个线程ID,您可以将其与现有进程相关联(这将是非平凡的btw)以生成每个进程的运行计数。我没有看到任何方法来获取每个流程的历史信息。

我可以保证这是一个难题,因为Process Explorer在每个进程的显示中仅支持Page Faults(软或硬)。

http://msdn.microsoft.com/en-us/magazine/ee412263.aspx

  

寻找时发生页面错误   页表条目无效。如果   请求页面需要引入   从磁盘,它被称为硬页面   故障(非常昂贵的操作),   并考虑所有其他类型   软页面错误(更便宜   操作)。页面错误事件有效内容   包含虚拟内存地址   发生页面错误的   导致的指令指针   它。硬页面错误需要磁盘   访问发生,可能是   首先访问文件中的内容或   访问内存块   分页。启用页面错误事件   导致记录硬页面错误   作为硬页面类型的页面错误   故障。但是,通常是一个硬故障   对...有相当大的影响   表现,所以一个单独的事件是   仅适用于硬故障   可以独立启用。一个坚硬的   故障事件有效负载有更多数据,   例如文件密钥,偏移量和线程   ID,与Page Fault事件相比。

答案 1 :(得分:2)

我认为您可以使用GetProcessMemoryInfo() - 有关详细信息,请参阅http://msdn.microsoft.com/en-us/library/ms683219(v=vs.85).aspx

答案 2 :(得分:1)

是的,非常难过。或者你可能不会认为Windows是如此的傻到它甚至不提供页面错误计数器并查找它:Win32_PerfFormattedData_PerfOS_Memory

答案 3 :(得分:1)

这是在Windows中使用performance counters完成的。我已经有一段时间了,因为我已经用它们做了什么。我不记得你是否需要以管理员身份运行才能查询它们。

[编辑] 我没有提供示例代码,但根据this page,您可以获取特定流程的此信息:

  

处理:页面错误/秒。这是个   页数的指示   由于请求而发生的故障   从这个特殊的过程。   来自a的页面错误过多   特定的过程是一个迹象   通常是糟糕的编码习惯。   函数和DLL都不是   正确组织,或数据集   应用程序正在使用   称之为效率不高   方式。

答案 4 :(得分:1)

Microsoft网站上有一个C / C ++示例,解释了如何阅读性能计数器:INFO: PDH Sample Code to Enumerate Performance Counters and Instances

你可以复制/粘贴它,我认为你对“Memory”/“Page Reads / sec”计数器很感兴趣,正如这篇有趣的文章所述:The Basics of Page Faults

答案 5 :(得分:0)

我认为您不需要管理凭据来枚举性能计数器。 codeproject Performance Counters Enumerator

上的示例