DIY性能监视器

  做需要频繁处理大数据量的应用程序时对性能非常敏感,最直观的两个指标就是CPU占用率和内存使用量了。最简单的监控方法当然是打开系统自带的任务管理器,不过要在一排进程列表中找到自己感兴趣的一个或者几个进程,似乎不是很方便。比较专业一点的方法是使用系统管理工具里面的性能监视器,常用的、不常用的各种指标都能够在这里找到并且绘制出性能曲线来。不过,我不敢保证所有客户都能够或者愿意来进行设置,能够有一个性能监视整合到软件当中,是一个不错的方法。
  还是去MSDN中查询,很快在Platform SDK文档中找到有专门的一个章节Performance Monitoring,剩下的事情就是仔细研读了。
  (说句题外话,在微软的平台上作开发,阅读MSDN远远比在论坛中发问有用多了)
  性能监控与计数主要有两种手段,一种是直接利用PDH函数,另外一种就是访问注册表。通过比较,我觉得只要基本熟悉一些系统定义好的结构,直接调用API比后者曲线救国要方便直观一些。基本流程可以归纳成下面几步:
  PdhOpenQuery
  创建一个查询:参数是一个句柄指针
  PdhAddCounter
  添加一个计数器,参数包括前面的句柄,而且需要传递一个对计数器的描述字符串,比如需要监控某个进程的CPU占用率时的字符串如下:
  Process(%s)% Processor Time %s是进程名
  需要监控某个进程的内存使用情况,字符串如下:
  Process(%s)Working Set %s是进程名
  成功添加计数器后就可以开始查询了,分别调用
  PdhCollectQueryData
  PdhGetFormattedCounterValue
  前者收集查询数据,后者把数据按照制定格式填充到一个系统定义结构当中,最后访问这个结构就可以获得我们关心的性能指标了。如果查询失败,返回值将会是-1。
  原理清楚了,就可以将这个流程封装起来成为一个类,放在一个独立的线程当中通过定时器定期查询一下软件的各项性能指标,以消息的形式抛给主界面所在线程以图表方式显示出来或者做其他处理都可以。
  补充一下:系统中提供的指标还有很多很多,我们可以看看管理工具中的性能监视器,性能监视器中的指标名是什么,基本上也就知道添加计数器的时候的描述字符串是什么了。
  1. Leave a comment

Leave a comment