您的位置:首页 > 其它

一次痛苦的server调试经历

2006-12-22 16:16 555 查看
我们项目组的服务器是一个比较老的服务器,配置是P4 1.8, 1G内存,比我现在用的PC的配置还低,但是就是这样的一个服务器上确安装了3个tomcat,3个apache,一个oracle,还有2个我们项目自己的RMI server,平时我们的ftp得开着,可怜的服务器,访问量稍微大一些的时候就开始反应缓慢,但是即使这样,大家忍一忍也就过去了。
10月末,项目开始测试,出现了以前从来没有过的情况,就是大家测试一个小时左右的时候,服务器内存被消耗光,然后死掉。作为服务器管理人员的痛苦这个时候才真正的能体会到,没有办法,那就开始查找原因吧。
1、 其他应用程序消耗了过多的内存
用top命令监视了一下,发现下面的现象:



这个图片只是其中的一部分,还有其他的和红线部分差不多内存消耗的,心里突然感觉轻松了,原来原因在这里,用ps命令通过PID找到TTY,然后通过TTY用last命令找到这个用户的IP,然后再windows下用nbtstat命令尝试看看能不能找到IP主人的用户名,运气不错,找到了,原来是有新来的同事在用vi打开了巨大(100M)的日志文件,然后还不释放,后来不允许大家用vi打开日志文件,如果想要看就用ftp下载到本地,不过这样实在是太麻烦了,于是修改了log4j的配置,让日志每次10M之后换新文件。几个小时过去了,暂时没有出现服务器崩溃的现象,于是自认为一切OK,回去睡觉去了。
2、 Java虚拟机的内存设置太大,GC频率太低
第二天上午很多人开始测试的时候,服务器仍然会死掉,但是频率比较低,大概3小时的时候才会死掉,看来昨天的问题是一个原因,但是不是根本原因。察看了tomcat和rmi server的启动参数,发现内存设置有点大,会不会是内存设置太大而导致GC频率太低,而导致服务器效率低呢?于是修改了Tomcat和rmi server的内存配置,但是现象仍然存在,看来不是这个原因。不过后来的事实证明,这次的内存配置修改还是有效的,GC频率有所提高,服务器效率提高比较明显。
3、 Java虚拟机内存泄露
考虑到以上的所有情况,看来原因肯定是内存泄露了,但是java的内存泄露很少会出现,这次居然让我碰到。
这么多的JVM应该是那个出现问题了呢?用top命令监视了好久终于发现了下面的现象:
刚刚开始:



1分钟后:



再后来的图片没有截下来,但是红线部分的内存消耗已经到了350M以上,比我设置的最大内存还大,百思不得其解,为什么GC没有起作用呢?看来可怕的内存泄露的原因需要我去找了。
还是用top命令找到了启动这个虚拟机的server,原来是我们其中的一个RMI server,于是下载了一个Optimizeit EntSuite 2006,开始研究内存的使用情况,发现有很多的service实例总是增加,而不释放。
中午吃饭的时候和同事讨论这个问题,他的一句话提醒了我,原来项目组在开发的时候为了不重启服务器,改写了classloader,如获至宝,吃完饭回来就把原始包替换上去,一切OK。

尾声
这次的体验让我学会了很多的东西,也知道自己还有很多需要努力的地方。
Borland的Optimizeit非常好用,用法以及分析方法以后有时间要写出来,做个笔记。
为什么改写classloader会导致内存泄露呢?我们有没有简单的办法实现hot deploy? 这段时间也研究了一下,有时间也要做一个笔记。

系统环境:
Redhat9
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: