广交好友~~ 想要讨论的可以留下msn~~~ 希望群友网友经常能提出问题,一起解决,共同提高

程序性能问题定位方法 ~~ 性能测试进级

上一篇 / 下一篇  2010-12-13 16:43:27 / 个人分类:LR/Jmeter 大类


首先声明,这个解决方法不是我想出的,是我从一个高手那边学来的。

性能问题时常会困扰着程序员们,像我这样刚入道没多久的新手,写出的代码有这样那样的问题是常事,性能问题最让人头痛。

在程序上线运行之后,如果没有适当的手段辅助,我们很难知道程序内部的运行状态,如果出现性能问题,除非是特定操作下必然重现,否则定位起来是非常困难。最近就在协助解决一个性能问题,问题如下:

我们的一个服务器,在上线之后,一直还算稳定,但最近海外用户增多,在每天下午4点左右,系统开始异常,操作起来响应很慢。现象就是这么个现象,开始一头雾水,一点头绪都没有。于是几个人把代码找出来,一直走读,搞了很久,找出几个可疑的地方,但结合场景,又觉得矛盾。困惑啊。

这时,高手出现了。一句话,让我们无语又不得不佩服:没有系统运行的统计数据做支撑光靠猜是没有用的

我们系统运行中的关键路径上都需要加上必要的计数器,但计数器又不能影响系统运行的性能,因此,这个计数器的实现要有点技巧。

一般来说,服务器都是通过多线程实现的,这里就涉及到多线程并发修改计数器的问题。一般来说,涉及到并发修改某一数据时,我们都是通过加锁来实现的,这样实现显然会影响到系统性能的,而且如果有很多计数器,则对系统的影响是显而易见的。

我们可以换一个角度来看:我们加计数器的目的是要得到系统运行的大概情况,而不是做精确的统计,所以这个数据有点偏差对我们分析系统的运行情况不会有影响。所以我们的计数器的实现如下:

在系统构造时,我们初始化一个全局的Map<Thread, int[]>Thread可以是其它的能唯一标识一个线程的东西,这个可以结合具体的实现来定义,同时我们为每一个线程分配一个计数器,同时,在分配计数器的同时,将线程加入到Map中,在统计时,遍历MapValues,将每个线程的计数器的值相加,则得到了一个总的计数器的值,这个值就是我们所要东西。

有了这个统计值,我们就可以了解系统的运行情况,也可以很容易找出系统的性能瓶颈。

哈哈,很多东西说白了就这么简单。

这次有点晚了,下次有时间给出Java高性能计数器的程序实现。


TAG:

 

评分:0

我来说两句

Open Toolbar