公司的网站实在太慢,所以我考虑做负载均衡.
1个Apache + 4个Tomcat,在本地做了压力测试,当100个并发请求时,每个Tomcat的Current thread busy值在25个左右,说明4个Tomcat确实缓解了来自Apache的100并发请求的压力.现在这个负载均衡配置已在服务器上运行.
为了优化数据库连接,我使用了连接池,c3p0比dbcp某些性能要好.4个Tomcat均使用了连接池.
以下是某天tomcat报异常,然后和同事一起做压力测试,3台服务器,数据库服务器,WEB服务器,测试服务器.硬件配置基本可以满足日常需求.
吴 迪 说:
网站异常
大 双 说:
是啊,我也发现了
吴 迪 说:
有连接找不到
大 双 说:
怎么回事,好像是数据库连接
吴 迪 说:
dot.task
吴 迪 说:
先别重启
吴 迪 说:
看看各项参数,统计信息
大 双 说:
我重启sql server
吴 迪 说:
先别重启
大 双 说:
好
吴 迪 说:
你把错误日志存成文件,发给我
吴 迪 说:
你有pcanywhere吗?
大 双 说:
有
吴 迪 说:
你用pca登陆,我用VNC
大 双 说:
好
大 双 说:
No buffer space available (maximum connecti
ons reached?): connect
吴 迪 说:
看到了
大 双 说:
重启吧
吴 迪 说:
等等
吴 迪 说:
数据库有异常吗?
大 双 说:
没有,
大 双 说:
我估计是连接池的问题
大 双 说:
达到最大连接,?
吴 迪 说:
用查询分析器可以查询吗?
大 双 说:
我这没有查询分析器
吴 迪 说:
你关了一个tomcat?
大 双 说:
没关
吴 迪 说:
已经down了一个
吴 迪 说:
进程都没了
大 双 说:
重启吧,不然流量就会少了
吴 迪 说:
好
吴 迪 说:
你重启吧
大 双 发送:
打开(Alt+P)
您成功地从 大 双 处接收了 C:/Documents and Settings/KenWu/Desktop/error_log.txt。
吴 迪 说:
准备做压力测试
大 双 说:
好
吴 迪 说:
从12服务器访问11服务器
吴 迪 说:
看4个tomcat的管理页面
吴 迪 说:
现在是100个并发
吴 迪 说:
永远循环
吴 迪 说:
查看各项参数
吴 迪 说:
访问页是 /index.jsp?cache=false
大 双 说:
嗯
大 双 说:
你访问的是那个页面?
大 双 说:
首页?
吴 迪 说:
是的
吴 迪 说:
/index.jsp?cache=false
大 双 说:
我在生成页面的时候,用了同步关键字
大 双 说:
所以,我估计是等待
大 双 说:
首页生成的时候,其它访问首页的请求都等待
吴 迪 说:
4号TOMCAT出现异常
吴 迪 说:
连接异常
吴 迪 说:
可能跟连接数的设置有关
吴 迪 说:
连接被拒绝
大 双 说:
嗯,等等,这样测试,把首页生成静态页面的代码去掉
大 双 说:
再试一次,看是不是生成静态页面出的问题
吴 迪 说:
我先停掉
大 双 说:
你刚才是访问的index.jsp?cache=false ,还是index.jsp?
吴 迪 说:
index.jsp?cache=false
吴 迪 说:
现在你能打开动态页面吗?
吴 迪 说:
我还没有停
吴 迪 说:
你看看能不能打开
大 双 说:
能打开
吴 迪 说:
压力确实被分散了
吴 迪 说:
我这样做负载均衡还是很有效的
吴 迪 说:
我现在停掉
大 双 说:
好,
大 双 说:
我现在把首页上生成静态页面的方法去了
大 双 说:
再测一次
吴 迪 说:
用什么地址访问?
大 双 说:
index.jsp?cache=new
大 双 说:
换个参数
吴 迪 说:
准备开始
大 双 说:
==
大 双 说:
好像还没改过来
吴 迪 说:
开始了
大 双 说:
哦
大 双 说:
改过来了,
大 双 说:
现在是动态的了
大 双 说:
数据库好像100%
吴 迪 说:
数据库CPU怎么样?
大 双 说:
数据库好100%
吴 迪 说:
数据库100%?
大 双 说:
13机器cpu一直100%
吴 迪 说:
截个图,这很说明问题
大 双 说:
瓶颈在数据库上
吴 迪 说:
截个图到时候给老于看
大 双 发送:
打开(Alt+P)
大 双 说:
你看看
大 双 说:
现在tomcat有没有抛连接失败的错误?
吴 迪 说:
没有
大 双 说:
现在我这边动态页面还是可以打开,只是比较慢
吴 迪 说:
静态还可以
吴 迪 说:
动态的我这边几乎打不开了
大 双 说:
现在只有100的并发量?
吴 迪 说:
很慢很慢
吴 迪 说:
是的,100
大 双 说:
我这能打开,可以打圈子的页面
吴 迪 说:
我在开企业登陆以后的页面
大 双 说:
对了,看下机房提供的流量图
吴 迪 说:
号
大 双 说:
看超过带宽没?
大 双 说:
地址也发我一个
大 双 说:
我这能企业登陆,速度还算可以忍受
吴 迪 说:
http://****************/
您成功地从 大 双 处接收了 C:/Documents and Settings/KenWu/My Documents/cpu.BMP。
吴 迪 说:
我靠,DB的CPU100%真扎实
大 双 说:
嗯,一直100%,不过我这还可以进企业中心操作
大 双 说:
现在比刚才慢了,
吴 迪 说:
用文秘的页面测试吧,或者多加几个页面
吴 迪 说:
用流量较大的页面,看看会不会超过流量
大 双 说:
可能浏览器会自动选择局域网方式连接,
大 双 说:
带宽没超过
吴 迪 说:
不会的,我想不会的
大 双 说:
主要看数据库连接会不会断掉
大 双 说:
刚才生成静态页面的代码会不会有影响,好像去了后,连接要稳定些
吴 迪 说:
快找几个流量大的页面
吴 迪 说:
要动态的
吴 迪 说:
耶,我现在访问动态页面好快
大 双 说:
http://www.****.com/activity/beautifulsecy/index.jsp?cache=false
大 双 说:
这个页面比较大,都是图
吴 迪 说:
参数是对的吗?要不要cache=new?
大 双 说:
都可以
吴 迪 说:
哦,想起来了,这个测试工具不能下载图片
吴 迪 说:
只能下载HTML
吴 迪 说:
我们做测试的这段时间流量好像在下降
大 双 说:
嗯,会不会机房只统计从外面ip来的流量
大 双 说:
机房自己的机器不在其中,
吴 迪 说:
我们自己的访问统计呢?
大 双 说:
我们自己的访问统计应该能统计这段时间首页的流量
大 双 说:
这段时间数据库连接断过没有?
吴 迪 说:
未见异常
吴 迪 说:
// Send message
javax.mail.MessagingException: Could not connect to SMTP host: www.****.co
m, port: 25
at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:855)
at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:15
6)
at javax.mail.Service.connect(Service.java:234)
at javax.mail.Service.connect(Service.java:135)
at dot.st
吴 迪 说:
连邮件服务器倒是出了连接异常
大 双 说:
这个正常,是太忙了,
吴 迪 说:
现在再加大并发,150试试
大 双 说:
你先停一下,我把生成静态页面的加上,再测一次,看连接会不会断来
吴 迪 说:
好
吴 迪 说:
你先改,我现在停掉
吴 迪 说:
停了
大 双 说:
我改了
吴 迪 说:
你用VNC登陆的?
大 双 说:
再测一次,嗯
大 双 说:
PC any连不上了
吴 迪 说:
即将开始测试,并发100
吴 迪 说:
已经开始,并发已经达到100
大 双 说:
好,还是首页index.jsp?cache=new就行
吴 迪 说:
是的还是首页
大 双 说:
现在数据库cpu很闲,
大 双 说:
看来静态页面是有效果的
吴 迪 说:
你观察tomcat
吴 迪 说:
那肯定了
大 双 说:
数据库cpu到100%了
吴 迪 说:
静态页面还是很快,但是动态页面不行了
吴 迪 说:
3号猫是不是挂了
大 双 说:
没有吧
吴 迪 说:
哦,没有
大 双 说:
再停一下,刚才没调用到生成静态页面的地方
大 双 说:
你要访问index.jsp才行,后面不跟参数
吴 迪 说:
打算写个程序来统计这几个CAT的实时运行参数才行,这样刷页面太不方便了
吴 迪 说:
我现在停
大 双 说:
好
吴 迪 说:
都有没有连接异常?
大 双 说:
没有
吴 迪 说:
数据库现在应该下来了吧
大 双 说:
嗯
大 双 说:
下来了
吴 迪 说:
我现在改测试地址
大 双 说:
好
吴 迪 说:
改了,准备开始测试
大 双 说:
好
吴 迪 说:
刚才的测试,在12上没有报连接异常
大 双 说:
哦
吴 迪 说:
测试已经开始
吴 迪 说:
这个时候出现了很多59.151.*.* www.****.com GET /index.jsp?cache=false HTTP/1.1
大 双 说:
是的
吴 迪 说:
在MANAGER里面
吴 迪 说:
现在总的Current thread busy提高了好几倍
吴 迪 说:
这个地方有问题
大 双 说:
现在数据库cpu还是100%
大 双 说:
好像静态页面没起来效果一样
吴 迪 说:
我认为出现59.151.*.* www.****.com GET /index.jsp?cache=false HTTP/1.1
不正常
大 双 说:
理论上讲直接跳到静态页面应该不占数据库
吴 迪 说:
只是跳吗?只是转向?
大 双 说:
是的,我再看一下那段代码
吴 迪 说:
现在的并发大概200多
吴 迪 说:
而实际的并发只有100
吴 迪 说:
我估计上午10点出现的问题就是这个导致的.
大 双 说:
嗯,是有问题
大 双 说:
并发量好像扩大了一倍
吴 迪 说:
不过现在静态页面还能很顺利地打开
吴 迪 说:
是的,本来只有100的并发量,现在算起来有近200
大 双 说:
<%if(request.getParameter("cache")==null){%>
<jsp:include page='cache/cache_page.jsp' flush='true'>
<jsp aram name="HttpRoot" value="http://www.****.com"></jsp aram>
<jsp aram name="FilePath" value="/"></jsp aram>
<jsp aram name="CurrentURL" value="/index.jsp"></jsp aram>
</jsp:include>
<%
return;
}%>
大 双 说:
我估计在return;后面的代码,在tomcat里执行了...
大 双 说:
这样一来,静态页面和动态页都打了
吴 迪 说:
我也在怀疑return到底有没有结束
大 双 说:
你现在再试试,访问www.****.com
吴 迪 说:
你要看缓存里被编译过的那个SERVLET的源代码
大 双 说:
这个默认的是静态页面,看此时的数据库压力大不大
吴 迪 说:
你的意思是现在测试WWW.****.COM?
大 双 说:
是的
吴 迪 说:
我觉得现在访问动态页面还行,不是很慢,还能接受
大 双 说:
嗯
吴 迪 说:
我现在停测试
大 双 说:
但现在数据库cpu是100%
吴 迪 说:
看来数据库有必要加CPU
大 双 说:
嗯,明天可能得去机房
大 双 说:
刚才张总说了
大 双 说:
他在线
吴 迪 说:
:(
大 双 说:
现在启动www.****.com测试没
吴 迪 说:
准备启动
大 双 说:
好
吴 迪 说:
已经启动
吴 迪 说:
对TOMCAT没有影响
吴 迪 说:
数据库呢?
大 双 说:
数据库好像没有明显的影响
大 双 说:
TOMCAT也没有明显的影响
吴 迪 说:
我现在用并发800试试
大 双 说:
==
大 双 说:
观察一下
吴 迪 说:
好
吴 迪 说:
这完全由APACHE承担
吴 迪 说:
我估计给APACHE加到800都不会有问题
大 双 说:
嗯,看来静态页面优化很重要,我之前做的有问题
吴 迪 说:
明天还是把那一段去掉吧,要不然并发又会加倍
大 双 说:
好
吴 迪 说:
你现在去掉,我把并发加到800,加到动态页面上
大 双 说:
我刚去了
吴 迪 说:
我现在可以开始测试吗?
大 双 说:
可以
吴 迪 说:
哪个页面?
吴 迪 说:
要动态的
大 双 说:
http://www.****.com/index.jsp
大 双 说:
不用参数就行
吴 迪 说:
好,稍等
吴 迪 说:
准备开始
吴 迪 说:
已经开始
吴 迪 说:
现在是100
大 双 说:
数据库cpu到100%
吴 迪 说:
每个猫上的压力25左右
大 双 说:
嗯
吴 迪 说:
4个猫刚好100压力
大 双 说:
是的,
吴 迪 说:
现在我停掉,改用800
大 双 说:
好
吴 迪 说:
准备观察数据库,tomcat的连接情况
大 双 说:
好
吴 迪 说:
准备开始
吴 迪 说:
已经开始
吴 迪 说:
测试并发已经达到800
吴 迪 说:
3号tomcat Current thread busy: 208
大 双 说:
嗯,差不多200左右
吴 迪 说:
1号 Current thread busy: 208
吴 迪 说:
4号 Current thread busy: 211
大 双 说:
11上tomcat好像没占多少cpu
大 双 说:
数据库cpu还是100%
吴 迪 说:
2号 Current thread busy: 220
吴 迪 说:
4个猫,刚好800
吴 迪 说:
连接有没有异常?
大 双 说:
异常了
大 双 说:
连接异常了
吴 迪 说:
连接?
大 双 说:
是的
吴 迪 说:
我进VNC看看
大 双 说:
java.sql.SQLException: Network error IOException: Connection refused: connect
at net.sourceforge.jtds.jdbc.ConnectionJDBC2.(ConnectionJDBC2.java
:372)
at net.sourceforge.jtds.jdbc.ConnectionJDBC3.(ConnectionJDBC3.java
大 双 说:
好
吴 迪 说:
连接被拒绝了
吴 迪 说:
你试试开动态页面
大 双 说:
基本打不开
大 双 说:
很慢,哦,打开了
大 双 说:
还是可以打开,只是比较慢,我连打了六个页面,都开了,都是职位显示页
吴 迪 说:
连接被拒绝的异常不频繁
吴 迪 说:
不是致命的异常
大 双 说:
现在tomcat后台连接数好像少了
吴 迪 说:
tomcat仍然在运行
大 双 说:
每个只有几十
大 双 说:
Current thread busy: 37
吴 迪 说:
测试并发还是800
吴 迪 说:
我也看到了,确实少了很多
吴 迪 说:
很奇怪的现象
大 双 说:
是啊,而且现在页面速度好像变快了
吴 迪 说:
八成是回光返照
大 双 说:
呵
大 双 说:
一两秒可以打开页面
大 双 说:
但数据库cpu一直是100%
吴 迪 说:
tomcat没有报拒绝连接异常
吴 迪 说:
我把测试停了再开
大 双 说:
会不会是缓存的作用
大 双 说:
apache?tomcat?
吴 迪 说:
什么缓存?
大 双 说:
apache 的缓存?
大 双 说:
c:/下的文件?
吴 迪 说:
APACHE的磁盘缓存已经停了
大 双 说:
哦
吴 迪 说:
准备开测试,并发800
大 双 说:
==
大 双 说:
刚才停了吗?
大 双 说:
怎么数据库cpu还是100%
吴 迪 说:
还没有停止
大 双 说:
现在降了
大 双 说:
现在降下来了
大 双 说:
你还不回去?
吴 迪 说:
准备开始
大 双 说:
很晚了........
吴 迪 说:
我的钥匙被那个**拿走了
大 双 说:
呵,明天再测吧
吴 迪 说:
开始测试
吴 迪 说:
现在并发800
大 双 说:
好
大 双 说:
现在每个是200左右
吴 迪 说:
2号tomcat连接池死锁
吴 迪 说:
1号 死锁
吴 迪 说:
4号报死锁
大 双 说:
是之前那个错误么?
大 双 说:
No buffer space available (maximum connecti
ons reached?): connect?
吴 迪 说:
不是这个
吴 迪 说:
非致命的警告,警告而已.
大 双 说:
哦
吴 迪 说:
看看动静页面能不能开
大 双 说:
动态页面很慢,基本打不开,
吴 迪 说:
静态页面没有问题
吴 迪 说:
动态页面基本可以开
大 双 说:
静态页面可以打开,还行
吴 迪 说:
很慢
大 双 说:
嗯,动态页面过一会还是可以开
吴 迪 说:
http://www.***.com/activity/beautifulsecy/index.jsp?cache=false
可以开,还行
大 双 说:
静态页面
大 双 说:
Current thread busy: 4
大 双 说:
又降了
大 双 说:
每个tomcat的都降了
吴 迪 说:
看到了
吴 迪 说:
数据库呢?
大 双 说:
数据库也降了
大 双 说:
是不是没有压力测试了?
大 双 说:
还是压力测试的程序死了?
吴 迪 说:
测试没有停
大 双 说:
早点休息吧,我不行了,明天再测吧....
吴 迪 说:
就这样吧,基本上有结论了,那就是:网站可以承受800的并发,并且压力越大tomcat越闲,
于是老于笑了....
我回去睡觉了,12点了.
吴 迪 说:
哦对了,停掉测试
大 双 说:
好,呵
大 双 说:
886
吴 迪 说:
我走啦
吴 迪 说:
88