使用性能计数器检测应用程序的性能!

 1. 创建一个简单的web service,这个演示程序就是把客户端对web service中的两个webmethod总访问量,每秒访问量,总出错次数,每秒出错次数以及调用延迟的情况在性能计数器中显示出来,web service中的代码相当简单,事实上基本上看不到延迟的存在,这也只是为了演示用。
 1using System;
 2using System.Web;
 3using System.Web.Services;
 4using System.Web.Services.Protocols;
 5
 6[WebService(Namespace = "http://tempuri.org/")]
 7[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
 8public class Service : System.Web.Services.WebService
 9{
10    public Service () {
11
12        //Uncomment the following line if using designed components 
13        //InitializeComponent(); 
14    }

15
16    [WebMethod]
17    public string SayHelloTo(string someBody) {
18        return "Hello "+someBody;
19    }

20    [WebMethod]
21    public string SayWelcomeTo(string someBody)
22    {
23        return "Welcome, " + someBody;
24    }

25    
26}

27

2.   创建性能计数器,这里用一个简单的cs文件替代了installer文件,只需用csc命令讲下面的代码编译成exe文件,然后运行exe文件就可以在系统中创建自己的性能计数器。注意:我们并不需要做总访问次数和时间的除法运算来得到每秒的访问次数,PerformanceCounterType枚举类型专门负责这个,详细的信息请查阅msdn.
 1using System;
 2using System.Diagnostics;
 3
 4namespace ZZQ.Net.Demo
 5{
 6    public class Installer
 7    {
 8
 9        public static void Main()
10        {
11            try
12            {
13                if (PerformanceCounterCategory.Exists("MyPerfCategory"))
14                {
15                    PerformanceCounterCategory.Delete("MyPerfCategory");
16                }

17
18               
19                CounterCreationDataCollection counterDatas = new CounterCreationDataCollection();
20
21                counterDatas.Add(new CounterCreationData("calls total""number of service calls",
22                    PerformanceCounterType.NumberOfItems64));
23                counterDatas.Add(new CounterCreationData("calls / sec""number of service calls per second.",
24                    PerformanceCounterType.RateOfCountsPerSecond64));
25                counterDatas.Add(new CounterCreationData("errors total",
26                    "number of errors returned form service to the client.",
27                    PerformanceCounterType.NumberOfItems64));
28                counterDatas.Add(new CounterCreationData("errors / sec",
29                    "number of errors returned form service to the client per second.",
30                    PerformanceCounterType.RateOfCountsPerSecond64));
31                counterDatas.Add(new CounterCreationData("average processing time",
32                    "average call processing time in milliseconds.",
33                    PerformanceCounterType.AverageCount64));
34                counterDatas.Add(new CounterCreationData("average processing time base""",
35                    PerformanceCounterType.AverageBase));
36                counterDatas.Add(new CounterCreationData("Processing time latency",
37                    "Processing time in milliseconds.",
38                    PerformanceCounterType.NumberOfItems32));
39
40                PerformanceCounterCategory.Create("MyPerfCategory""It is just for demonstration purpose!", PerformanceCounterCategoryType.MultiInstance, counterDatas);
41
42
43            }

44            catch (Exception ex)
45            {
46                Console.WriteLine("Error occurred: " + ex.ToString());
47            }

48            Console.ReadLine();
49        }

50    }

51}

52

3.客户端的代码使用两个timertick事件中生成的随机数做循环调用模拟当前的访问量,并且在每次调用的时候更新计数器,代码很简单。
 1using System;
 2using System.Collections.Generic;
 3using System.ComponentModel;
 4using System.Data;
 5using System.Drawing;
 6using System.Text;
 7using System.Windows.Forms;
 8using PerformanceCounterDemo.localhost;
 9using ZZQ.Net.Demo;
10
11
12namespace PerformanceCounterDemo
13{
14    public partial class Demo : Form
15    {
16       
17        public Demo()
18        {
19            InitializeComponent();
20        }

21
22        private void btnHello_Click(object sender, EventArgs e)
23        {
24            timer1.Enabled = true;
25        }

26
27
28
29        private void btnWelcome_Click(object sender, EventArgs e)
30        {
31            timer2.Enabled = true;
32        }

33
34        private void btnStop_Click(object sender, EventArgs e)
35        {
36
37            timer1.Enabled = false;
38            timer2.Enabled = false;
39        }

40        private void timer1_Tick(object sender, EventArgs e)
41        {
42            Random r = new Random();
43            int counter = r.Next(30);
44            CallHello(counter);
45
46        }

47
48        private void timer2_Tick(object sender, EventArgs e)
49        {
50            Random r = new Random();
51            int counter = r.Next(30);
52            CallWelcome(counter);
53        }

54
55
56        private void CallHello(int counter)
57        {
58            Service s = new Service();
59            string strResult = string.Empty;
60            for (int i = 0; i < counter; i++)
61            {
62                DateTime start = DateTime.Now;
63                strResult += "The " + i.ToString() + " time,return value is " + s.SayHelloTo("zzq" + i.ToString()) + "\r\n";
64                txtHello.Text = strResult;
65               TimeSpan span = DateTime.Now.Subtract(start);
66               PensPerfCounterManager.UpdatePerfCounters("MyPerfCategory""SayHelloTo", span, true);
67             
68            }

69        }

70        private void CallWelcome(int counter)
71        {
72            Service s = new Service();
73            string strResult = string.Empty;
74
75            for (int i = 0; i < counter; i++)
76            {
77                DateTime start = DateTime.Now;
78                strResult += "The " + i.ToString() + " time,return value is " + s.SayHelloTo("zzq" + i.ToString()) + "\r\n";
79                txtWelcome.Text = strResult;
80                PensPerfCounterManager.UpdatePerfCounters("MyPerfCategory""SayWelcomeTo", start, true);
81            }

82        }

83   
84    }

85}

我的代码中UpdatePerfCounters方法的最后一个参数总是传的true,因为这两个web method太简单了,基本不会出错。^_^。实际用的时候会针对是否出现异常来决定是否更新和错误相关的计数器。

4.运行客户端的程序然后在运行里键入perfmon打开性能计数器管理窗口,找到MyPerfCategory性能对象,并且添加所有所有计数器的所有实例。
客户端演示效果图:


性能计数器效果图:

posted on 2007-04-12 22:54 zhanqiangz(闲云野鹤) 阅读(2545) 评论(6)  编辑 收藏 所属分类: ASP.NET2.0CSharpWebService

评论

#1楼  2007-04-12 23:39 命运有自己的梦!      

嗯,太好了,大家都开始关注测试方面的东西了!   回复  引用  查看    

#2楼  2007-04-13 01:10 臭石头      

谁能教教我怎么用性能计数器呀   回复  引用  查看    

#3楼  2007-04-13 01:29 igfire [未注册用户]

trade.igfire.com是一个全新的交易平台,它可以让供货商们把自己的虚拟产品直接出售到国外玩家的手里或直接联系国外的收购商,让利润翻上几翻.让这个梦想由我们来给您实现!
同样,收货商们也可以多一个平台来做好自己的销售.

我们看不懂英文,如何和老外交易?
相信很多人都会提出这样的问题,不用担心,这在我们网站完全不是问题.我们有优秀的客服团队在时刻为您服务,您只要每个月支付RMB 500就可以享受到贵宾的待遇,专业的服务.我们的客服对您的交易全程跟踪,让您与老外的交流没有障碍.生意越做越红火!

我们没有paypal,怎么收美金?

Paypal注册的全过程在我们网站上有详细的中文注解,你可以很轻松的注册成功!同时paypal对中国推出了中文界面,只要重设语言,您立即可以轻松使用他的一切功能!
paypal也推出了电汇美金(手续费20$一次)到国内银行的业务,如果你拥有香港银行,无须电汇就能可以把美金转入银行.

心动了吗?那么就赶快来体验一线卖家的精彩吧~~~
www.igfire.com/AutoAssault www.igfire.com/Auto_Assault_scrip
www.igfire.com/City_Of_Villains www.igfire.com/COV_infamy
www.igfire.com/D&D_online www.igfire.com/DDO_platinum
www.igfire.com/Dark_and_Light
www.igfire.com/Eve_online   回复  引用  查看    

#4楼  2007-04-13 09:06 jillzhang      

csdn上的闲云野鹤是你么?   回复  引用  查看    

#5楼  2007-04-13 09:55 zhanqiangz(闲云野鹤) [未注册用户]

@jillzhang
如果你指的是叫zhanqiangz的那个就应该是我了.^_^!   回复  引用  查看    

#6楼  2007-04-14 07:20 a11s.net      

学到一手。

顺便问一下,怎么自己做msc控制台程序。
就是微软iis sql server activedirectory的管理器,比如myMSC,可以让mmc自己添加myMSC的管理项目   回复  引用  查看    


标题  
姓名  
主页
Email (只有博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2007-04-12 22:57 编辑过
 
另存  打印
最新IT新闻:
· 万名Linux使用者向暴雪请愿Linux版《Diablo III》
· 56.com我乐网将全面转行 退出视频行业
· Joost借道TOM在线 将正式进军中国
· 微软副总裁公开承认Vista存在问题
· 互联网DNS存在重大漏洞 黑客可能控制网络流量
 


<2007年4月>
25262728293031
1234567
891011121314
15161718192021
22232425262728
293012345

导航

统计

公告

如转载本博客的相关资料敬请注明出处.谢谢合作!

与我联系

常用链接

留言簿(6)

我参与的团队

我的标签

随笔分类(51)

随笔档案(49)

文章分类(7)

文章档案(5)

收藏夹(3)

.NET

BizTalk

Design

JavaScript

My Blogs

Power Tools

Process Control