性能计数器 NextValue() 非常慢(1,000+ 计数器)

2024-01-01

在我们的应用程序中,我们使用 Windows 性能计数器来存储一些应用程序指标,稍后在某些 Web 服务中检索这些指标。

我对从计数器读取值所需的时间有疑问。我已经查看了应用程序的其余部分,一切都很好,性能方面,但是从循环内的计数器(从列表或数组)读取需要花费大量时间。

示例代码:

// This triggers a read of the counter's initial value (1000ms delay following for calculated counters)
counters.ToList().ForEach(counter => counter.NextValue());

在我对上面的循环进行的测试中,1,359 个计数器的列表需要 20 秒,并且使用秒表,读取计数器值的平均时间似乎是 0-10 毫秒,或大约 80-90 毫秒。其中很多需要 0ms,最高约为 170ms,平均非零约为 80-90ms。

也许我太乐观了,但我认为读取 1,000 个数值应该只需要几毫秒。这里正在进行的处理是否比我意识到的要多?

实际上,我稍后在逻辑中还有另一个循环,它获取计算计数器的第二个值。这只会让事情变得更加糟糕。 :)

Thanks!


Update 1

我将计数器检索包裹在秒表中,结果令我感到惊讶。即使是简单的属性也可以读取.RawValue仍然需要过多的时间。据我了解,计数器的工作原理基本相同,并且检索速度应该非常快;奇怪的是,我还发现了一种模式,即网络类别的计数器需要更长的时间。

根据http://joe.blog.freemansoft.com/2014/03/windows-performance-counters.html http://joe.blog.freemansoft.com/2014/03/windows-performance-counters.html,性能计数器服务的性能甚至不应该成为考虑因素。

我已将一些秒表结果发布到以下粘贴箱:http://pastebin.com/raw.php?i=aDJk2Tru http://pastebin.com/raw.php?i=aDJk2Tru

我的代码如下:

Stopwatch t;
foreach (var c in counters)
{
    t = Stopwatch.StartNew();
    var r = c.RawValue;
    Debug.WriteLine(t.ElapsedMilliseconds.ToString("000") + " - " + c.CategoryName + ":" + c.CounterName + "(" + c.CounterType + ") = " + r);
}

正如你在粘贴中看到的,很多读取都是 0,但也有很多在 50-100ms 范围内。我真的不明白怎么会这样。当然,一个计数器值应该与其他计数器值一样快,对吧?


这是我能找到的有关柜台的信息。请原谅语法;这是从我发出的有关此问题的电子邮件中摘录的。

  • 从计数器类别读取实例名称至少需要 4-5 秒的处理时间(在服务器上可能更好或更差,不确定)。这与类别中的计数器数量的变化可以忽略不计。如果您不使用实例计数器,则可以避免这种情况。
  • We store all of the counters in a single category, so it’s inevitable that category will eventually end up with thousands of counters, given our situation. In my testing, the more counters in a category, the worse the performance. This seems like it should make sense, but the performance of an individual counter is affected by the number of counters currently in memory, which is an odd correlation, maybe:
    • 总共有 8 个计数器,每个计数器的读取时间约为 1-2ms
    • 总共有 256 个计数器,每个计数器的读取时间约为 15-18ms
    • 共有 512 个计数器,每个计数器的读取时间约为 30ms
    • 总共有 3,584 个计数器(读取所有计数器),每个计数器的读取时间约为 200ms
    • 系统中有 3,584 个计数器(在内存中过滤,仅读取 512 个计数器),每个计数器的读取时间为 50-90 毫秒。不知道为什么这些比前一批 512 计数器慢。
    • 我使用以下命令运行了这些测试几次System.Diagnostics.Stopwatch给他们计时。
  • 值得注意的是,计数器必须读取两次,因为许多计数器是在一段时间内计算的,并呈现开始和结束读取时间之间的平均值,因此这些坏数字在现实场景中会变得更糟。

根据上面的数字,在我的机器上,较慢的一端有 512 个计数器,每个计数器大约 50 毫秒,加上实例查询和第二个计数器读取,我们看到每个请求大约需要 60 秒。这是因为我们一次只使用 512 个计数器。我已对我的计算机上的服务运行完整查询多次,并且请求始终在 60-65 秒内完成。

我当然不会根据正在评估的其他计数器的数量来假设单个计数器的这种类型的性能下降。根据我的理解,Windows 性能监视器系统应该很快,对于小型集合来说确实如此。我们的用例可能不适合,并且我们可能正在滥用系统。

Update

鉴于我们可以控制如何创建计数器,我们决定稍微改变我们的方法。我们不是创建具有许多计数器的几个类别,而是创建许多类别,每个类别具有较少的计数器(每个类别 4-8 个计数器)。这种方法使我们能够有效避免性能问题,并且计数器读取时间在0-1ms范围内。根据我们迄今为止的经验,即使有 100 个新类别,每个类别有几个计数器,也根本不会影响系统的性能。

需要注意的是,在处理大量附加计数器时,您需要解决性能计数器默认设置的内存限制。这可以通过 machine.config 或注册表项来完成。更多信息可以在这里找到:http://msdn.microsoft.com/en-us/library/ms229387(v=vs.110).aspx http://msdn.microsoft.com/en-us/library/ms229387(v=vs.110).aspx

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

性能计数器 NextValue() 非常慢(1,000+ 计数器) 的相关文章

  • 将字节数组转换为托管结构

    更新 这个问题的答案帮助我编写了开源项目GitHub 上的 AlicanC 现代战争 2 工具 https github com AlicanC AlicanC s Modern Warfare 2 Tool 你可以看到我是如何阅读这些数据
  • System.IO.IOException:由于意外>数据包格式,握手失败?

    有谁知道这意味着什么 System Net WebException 底层连接已关闭 发送时发生意外错误 gt System IO IOException 由于意外 握手失败 数据包格式 在 System Net Security SslS
  • 如何使用MySqlCommand和prepare语句进行多行插入?(#C)

    Mysql 给出了如何使用准备语句和 NET 插入行的示例 http dev mysql com doc refman 5 5 en connector net programming prepared html http dev mysq
  • 将字符串转换为正确的 URI 格式?

    有没有简单的方法可以将电子邮件地址字符串转换为正确的 URI 格式 Input http mywebsite com validate email 3DE4ED727750215D957F8A1E4B117C38E7250C33 email
  • 如何生成 appsettings..json 文件?

    我有一个 ASP NET Core 2 WebAPI 它将部署在以下环境中 INT QA STAGE 生产环境 基于上述 我需要有appsettings
  • 劫持系统调用

    我正在编写一个内核模块 我需要劫持 包装一些系统调用 我正在暴力破解 sys call table 地址 并使用 cr0 来禁用 启用页面保护 到目前为止一切顺利 一旦完成 我将公开整个代码 因此如果有人愿意 我可以更新这个问题 无论如何
  • 对 boost 库的依赖项没有完整路径

    我已经成功构建了动态库 依赖于使用自定义前缀构建和安装的 boost 库 b2 install prefix PREFIX 然而 当我跑步时otool L在我的库中 我得到如下输出 libboost regex dylib compatib
  • 无法解析远程名称 - webclient

    我面临这个错误 The remote name could not be resolved russgates85 001 site1 smarterasp net 当我请求使用 Web 客户端读取 html 内容时 出现错误 下面是我的代
  • TcpClient 在异步读取期间断开连接

    我有几个关于完成 tcp 连接的问题 客户端使用 Tcp 连接到我的服务器 在接受客户端后listener BeginAcceptTcpClient ConnectionEstabilishedCallback null 我开始阅读netw
  • 两种类型的回发事件

    1 我发现了两篇文章 每篇文章对两种类型的回发事件的分类都略有不同 一位资源说两种类型的回发事件是Changed事件 其中控件实现 IPostbackDataHandler 当数据在回发之间更改时触发 然后Raised事件 其中控件实现 I
  • 从成员函数指针类型生成函子

    我正在尝试简化 通过make fn 预处理参数的函子的生成 通过wrap 对于 arity 的成员函数n 生成函子基本上可以工作 但到目前为止只能通过显式指定成员函数的参数类型来实现 现在我想从它处理的成员函数类型生成正确的函子 struc
  • 为什么 clang 使用 -O0 生成低效的 asm(对于这个简单的浮点和)?

    我正在 llvm clang Apple LLVM 版本 8 0 0 clang 800 0 42 1 上反汇编此代码 int main float a 0 151234 float b 0 2 float c a b printf f c
  • libxml2 xmlChar * 到 std::wstring

    libxml2似乎将所有字符串存储在 UTF 8 中 如xmlChar xmlChar This is a basic byte in an UTF 8 encoded string It s unsigned allowing to pi
  • C++ 错误 - “成员初始值设定项表达式列表被视为复合表达式”

    我收到一个我不熟悉的 C 编译器错误 可能是一个非常愚蠢的错误 但我不能完全指出它 Error test cpp 27 error member initializer expression list treated as compound
  • 使用 iTextSharp 5.3.3 和 USB 令牌签署 PDF

    我是 iTextSharp 和 StackOverFlow 的新手 我正在尝试使用外部 USB 令牌在 C 中签署 PDF 我尝试使用从互联网上挖掘的以下代码 Org BouncyCastle X509 X509CertificatePar
  • C语言声明数组没有初始大小

    编写一个程序来操纵温度详细信息 如下所示 输入要计算的天数 主功能 输入摄氏度温度 输入功能 将温度从摄氏度转换为华氏度 独立功能 查找华氏度的平均温度 我怎样才能在没有数组初始大小的情况下制作这个程序 include
  • 受限 AppDomain 中的代码访问安全异常

    Goal 我需要在权限非常有限的 AppDomain 中运行一些代码 它不应该访问任何花哨或不安全的内容 except对于我在其他地方定义的一些辅助方法 我做了什么 我正在创建一个具有所需基本权限的沙箱 AppDomain 并创建一个运行代
  • 在 Xamarin 中获取 OutOfMemoryException

    java lang OutOfMemoryError 考虑增加 JavaMaximumHeapSize Java 执行时内存不足 java exe 我的 Visualstudio Xamarin 项目出现内存不足异常 请帮助我如何解决此问题
  • 以 UTF8 而不是 UTF16 输出 DataTable XML

    我有一个 DataTable 我正在使用 WriteXML 创建一个 XML 文件 尽管我在以 UTF 16 编码导出它时遇到问题 并且似乎没有明显的方法来更改它 我了解 NET 在字符串内部使用 UTF 16 这是正确的吗 然后 我通过
  • 服务器响应 PASV 命令返回的地址与建立 FTP 连接的地址不同

    System Net WebException 服务器响应 PASV 命令返回的地址与建立 FTP 连接的地址不同 在 System Net FtpWebRequest CheckError 在 System Net FtpWebReque

随机推荐

  • 比较两个分数(< 和朋友)

    我有两个我喜欢比较的分数 它们的存储方式如下 struct fraction int64 t numerator int64 t denominator 目前 我这样比较它们 bool fraction le struct fraction
  • Pyspark dataframes:根据另一列的值提取一列

    我有一个包含以下列和相应值的数据框 请原谅我的格式 但不知道如何将其放入表格格式 Src ip dst ip V1 V2 V3 top A B xx yy zz V1 现在我想添加一列 比如说top value它获取与 V1 中的字符串对应
  • 具有 http PUT 方法约束的属性路由

    我正在使用 MVC5 的新属性路由并已获取 httpGET and POST方法约束通过添加来工作 HttpGet and HttpPost 归因于我的行动方法 但是当我添加 HttpPut 我刚刚收到 404 错误页面 有谁知道我需要做什
  • VB6 和 VBA 的替代 IDE [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我已经被 Visual Studio 2008 宠坏了Eclipse https en wikipedi
  • 如何找到覆盖另一个矩形的矩形面积

    我有一个点 xmin ymin xmax ymax 列表 如黑点所示 How to find which are the rectangles that are being covered by another rectangle and
  • 如何在flutter中获取firestore文档的documentid?

    我已尝试以下操作 但它返回一个随机字符串 该字符串不存在于 firestore 中 我确实设法使用查询快照获取父集合的 documentid DocumentReference doc ref Firestore instance coll
  • MSTest 代码覆盖率

    我有一个 Web 服务的测试项目 当我在调试模式下运行测试时 一切正常 但是 当我刚刚运行测试时 对于我尝试获取代码覆盖率的引用程序集 出现以下错误 类初始化方法 WebServiceTest wstest MyClassInitializ
  • NodeJs 文件上传期间停止请求

    我正在编写一个图像上传器 我想将图像的大小限制在 3mb 以下 在服务器端 我可以检查标题中图像的大小 如下所示 使用express app post upload function req res if req headers conte
  • 多线程环境下静态局部变量初始化

    假设有一个函数 可能是成员函数 SomeType foo static SomeType var generateVar return var How var将被初始化 如果foo会同时从多个线程中 第一次 调用吗 是否保证generate
  • ndk-build eclipse 参数:找不到类

    我们正在为 Android 设备开发一个系统 为此 我们使用 FC16 Eclipse SDK NDK 在 Eclipse 中 运行 gt 外部工具 gt 外部收费配置 gt 我们有以下选项卡 Main Location usr java
  • IntelliJ IDEA 在哪里保存本地历史文件?

    我的公司有一项政策 要求在本地开发人员计算机上将源代码保存在加密存储中 IntelliJ IDEA 在哪里保存用于驱动其的代码更改的副本当地历史特色 http www jetbrains com idea features local hi
  • 构建失败 java.lang.OutOfMemoryError: Java 堆空间

    我在构建 build xml 时遇到这个问题 BUILD FAILED java lang OutOfMemoryError Java heap space at java util Arrays copyOf Arrays java 27
  • 捕获模块加载错误并处理它们

    我正在尝试使用 require js 加载一些内容 如果内容不存在 我想捕获错误并通知用户 在萤火虫中我可以看到两个错误 网络错误 404 未找到 然后几秒钟后 var e new Error msg nhttp requirejs org
  • AbstractRoutingDataSource + JPA 不会创建除 defaultTargetDataSource 之外的表

    我使用 JPA 注释 Hibernate 实现 来初始化我的数据库架构 我关注这篇文章动态数据源路由 http blog springsource com 2007 01 23 dynamic datasource routing 实现动态
  • For 循环中的 onClick 事件

    我尝试创建一个循环for 并通过 onclick 事件递增 但它不起作用 var gameCase 9 itemLists game getElementsByTagName li 9 items for var i 0 i lt item
  • 当默认异常处理建议已被另一个建议处理时,如何忽略它

    我目前有一个 ExceptionAdvice 类 它处理所有基本 400 405 404 和其他 异常 例如 我有一个默认建议 它处理所有 MethodArgumentNotValidExceptions 并返回 400 Bad Reque
  • For循环删除行

    我使用的宏列出了我选择的任何目录中的所有文件名 我正在编写代码 将文件名分解为稍后可以使用的块 文件名列表从单元格 F6 开始并沿列向下延伸 这是我到目前为止编写的代码 Dim ContractNum As String Dim InvNu
  • 客户端机器上的hadoop api配置

    超级菜鸟 我有一台带有 cdh3u1 伪发行版的服务器计算机 以及一台带有使用 cdh3u1 API 的 java 应用程序的客户端计算机 如何配置客户端与服务器通信 我已经搜索了几个小时 但找不到 客户端配置 文件在哪里 对我来说 hdf
  • 如何阻止创建 .mdmp 文件

    我有一个由 Tomcat 托管的 Solr 实例 最近开始创建小型转储文件 任何日志中都没有错误 Solr 继续顺利工作 这些文件大约有 14GB 正在填满硬盘 在我们调查问题时 有没有办法关闭此功能 一般来说 当JVM崩溃时的内容hs e
  • 性能计数器 NextValue() 非常慢(1,000+ 计数器)

    在我们的应用程序中 我们使用 Windows 性能计数器来存储一些应用程序指标 稍后在某些 Web 服务中检索这些指标 我对从计数器读取值所需的时间有疑问 我已经查看了应用程序的其余部分 一切都很好 性能方面 但是从循环内的计数器 从列表或