[Miles' Blog]

Welcome 2 My Planet

Available categories: [/] [working on downwap.] [trouble shooting] [working on Yup Mailman]

通过JMX监控Tomcat/Weblogic|Weblogic/Tomcat/JMX/Monitoring [Permalink]

Thu May 29 00:08:00 CST 2008
Category [development. ~]

接上篇:wlsmon程序升级为了gui_servmon。主要更新在两个方面:

  • 数据采集上,搞定了tomcat的JMX监控问题。通过打开标准的Java JMX端口,就可以访问到Tomcat注册的MBean,从而获取Tomcat的运行数据,如ThreadPool这个Bean的BusyThreadCount属性;
  • 在界面上进行了优化,加入了淡入淡出效果,以便突出显示重点(最近20s情况);此外还监听了图例icon的Mouse Event和Key Event,单击icon或使用快捷键(1-9)时仅显示指定数据源的数据,以便对问题数据源进行更清晰的监控。
不废话了,上图:

图1:fade-out效果


图2:突出显示效果

如图,在进行突出显示的时候,会自动关闭fade-out效果。

应该说比上次有了不少进步,尤其是在看不到的代码扩展性方面。

主要参考资料:
http://tomcat.apache.org/tomcat-6.0-doc/monitoring.html

Posted by: miles
Comments [2] |

通过JMX监控weblogic服务器Pending Requests|Weblogic/JMX/Monitoring [Permalink]

Thu May 15 22:11:35 CST 2008
Category [development. ~]

在应用linux服务器后性能和稳定性方面有了比较大的提升。但同时带来的问题就是linux的易用性方面相对差一些,尤其是在系统计数器方面,缺乏GUI的实时监控能力:

图1:windows下的性能计数器

为了解决这个问题,开发了一个小程序,可以用JMX的方式从weblogic服务器中读取当前执行队列的情况,并用图表的方式表现出来:

图2:WlsMon

应该说效果还是不错的。其实还可以更进一步,监控更多细节。只不过时间有限加上比较懒,只能说是“除了想不到,还有做不到”。。

主要参考资料:
http://edocs.bea.com.cn/wls/docs92/jmx/accessWLS.html#wp1114746
http://edocs.bea.com/wls/docs92/wlsmbeanref/core/index.html
第二个文档还是比较详尽的,让我想起了MSDN。

Posted by: miles
Comments [0] |

Web Standards Addictive [Permalink]

Thu Jul 17 13:57:28 CST 2008
Category [development. ~]

Web标准真是个好东西,越搞越上瘾,明明是很没逻辑的html,也能写得好像很有逻辑似的,讲起来头头是道。

正在酝酿中的Yup Movie就是完全按照xhtml 1.0 strict标准构建的,在流行的浏览器当中显示效果完美,关掉css以后效果仍然不错。看来通过css隔离内容和显示真的有点道理。可惜那个分离了显示的内容看上去还是不咋纯粹。更让人没法忍受的是始终没法找到TABLE排版的替代方法!

为了这最后1%的完美,花了一大把时间上下求索。直到有一天看到w3.org某页面源码以后长出了一口气。原来用了表格也能追上标准。。

(p.s. hibaidu咋样才能trackback涅?难道靠c-p大法?今天有人trackback了一下我的blog,人生第一次,眼泪哗哗地)

Posted by: miles
Comments [0] |

FTP server: the Passive & Port Mode|FTP的主动模式与被动模式 [Permalink]

Mon Dec 25 17:58:34 CST 2006
Category [development. ~]

ftp服务分主动(PORT)与被动模式(PASV)两种模式。其主要区别是由服务器端还是客户端开启动态端口。前两天刚刚了解过这方面的相关知识,但是没有想到这么快就用上了。

今天去机房给服务器那边配置了防火墙,总体来说算比较顺利,前后2个多小时就搞完收工,中间的网络中断也只有10s左右。最后测试了各项服务,就卡在ftp这里了。

服务器防火墙关闭的情况下:客户端直连网络,则port/pasv都可以正常访问,而客户端通过内网上网,只有pasv可以正常访问;
服务器防火墙开启,仅允许21端口的情况下:客户端直连网络,则port可以正常访问,而客户端通过内网上网,两种模式都无法访问。

又回过头研究了一下ftp的协议规范,确认了主动模式需要客户端开一个>1024的随机端口用于数据传输;而被动模式需要服务器端开启一个>1024的随机端口用于数据传输。而在办公环境下,两端都有防火墙,所以就出现了上述的问题。解决办法有两个:
1.客户端机器设置为DMZ,允许所有连接进入。这样一来,客户端可以任意开端口,主动模式自然也就不在话下;
2.服务器端关闭防火墙。如果这样的话服务器端可以开任意端口,被动模式就没有问题了。

可是如果采用方案一,则对客户端限制太多,对于需要多人、多点维护的服务器环境来说不现实;而如果采用方案二,防火墙岂不是摆设?又baidugoo了一轮,终于找到了折中方案:原来serv-u等ftp server是可以设置pasv模式下使用的端口范围的。这样一来,可以设定一个比较小的范围,然后在防火墙上开一个小口,问题就算解决了。可是为什么ftp协议非要这么BT呢?费解。。。

Posted by: miles
Comments [0] |

The performance of predefined objects in ASP|ASP内置对象的性能 [Permalink]

Fri Mar 17 16:06:49 CST 2006
Category [development. ~]

代码片断一:

<%
Dim localArray(5000)
for i = 0 to ubound(localArray)
  randomize
  localArray(i) = rnd()*1000
next

application("tester") = localArray

start = timer
for i = 0 to ubound(application("tester"))
  if application("tester")(i) > 800 then
    application("tester")(i) = 800
  end if
  if application("tester")(i) > 700 then
    application("tester")(i) = 700
  end if
  if application("tester")(i) > 600 then
    application("tester")(i) = 600
  end if
  if application("tester")(i) > 500 then
    application("tester")(i) = 500
  end if
next

response.write formatnumber((timer - start), 2, -1)
%>


代码片断二:
<%
Dim localArray(5000), localArray2
for i = 0 to ubound(localArray)
  randomize
  localArray(i) = rnd()*1000
next

application("tester") = localArray

start = timer
localArray2 = application("tester")

for i = 0 to ubound(localArray2)
  if localArray2(i) > 800 then
    localArray2(i) = 800
  end if
  if localArray2(i) > 700 then
    localArray2(i) = 700
  end if
  if localArray2(i) > 600 then
    localArray2(i) = 600
  end if
  if localArray2(i) > 500 then
    localArray2(i) = 500
  end if
next

response.write formatnumber((timer - start), 2, -1)
%>

猜猜看这两段代码性能差别会有多大?

至少从代码结构上看相差不大。第一段使用application存储数组并直接通过application来使用它;第二段则是将application中存储的数组拿出来做循环。前者应该是过集合方式取得内容,然后拿出来用,所以多了一个遍历集合和方法调用返回的过程。

可是实际每段代码执行3次时间如下:
第一段:9.14s 9.19s 9.91s
第一段:0.03s 0.03s 0.03s
不过5000次循环,可差距远比想象中大得多!而且随着循环次数增加,性能会急剧下降。1000次循环时候第一段不过是0.4s而已,5倍的循环次数就用了20多倍的时间。亲娘咧,真费解啊~~~

原因有时间再探查,结果算是记住了。。。估计request/session也好不到哪里去。

Posted by: miles
Comments [0] |

Another way to deadlock | 另类死锁 [Permalink]

Sat Oct 08 17:41:45 CST 2005
Category [development. ~]

前段时间系统频繁出现死锁。按照目前站点压力来看绝对不正常,但是一直也没有找到原因所在。今天翻代码的时候,无意中发现DBHandler类在open()方法中,从pool获取conn之后执行了conn.setAutoCommit(false);而之后没有任何地方有显式的conn.commit();。因为close时候实际只是把conn送回pool,所以这样一来,唯一的机会就在下次这个conn再被取出并执行conn.setAutoCommit(false);的时候隐式commit了(*根据规范,setAutoCommit()会提交当前所有trans)。

因此,压力越大这个BUG造成的问题就越不突出。因为频繁的访问会使得conn在pool中闲置的时间比较短,也就比较有机会频繁的调用到setAutoCommit();。而这个推测和实际观察结果也是吻合的。

综上,BUG不求多,求精。这一个就够把我整死了。

Posted by: miles
Comments [0] |

Get Ip Addr. From The HttpServletRequest Wrapped By The "iisforward" ISAPI Extension In Weblogic | 通过iisforward isapi ext访问weblogic的取ip问题 [Permalink]

Sun Oct 02 12:46:42 CST 2005
Category [development. ~]

在IIS+Weblogic整合系统中,像移动网关一样,iisforward这个ISAPI过滤器也会对request对象进行再包装,附加一些WLS要用的头信息。这种情况下,直接用request.getRemoteAddr()是无法取到真正的客户IP的。

实际的iisforward附加头如下:

WL-Proxy-Client-IP=211.161.1.239
Proxy-Client-IP=211.161.1.239
X-Forwarded-For=211.161.1.239
WL-Proxy-Client-Keysize=
WL-Proxy-Client-Secretkeysize=
X-WebLogic-Request-ClusterInfo=true
X-WebLogic-KeepAliveSecs=30
X-WebLogic-Force-JVMID=-327089098
WL-Proxy-SSL=false
综上,正确作法如下:
public String getIpAddr(HttpServletRequest request) {
    String ip=request.getHeader("X-Forwarded-For");
    if(ip == null || ip.length() == 0) {
        ip=request.getHeader("Proxy-Client-IP");
    }
    if(ip == null || ip.length() == 0) {
        ip=request.getHeader("WL-Proxy-Client-IP");
    }
    if(ip == null || ip.length() == 0) {
        ip=request.getRemoteAddr();
    }
    return ip;
}
如此一来,就可适应各种情况,包括通过移动网关访问(会附加X-Forwarded-For)。通过这个简单例子可以看出封装和抽象的重要性。

Posted by: miles
Comments [0] |

正确设置request传入内容的编码|set charset encoding properly [Permalink]

Thu Aug 18 11:50:21 CST 2005
Category [development. ~]

request.setCharEncoding("UTF-8")
这句话一定要放在访问request内容之前,否则将不起作用。
原因可能是如果取值之后仍然起作用,会造成设置前后取到的参数编码不一致的情况,而这种情况造成的问题严重性甚于编码出错本身。所以在ServletRequest接口这个方法的API说明中提到:

* Overrides the name of the character encoding used in the body of this
* request. This method must be called prior to reading request parameters
* or reading input using getReader().

Posted by: miles
Comments [0] |

TOMCAT 5: 关于Connector的URIEncoding属性|About "URIEncoding" attribute in the "Connector" tag. [Permalink]

Tue Apr 19 14:09:48 CST 2005
Category [development. ~]

tomcat5中,因为众所周知的原因,为了保证get/post数据都采用相同的UTF8编码,我们在server.xml中进行了如下设置:

<Connector port="8080" maxThreads="150" minSpareThreads="25" 
maxSpareThreads="75" enableLookups="false" redirectPort="8443" 
acceptCount="100" debug="99" connectionTimeout="20000" 
disableUploadTimeout="true" URIEncoding="UTF-8"/>
这里指定了get时候的数据编码。但是,当使用IIS作为webserver转发servlet/jsp请求给Tomcat时候,这个设置却失效了。其实原因很简单:IIS是通过AJP协议,把请求转发到Tomcat监听的8009端口上的,所以这里针对8080的设置自然就无效了。正确的方法是进行下面的设置:
<Connector port="8009" enableLookups="false" redirectPort="8443" 
debug="0" protocol="AJP/1.3" URIEncoding="UTF-8"/>
虽然是小问题,却花了我几个小时才想到。 /images/emoticons/plain.gif

Posted by: miles
Comments [0] |

Office版本差异导致的.net调用Excel的问题 [Permalink]

Tue Mar 01 11:33:32 CST 2005
Category [development. ~]

为了处理excel文件的数据导入,我使用了Excel.Application这个对象。在我的OfficeXp环境下,打开workbook的做法是这样的:

oWB=oXL.Workbooks.Open(XlsFile.FullName, missing, 
      missing, missing, missing, missing, 
      missing, missing, missing, missing, 
      missing, missing, missing, missing, 
      missing);
可是到了客户的Office2000环境下,竟然出了这个不知所云的错误:

****** [ERROR] ******
msg: 未将对象引用设置到对象的实例。
loc: at Excel.Workbooks.Open(String Filename, Object UpdateLinks, Object ReadOnly, Object Format, Object Password, Object WriteResPassword, Object IgnoreReadOnlyRecommended, Object Origin, Object Delimiter, Object Editable, Object Notify, Object Converter, Object AddToMru, Object Local, Object CorruptLoad) at PriceComparator_Console.Form1.parseFile()
********************


每个实例都货真价实,怎么会有空指针错误呢?经过n小时调试(装VMware和win2kp/office2k用n-1小时 /images/emoticons/cry.gif ),多方查找资料才知道原来是因为两个版本的COM对象的Open方法参数列表不一样!新版另外提供了一个_Open的方法,参数列表和旧版Open一样,以保证兼容性。所以代码变成这样:
oWB=oXL.Workbooks._Open(XlsFile.FullName, missing, 
      missing, missing, missing, missing, 
      missing, missing, missing, missing, 
      missing, missing, missing);
就太平了。另外SaveAs时候office2003和officexp/2000也不一样。同理提供了_SaveAs。

用OleViewer查了COM接口,新的Open加入了
[in, optional] VARIANT Local, 
[in, optional] VARIANT CorruptLoad, 
这样两个参数。应该是新版office提供的功能。不过长此以往,不得______Open了么?反正现在Wookbooks接口的OpenText已经到了__OpenText。。COM不熟,不知道这是不是规范使然。


问题解决了,不过确是挺郁闷。为什么要NullRefException而不是InvalidOperationException呢?但愿是因为.net和COMinterop的关系,所以产生一个正确的异常起来不像想象的那么容易。否则就真的是RPWT了。

Posted by: miles
Comments [0] |

?
十二月 2018
Sun? Mon? Tue? Wed? Thu? Fri? Sat?
      1
2345678
9101112131415
16171819202122
23242526272829
3031     
<  Nov???Today??? Jan  >
<< <   1 2   > >>

Available categories: [/] [working on downwap.] [trouble shooting] [working on Yup Mailman]

Powered By blojsom?? RSS Feed? RSS2 Feed? RDF Feed

html hits:?39887