免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: 无风之谷
打印 上一主题 下一主题

[WebLogic] 中间件WebLogic/Tuxedo/GoldenGate的排错与优化(获奖名单已公布) [复制链接]

论坛徽章:
0
71 [报告]
发表于 2012-02-20 21:38 |只看该作者
回复 70# huanglao2002

谢谢您一直的热心支持和帮助,有想法也很有见地

   

论坛徽章:
1
CU十二周年纪念徽章
日期:2013-10-24 15:41:34
72 [报告]
发表于 2012-02-21 09:27 |只看该作者
居然回复了我的帖子,我好感动饿,真的。不过weblogic只会前台使用了,具体后面的东东太深奥了,弄不懂。

论坛徽章:
0
73 [报告]
发表于 2012-02-23 09:26 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
74 [报告]
发表于 2012-02-26 23:01 |只看该作者
本帖最后由 三人行必有吾师 于 2012-02-27 08:01 编辑

其实,这里的讨论,已经很多都涉及到书的内容了;另外,还想起一句长辈常常叮嘱的古话:“书是死的,人是活的”

比如,楼上有同仁提到JDBC调优时比较共性的一个做法
“2.3 JDBC调优
增加Statement Cache Size对于大量使用PreparedStatement对象的应用程序很有帮助,WebLogic能够为每一个连接缓存这些对象,此值默认为10。在保证数据库游标大小足够的前提下,可以根据需要提高Statement Cache Size ”


大多数情况下是OK的,但在一些特殊情况下,反而恰恰是要关闭WebLogic控制台上的Statement Cache,比如使用Informix驱动时:

Informix Limitation for Prepared Statements
If anything causes a change to a database table or procedure, such as adding an index, or recompiling the procedure, all existing JDBC PreparedStatements that access it must be re-prepared before they can be used again. This is a limitation of the Informix database management system. WebLogic Server caches, retains, and reuses application PreparedStatements along with pooled connections, so if your application uses prepared statements that access tables or procedures that are dropped and recreated or for which the definition is changed, re-execution of a cached prepared statement will fail once. WebLogic Server will then remove the defunct prepared statement from the cache and replace it when the application asks for the statement again.

To avoid any PreparedStatement failure due to table or procedure changes in the DBMS while WebLogic Server is running, set the Statement Cache Size to 0. WebLogic will make a new PreparedStatement for each request. However, with the statement cache disabled, you will lose the performance benefit of statement caching.


这个时候,可以在连接参数里,开启Informix驱动自身的Cache,比如:
  1. i)    InsensitiveResultSetBufferSiz=20480
  2. ii)   MaxPooledStatements=50
复制代码

论坛徽章:
0
75 [报告]
发表于 2012-02-26 23:23 |只看该作者
本帖最后由 三人行必有吾师 于 2012-02-26 23:42 编辑

在J2EE平台通过JDBC连接Informix数据库时,如果故事能就此结束,就好了。但大多数情况下,调优是个多级瀑布模型;就是调完一轮后,窄的地方疏通了,然后又发现新的瓶颈,如此循环往复多次,才能最终达到一个相对平衡的调优效果。

继续上面的例子,在实际情况中,在Linux环境下,即使调整了Statement Cache,亦然常常容易发现压力大的情况下,系统出现大量堆积的Thread Dump,基本都是:
  1. "[ACTIVE] ExecuteThread: '82' for queue: 'weblogic.kernel.Default (self-tuning)'" RUNNABLE
  2.     java.lang.Thread.setPriority0(Native Method)
  3.     java.lang.Thread.setPriority(Thread.java:971)
  4.     java.lang.Thread.init(Thread.java:334)
  5.     java.lang.Thread.<init>(Thread.java:356)
  6.     java.util.TimerThread.<init>(Timer.java:456)
  7.     java.util.Timer.<init>(Timer.java:71)
  8.     java.util.Timer.<init>(Timer.java:122)
  9.     com.informix.jdbc.IfxCancelQueryImpl.startCancel(IfxCancelQueryImpl.java:45)
  10.     com.informix.jdbc.IfxStatement.executeQueryImpl(IfxStatement.java:1200)
  11.     com.informix.jdbc.IfxPreparedStatement.executeQuery(IfxPreparedStatement.java:369)
  12.     weblogic.jdbc.wrapper.PreparedStatement.executeQuery(PreparedStatement.java:100)
  13.     com.p6spy.engine.logging.P6LogPreparedStatement.executeQuery(P6LogPreparedStatement.java:172)
  14.     org.hibernate.jdbc.AbstractBatcher.getResultSet(AbstractBatcher.java:186)
  15.     org.hibernate.loader.Loader.getResultSet(Loader.java:1668)
  16.     org.hibernate.loader.Loader.doQuery(Loader.java:662)
  17.     ... ...
复制代码
可见:
i)   针对PreparedStatement,Informix驱动中用到了大量的JDK自带的Timer
ii)  而JDK每个Timer都会启动一个TimerThread,即线程级别的开销,并映射成操作系统本地线程,而且是短命线程,不停的创建和消亡;
(题外话:其实,Weblogic就因为其效率低下,重写了自己的该部分代码,有自己的Timer类)。

但Informix驱动是数据库方提供的,已经写好了;咱们总不能用Jad反编译后,自己再出个优化版的驱动吧?咱们敢改,客户还不敢用呢。。。

只好再看这个堆栈,最顶端是
  1.     java.lang.Thread.setPriority0(Native Method)
  2.     java.lang.Thread.setPriority(Thread.java:971)
复制代码
这种带...0的方法,基本都是通过JNI调入了C语言的本地库,从旁边的(Native Method)也能验证;其实在JVM的线程实现中,最简单的就是将其映射到操作系统自己的线程,可以有1X1的(一对一),也可以有MXN的(多对多)。而在Linux内核从Kernel 2.4变为2.6后,超线程技术为了优化CPU时间片Time_Slice,对于线程的创建和优先级设定,却恰恰都有很严重的系统开销用于线程矩阵池实时维护。

但Linux内核也是专门的开源协议维护的,不能为了这个,咱们自己出一套Linux内核源码,重新做一套改进版吧?还是那句话:咱们敢改,客户还不敢用呢。。。

只好去读JVM实现的C语言源代码,在上万行的C语言源程序中,可以找到关于设置优先级的一些部分,其中有一段:
  1. 2997 OSReturn os::set_native_priority(Thread* thread, int newpri) {
  2. 2998   if ( !UseThreadPriorities || ThreadPriorityPolicy == 0 ) return OS_OK;
  3. 2999
  4. 3000   int ret = setpriority(PRIO_PROCESS, thread->osthread()->thread_id(), newpri);
  5. 3001   return (ret == 0) ? OS_OK : OS_ERR;
  6. 3002 }
复制代码
可见,其中有个“快捷”跳出,就是第二行if...return OS_OK那个,再找UseThreadPriorities,发现可以通过JVM启动项添加-XX:-UseThreadPriorities来设定。。。

于是,这个Informix驱动本身实现的性能缺陷,却恰恰通过了JVM的启动参数设置来规避。。。

这个例子,即是印证了前辈们那句话:“书是死的,人是活的”

论坛徽章:
0
76 [报告]
发表于 2012-02-27 09:10 |只看该作者
书刚刚买到手,大致浏览了一下,感觉还不错

论坛徽章:
0
77 [报告]
发表于 2012-02-27 10:54 |只看该作者
回复 61# 成皿田心

你好!看到老师的回复,非常感谢!
小弟愚钝,看到您在第三点写道:“用f5直接替代之前提到过的proxy的角色,而且效果更好(毕竟是专业的负载均衡器),只要在f5配置中纳入集群的各个节点就ok了”。
老师您有稍微详细一点步骤吗?
因为我们在做实施的时候,F5厂家的人说,他们实施的WEBLOGIC+F5实现的负载均衡都是分别在两个节点,建立两个DOMAIN,再通过F5虚拟地址实现负载均衡。
当时我就表示了异议,但是也苦于找不到对策。我本人对F5知之不多。
我也查询了ORACLE官方网站,WEBLOGIC+F5能完美契合的。

非常感谢您的指教!多谢!
这是我的邮箱:yszw0817@126.com


   

论坛徽章:
0
78 [报告]
发表于 2012-02-27 13:13 |只看该作者
回复 77# yszw0817


您好,此问题中f5只是做了一个代理分发的角色。

后端的服务器如果是weblogic集群,完全没有必要建立两个域(当然weblogic规定集群不能跨域。。,从config.xml看cluster标签隶属域domain之下),这个代理只跟后端的每个节点相关,跟domain无关。

有关的weblogic+f5的实施方案之类,我下班之后帮忙找找,有的话发到你邮箱。。。

   

论坛徽章:
0
79 [报告]
发表于 2012-02-27 13:20 |只看该作者
weblogic我也是刚了解 还有很长的路要走哇

论坛徽章:
0
80 [报告]
发表于 2012-04-20 10:20 |只看该作者
已经买了书,在慢慢看了,不知道戴老师还会不会来。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP