2007年12月21日 #

语录一

某天,停车,图方便随便停在路边,抱怨了两句,ld随即顶回一句:“只要有边就能停”

posted @ 2008-11-18 23:32 tacy lee 阅读(236) | 评论 (0)编辑 收藏

oracle 的lob & long

一直认为lob类型的性能要好过long,但是之前只了解到long的种种限制,oracle也是不推荐使用long类型,这几天由于一个项目问题,产品里面一个表字段用了long类型,分析下来操作long的时候,性能有所影响,想把它改成lob,就简单验证了一下

首先创建两个测试表:

create table test_long (a int primary key,b long);
create table test_clob (a int primary key,b clob);

用附件java代码,往两个表里面各插入100条数据,保证插入数据是一样的,lob字段长度为10k(如果小于4k,oracle可以把它保存到到表内,不会存储在表外,性能没有问题,这个我基本确定,而且我们应用中这个字段经常会超过4k)。

做一个简单查询对比一下:

SQL> set autotrace traceonly;
SQL> select * from test_clob where a=1;

统计信息
----------------------------------------------------------
        331  recursive calls
          0  db block gets
         69  consistent gets
          4  physical reads
          0  redo size
       1278  bytes sent via SQL*Net to client
        837  bytes received via SQL*Net from client
          5  SQL*Net roundtrips to/from client
         12  sorts (memory)
          0  sorts (disk)
          1  rows processed

SQL> select * from test_long where a=1;

统计信息
----------------------------------------------------------
        236  recursive calls
          0  db block gets
         43  consistent gets
          0  physical reads
          0  redo size
        675  bytes sent via SQL*Net to client
        531  bytes received via SQL*Net from client
          3  SQL*Net roundtrips to/from client
          5  sorts (memory)
          0  sorts (disk)
          1  rows processed

对比一下,long开销比lob小,当然你可以把lob字段启用缓存,把4次物理读去掉,但还是多了(73-43)次逻辑读,update也试了一下,lob产生的redo比long大,就不列出来了,有兴趣的可以自己试试

测试下来,看来之前的认识不对,不确定的东西最好还是动手试试,当然对于新应用,还是不建议用long,毕竟oracle已经废弃它了。

testClobLong.java

posted @ 2008-06-24 01:18 tacy lee 阅读(445) | 评论 (0)编辑 收藏

杀掉服务器上的远程桌面连接

用远程桌面连接登入服务器的时候,你可能会经常碰到下面的情况:

mstsc-exceed-456x114

 

也就是说,服务器的连接数已经满了,很多时候,可能是别人异常断开连接,导致连接没有释放,一般这时候你需要去机房登入服务器断开连接,其实windows提供了tsdiscon命令来做这事情

posted @ 2008-06-22 17:12 tacy lee 阅读(457) | 评论 (0)编辑 收藏

通过保存错误页面到日志中解决一些后台看不到异常的错误

有时候,我们可能希望看到lr的出错页面:比如lr出错,但是后台服务器没有错误日志,这时候,我们希望能看到错误页面的内容来判断问题出在什么地方,但是lr没有提供类似的功能

我们可以通过一种变通的办法来实现:

首先找到你出错的页面,保存该页面到参数里面:

web_set_max_html_param_len(“2048”);

web_reg_save_param(“FILED”,”LB=”,”RB=”,”Search=Body”,LAST);

然后输出到日志里面: lr_output_message(”#######################################%s”,lr_eval_string(”{FILED}”));

修改lr run-time的几个设置:

1、Always send messages

2、continue on error (这样才能保证运行lr_output_message)

这样lr会把所有的lr_output_message输出保存到日志文件

当然你不要下载资源文件,否则保存到的就不是html页面了,可能是一个gif :(

最后,结合lr controller的错误信息,定位到出错的vuser id,查看该vuser的log文件就能看到错误页面了

非常有效的一个小技巧,用它解决了一个难缠的问题。

posted @ 2008-05-28 23:05 tacy lee 阅读(821) | 评论 (3)编辑 收藏

捐款

慢慢变味了,一群无聊的人整天盯着别人捐了多少,很奇怪

posted @ 2008-05-18 19:45 tacy lee 阅读(237) | 评论 (0)编辑 收藏

地震

最近一段时间特别忙,以至于发生地震这么大的事情都没注意到,首都人民不断告诉我被震了也没当回事,昨晚回家打开电视,新闻频道,懵了,坐下来一直看,到晚上2点,满目苍痍,真为处于震中的人揪心,中间鼻子酸了N次,也愤怒了N次(那些恶心人的地方官,难道就不能说点实际的东西吗?)

1、政府反映非常迅速
2、子弟兵真好
2、有一个好总理
3、地方政府不作为,官话套话(被采访的那个什么何彪,真想抽丫的)
4、为什么总是学校?处于地址多发地带的学校和其他公共设施为什么都是豆腐渣

为所有受难的人祈祷!为我们饱受磨难的祖国祈祷!

公司员工捐款20W,尽点绵力

posted @ 2008-05-14 10:17 tacy lee 阅读(233) | 评论 (0)编辑 收藏

ibm jdk 1.5缺省用的gc策略性能很差

     摘要: 这几天测试一个引擎的性能,用一个单表查询的case,测试出来的结果是210tps,cpu也正常,在85%左右,也没怀疑。

后面再重新测试的时候,加上了gc log,用gc分析工具分析了一下gc的吞吐量,发现吞吐量奇低,竟然只有77%左右,很是奇怪,看了一下gc日志,所有都是global gc, 怀疑gc策略有问题,查了一下资料,参考了下面一篇文章:  阅读全文

posted @ 2008-04-14 20:38 tacy lee 阅读(4433) | 评论 (2)编辑 收藏

Sybase 锁模式

Sybase ASE有三种锁模式:AllPages,DataPages,DataRows

Sybase的数据有table pages和index pages,最小分配单位为pages,不同的锁模式对于table pages和index pages有不同的表现,具体如下:

Locking Schema

Locks on Index

Locks on Data

All Pages

Page

Page

DataPages

Not locked

Page

DataRows

Not locked

Row

如上表所示:
1、AllPages锁模式对于并发的限制最高,他对index pages和table pages都加页锁(当页被锁住的时候,页上的所有rows都不能被其他session访问)
2、DataPages对table pages加页锁
3、DataRows:强烈建议用这个锁模式,对于oltp应用,如果用前两种锁模式会导致频繁死锁

另外,DataPages和DataRows对于index pages的控制采用latch方式,一种轻量级的锁机制(熟悉oracle会比较清楚)

对于Sybase ASE来说,锁是非常宝贵的资源,不要长时间持有锁,所以一般我们在写应用的时候尽量减少长事务

 

另:Sybase ASE缺省的事务隔离级别:Read Committed

posted @ 2008-04-01 10:50 tacy lee 阅读(916) | 评论 (0)编辑 收藏

并发是啥

一个用户点击就是一个用户请求,一个webservice类似的调用也算一个请求,等等


一个用户在某个时间点上当然只能发起一个用户请求,一个用户请求就是一个并发

我们一般纠缠在同一事物并发还是不同事务并发。

可能在一个时间点上,有100个用户在发送浏览,查询动作,10个用户在下订单,5个用户在做付款动作,你说这个时间点上有多少个并发请求,当然是115个了

衡量一个系统性能主要靠的就是这个吞吐量(tps)

当然我们也非常关心同时100个用户并发下订单的时候系统是否能支撑(这是通常我们大部分人理解的并发),我们会说这是核心业务,我们要得出数据(是否要考虑背景业务呢,呵呵,很难说的清楚,我一般就不考虑)

posted @ 2008-03-18 15:33 tacy lee 阅读(280) | 评论 (0)编辑 收藏

工作日志-OOM事件

某项目,年前开始报OOM,频率保持在一月一次,发生OOM的时候,heap free size还有7~800M,比较奇怪,年后系统上集群,系统发生OOM的频率开始变得频繁,基本在4-5天,由于用的是sun jdk 1.4.2_08,无法获取到heap dump,建议用户升级到1.4.2_14(该版本以后sun添加了HeapDumpOnOutOfMemoryError参数,便于获取dump帮助诊断该类问题),4天之后,我们获取到了heapdump文件,通过对dump的分析,基本上排除了对象泄漏。

根据环境(64bit Solaris + 32bit JDK),客户把Heap最大设置为2G,开始怀疑32bit JDK无法分配这么大的Heap,经过验证,不存在这样的问题(sun网站也有相关说明,在solaris 64bit系统上,32bit jdk最大可以设置到4G)

但是从dump看到application classes loader大小已经到了60M以上,有点怀疑Perm区设置太小导致,查了一下sun的文档,Perm区缺省大小为64M,估计是应用加载太多classes导致Perm区溢出,

我们也简单模拟了一下Perm溢出,强制设置max perm大小为32M,并对GC进行了监控,结果和我们预想的一致,看下面的gc log:

151.836: [Full GC 151.836: [Tenured: 25735K->25736K(1048576K), 0.8380858 secs] 25911K->25736K(1557568K), [Perm : 32767K->32767K(32768K)], 0.8382804 secs]
152.676: [Full GC 152.676: [Tenured: 25736K->25722K(1048576K), 0.8464782 secs] 25752K->25722K(1557568K), [Perm : 32767K->32766K(32768K)], 0.8466638 secs]
153.525: [Full GC 153.525: [Tenured: 25722K->25724K(1048576K), 0.8419056 secs] 25738K->25724K(1557568K), [Perm : 32767K->32767K(32768K)], 0.8420986 secs]
154.368: [Full GC 154.368: [Tenured: 25724K->25724K(1048576K), 0.8398816 secs] 25724K->25724K(1557568K), [Perm : 32767K->32767K(32768K)], 0.8400498 secs]
155.212: [Full GC 155.212: [Tenured: 25724K->25725K(1048576K), 0.8365448 secs] 25788K->25725K(1557568K), [Perm : 32767K->32767K(32768K)], 0.8367370 secs]
156.050: [Full GC 156.050: [Tenured: 25725K->25722K(1048576K), 0.8422488 secs] 25725K->25722K(1557568K), [Perm : 32767K->32766K(32768K)], 0.8424328 secs]
156.895: [Full GC 156.895: [Tenured: 25722K->25724K(1048576K), 0.8443532 secs] 25738K->25724K(1557568K), [Perm : 32767K->32767K(32768K)], 0.8445450 secs]
157.740: [Full GC 157.741: [Tenured: 25724K->25724K(1048576K), 0.8427754 secs] 25740K->25724K(1557568K), [Perm : 32767K->32767K(32768K)], 0.8429634 secs]
158.587: [Full GC 158.588: [Tenured: 25724K->25726K(1048576K), 0.8352290 secs] 25820K->25726K(1557568K), [Perm : 32767K->32767K(32768K)], 0.8354212 secs]
159.424: [Full GC 159.424: [Tenured: 25726K->25723K(1048576K), 0.8435336 secs] 25726K->25723K(1557568K), [Perm : 32767K->32766K(32768K)], 0.8437092 secs]
160.270: [Full GC 160.270: [Tenured: 25723K->25725K(1048576K), 0.8477722 secs] 25739K->25725K(1557568K), [Perm : 32767K->32767K(32768K)], 0.8479596 secs]
161.119: [Full GC 161.119: [Tenured: 25725K->25725K(1048576K), 0.8543338 secs] 25725K->25725K(1557568K), [Perm : 32767K->32767K(32768K)], 0.8545040 secs

从日志看,和我们现场的状况非常相似,heap空间充足,但是perm已经到了32M,无法再进一步分配空间,直接导致jvm频繁做Full GC,控制台也开始抛出OOM(Perm引起的回收都是full gc),这样看基本我们判断是Perm太小,导致无法加载classes导致的

和客户沟通之后,我们本来打算进一步验证(在生产环节打开PrintGCDetail,获取详细的GC log),后面仔细检查nohup.out,发现里面已经抛出了 OutOfMemoryError:PermGen Space,至此我们确定是Perm设置不合理导致了本次事故,和客户确认之后,我们在启动参数中加上了MaxPermSize

后面想到中间上了集群之后,eos加载了大量的jboss cache class,这也直接解释了为什么这段时间OOM出现的频率比之前更频繁的原因

这里总结一下,希望对碰到类似问题的tx有借鉴意义,强烈建议用sun jdk 1.4.2的同学升级到>=1.4.2_12,便于对OOM问题的诊断,并加上GC log协助验证。

这里再介绍一下JVM发生OOM的几种情况:

1、java.lang.OutOfMemoryError: Java heap space

这是我们平常理解的OOM,是由于heap space确实没有空间分配,这种一般是由于内存泄漏导致,也有可能是heap space设置太小。需要具体分析

2、java.lang.OutOfMemoryError: PermGen space

jvm规范里面有定义一个method space,这里主要放classes和method list和一个string pool,string有一个intern方法,通过这个方法定义的string都放在这里(好像不常用),这里设置不太小会导致OOM,缺省64M,主要由于现在应用依赖的第三方类越来越多,导致这类问题频繁发生,需要引起重视

3、Requested array size exceeds VM limit
这种是由于申请的array size超出了heap space大小,比如在一个256M的heap space中申请一个512M的array,这种基本都是应用bug导致

4、request <size> bytes for <reason>. Out of swap space?
这种是由于heap size设置相对于系统物理内存太大,导致系统swap space不足,这种的解决办法就是减小heap size大小

5、<reason> <stack trace> (Native method)
这种估计是最麻烦的了,也是最少碰到的,是由于jni或native method导致,如果自己没有写这类的东西,基本可以说是jdk问题

posted @ 2008-03-16 22:38 tacy lee 阅读(2727) | 评论 (2)编辑 收藏

观影日记

之前就准备了一堆的片子,好好享受了一把,留下几部有映象的吧:

 

强烈推荐型

咱们自家的片子先推荐:《盲山》

看盲山,让我想起Michael Moore,我一直认为,严肃题材的电影本身就是电影存在的意义所在,我们需要用影像真实的记录这个时代,我们需要这些“冷名人”,他们也许不是名利场的宠儿,但是他们一样会有无数喜欢他们的人

《我在伊朗长大》

听主人公玛嘉娓娓道来,伊朗社会的变迁,依稀可以看到我们的影子,影片没有去谴责或者反省或者什么高深的立意,只是要告诉你这个社会的样子

《进退维谷》

只要是Paul Haggis,都值得你关注,呵呵,反战的片子,我感觉比之前的撞车有过之而无不及,不知为啥挺冷的,Tommy应该提名最佳男演员,不过他好像评老无所依提名

《偷心》

老片子,看吧,不后悔,爱死这个精灵古怪的Natalie了,哈哈,真真假假谁又能分得清楚呢

《老无所依》

那个僵尸男实在太酷了,Tommy今年也挺火的,哈哈

 

随便看看:

神探,喜欢记忆碎碎片,搏击俱乐部这类片子的人可以看看,刘青云的表演我个人觉得一般,反正也就

美国黑帮(Denzel Washington新片,值得一看)

谍影重重3(这个还是比较经典,今年马特达蒙很火,整部片子非常紧凑,紧张刺激),

我的盛大同志婚礼(无厘头Adam Sandler,去年的神奇遥控器记忆犹新),

一年到头(骗了我一把眼泪)

C+侦探

赎罪(最近很火,看看吧)

 

哈哈,不记得了,还有一些,另外看了第一季反恐24,感觉一般

posted @ 2008-02-13 14:02 tacy lee 阅读(250) | 评论 (0)编辑 收藏

公司同事拍的mv 欢迎捧场!

http://www.tudou.com/programs/view/yKJB_VzHXYU/

突然觉得,这一年收获很多,感触很多,需要仔细总结总结

posted @ 2008-02-01 13:26 tacy lee 阅读(244) | 评论 (0)编辑 收藏

集结号

应该来说,场面还是不错的,国内战争大片

太追求效果了,说实话,看过之后就忘了,在脑海里没留下啥东西,虽然没经历过战争,但是在解放战争年代的巷战竟然打着手势,为演戏而演戏,挺搞笑的,怀念黑鹰坠落中的那段伏击战,谷子地站在空地里手舞足蹈那段看着太怪了,这是战争吗,整个让人感觉挺滑稽的,像一群新兵蛋子第一次上战场,哭爹喊娘,太过啦冯导

耳朵被轰的够呛,后面开始打感情牌,赚点眼泪

冯导还是要加油啊,其实大家是喜欢看冯导还是葛优呢,哈哈

posted @ 2008-01-04 16:05 tacy lee 阅读(259) | 评论 (4)编辑 收藏

关于oracle中的timestamp和date类型

之前一直认为类似:where timestamp>date 这种子句是不走索引的

下面简单做一个验证:

c:>sqlplus / as sysdba
sys@EOS >create table test as select table_name,to_timestamp(last_analyzed) date_test from dba_tables;

表已创建。

sys@EOS> create index idx_test_date on test (date_test);

索引已创建。

sys@EOS> desc test
 名称                                                  是否为空? 类型
 ----------------------------------------------------- -------- ----------------
--------------------
 TABLE_NAME                                            NOT NULL VARCHAR2(30)
 DATE_TEST                                                      TIMESTAMP(0)

sys@EOS> select date_test from test where date_test > TO_DATE('2007-11-5 00:00:00','yyyy-MM-dd HH24:mi:ss');

执行计划
----------------------------------------------------------
Plan hash value: 944171586

-------------------------------------------------------------------------------- --
| Id  | Operation        | Name          | Rows  | Bytes | Cost (%CPU)| Time |
-------------------------------------------------------------------------------- --
|   0 | SELECT STATEMENT |               |     1 |    22 |     1   (0)| 00:00:01 |
|*  1 |  INDEX RANGE SCAN| IDX_TEST_DATE |     1 |    22 |     1   (0)| 00:00:01 |
-------------------------------------------------------------------------------- --

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - access("DATE_TEST">TIMESTAMP'2007-11-05 00:00:00')

Note
-----
   - dynamic sampling used for this statement


统计信息
----------------------------------------------------------
          7  recursive calls
          0  db block gets
         18  consistent gets
          0  physical reads
          0  redo size
        280  bytes sent via SQL*Net to client
        374  bytes received via SQL*Net from client
          1  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          0  rows processed

从上面可以清楚看到,timestamp>date情况下,走索引

纠正我之前的认识。

另外再补充一下,date这个数据类型一般情况下很少用,建议产品里面所有的date数据类型全部改为timestamp

posted @ 2007-12-26 00:42 tacy lee 阅读(1908) | 评论 (0)编辑 收藏

Websphere Classes冲突诊断

作者:tacy lee

由于大量开源框架的采用,Classes冲突的问题在我们的项目中越来越常见,下面写了一个简单的jsp,用来查找当前使用类的位置:

<%@page contentType="text/html; charset=gb2312" %>

<html>
  <head>
    <title>Class conflict</title>
  </head>
  
  <body>
      Example input: com.primeton.tp.web.driver.webdriver.PageDriver<br>
    <form action="<%=request.getRequestURI()%> " method="post">
      <input type="text" name="className" size="50" ><br>
      <input type="submit" value="submit">
    </form>
    <%
            String classLocation = null;
            String className =request.getParameter("className");

            if ((className != null) && ((className = className.trim()).length() != 0)) {
              try{
                classLocation = Class.forName(className).getProtectionDomain().getCodeSource().toString();
                }catch(Throwable e){
                    log("error=" + e, e);
                }

                if (classLocation != null) {
                    out.println("Class " + className + " found in <br>" + classLocation );
                }
              else {
                  out.println("Class '" + className + "' not found" );
                }
            }
    %>
  </body>
<html>

 

通过这个jsp页面可以输入需要查询的类

-----------------------------------------------------------------------------------------------------------------------------------------------------

另外,websphere可以通过下面两个方法来改变类的加载:

1、在"Applications" >"Enterprise Applications" >" yourear ">" Class Loading and File Update Detection"

修改:"Class loader mode" 为 "Parent Last",这样应用类可以覆盖父装载器的类

当然但如果你混合使用了被覆盖的类和没有被覆盖的类,则此操作有可能会导致 ClassCastException 或 LinkageErrors

2、在"Servers" > "Application servers" > "yourserver" > "Process Definition" > "Java Virtual Machine"

添加CLASSPATH,让你的类先加载

posted @ 2007-12-21 18:05 tacy lee 阅读(1336) | 评论 (0)编辑 收藏