我和RH9 + J2sdk1.4.2 + NPTL 不得不说的故事

类别:Java 点击:0 评论:0 推荐:

    我读大学那几年,Linux贼火,如果你的硬盘里不装个RedHat或者Mandrake,大家说话你都不好意思插嘴。当时就觉得用xmms放mp3比winamp还好听。为了在redhat5.1上装上我的雅马哈声卡,我何止重装了20遍。有一年为了在学校里自学Linux,几个哥们寒假都没回家。大年三十那个晚上每个人就只吃了一碗素面。不是没钱,而是那几天学校方圆500米之内就没有开张的食肆。现在想起来我有点奇怪,为什么不预先准备一点食物呢?后来想起来了,一来是大家都熬夜,白天都睡觉了,晚上太冷也不愿出去;二来就是想把钱省下来买些linux的书。当时网络资源还不丰富呢。接下来的后果就是开学第一堂结构化学课我直接晕倒在课桌下。
    不容易啊!

    和Redhat有缘,工作到现在也一直用着Redhat,从6.2到7.x到8.0,一路走到9.0。6.2算是最稳定的一个版本,后来的升级太快,没什么印象了。到了 9.0 算是一个终结,因为Redhat已经宣布不再继续支持和开发免费的RedHat Linux 版本,该公司的全部精力将放在企业Linux (Enterprise Linux)版本的开发和应用中。 到去年上半年,9.0也停止维护了。详细情况看这里。
    
    公司的产品线依赖于 linux,虽说可以移植到AS,不过如果没给Redhat买单,和用Windows一个性质了,盗版。所以一直到现在,给客户安装还是用着9.0。

    9.0刚推出的时候,sun的j2sdk新版本1.4.2也在那时候发布。sun的jdk在linux下的性能一直为人诟病,也确实,比在 windows下的性能差了太多。9.0 刚好推出一个新的线程库,叫Native POSIX Thread Library (NPTL),sun说 1.4.2大概对NPTL做了优化,将极大提高jdk的性能。参见 http://java.sun.com/developer/technicalArticles/JavaTechandLinux/RedHat/ ,做了不小一番宣传。
    英文不好,没怎么细看。我对感觉不明显的性能因素并不感冒,尤其是 Intel 和 AMD 发了疯似的提高cpu频率的时候。不过 Redhat9+J2sdk1.4.2 这个sun宣传的黄金组合一年前却是让我吃了老大的苦头。
    起因是公司系统里有一个后台线程,每隔指定的时间就会启动若干个工作线程。自从我将公司的系统升级到了 redhat9和j2sdk1.4.2,奇怪的事情就出现了,没过一两天,该线程就不工作了。没有任何错误信息,就是没反应了。以为是否内存泄露,仔细检查了代码,该close的都close了,而且也没有 OutofMemoryError 出现。只好 killall -9 java,然后重启。
    那个时候经验浅,太相信sun和redhat,就想不明白同样的程序,升级到新版本难道还中了邪不成。知道是升级的问题,让人头痛的是不知道问题出在哪。网上也没有人遇到类似的问题。后来从redhat里bugzilla里找到线索,参见https://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=90301。同样的 sun 的bug database 里针对redhat9的bug也是真不少,参见 http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4885046。看到这些 bug 的报告,给我一点提示,很有可能就是这个 NPTL 搞的鬼。按照bug 报告上的提示 export LD_ASSUME_KERNEL = 2.4.1。everything 果然 is ok了。花了快一个月的时间,忍受客户的唾骂,结果二十多个字母搞定,我老泪纵横啊。到底是什么原因,我其实并不清楚,也不想再去弄清楚了。

    今天看到文章介绍在redhat9上安装oricle,也需要 export LD_ASSUME_KERNEL = 2.4.1 一把,让我想起了这不堪回首的经历。
    另外,如果在linux上用java,建议还是用 blackdown 的版本,我试过了,jboss启动速度快10%左右。而且,可以在sh脚本里安全的注释掉这一行
#export LD_ASSUME_KERNEL = 2.4.1
    
    RS3 或者马上就要出炉的RS4,Tiger 或者正疾驰而来的Mustang ,这样类似的问题还存在吗?

本文地址:http://com.8s8s.com/it/it11435.htm