Tomcat在Linux下压力超不过250人并发 .

今天很郁闷,之前搭建了一个redhat集群,访问其中一台服务器下的liferay5.2.2的某一个数据量很少的界面,并发量能达到1000人,但是另一台高配的Linux服务器并发量最高却只能达到250人,两台服务器的集成Portal的Tomcat配置都一样,并且JVM Head为2G,这台高配的Linux服务器一但到了250人就会立马down掉,弄了一天总算解决了,发现原因是Linux的配置
硬件环境:
OS:redhat as 5 2.6.18-128.el5 x86_64
内存:16G
CPU:32
软件环境:
集成Portal的Tomcat5.5.27
jdk1.6.0_13
Tomcat参数配置:
<Connector port="8080" maxHttpHeaderSize="8192"
maxThreads="3000" minSpareThreads="50" maxSpareThreads="200"
enableLookups="false" redirectPort="8443" acceptCount="1500"
connectionTimeout="60000" disableUploadTimeout="true" URIEncoding="UTF-8" minProcessors="100" maxProcessors="3000"/>
Tomat启动参数配置:
JAVA_OPTS="$JAVA_OPTS -Xms2048m -Xmx2048m -XX:MaxPermSize=512m -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -XX:SurvivorRatio=20 -XX:ParallelGCThreads=8 -Dfile.encoding=GBK -Duser.timezone=GMT+8 -Djava.security.auth.login.config=$CATALINA_HOME/conf/jaas.config -Dorg.apache.catalina.loader.WebappClassLoader.ENABLE_CLEAR_REFERENCES=false"
1.当发现这个问题时,首先把oracle并发访问产生的问题给排除,因为集群中某一台并发1000的Linux服务器也是连接的这个Oracle服务器,如果说是oracle的问题,那么集群中其他节点的并发都不会超过250人
2.集群中两台Linux服务器硬件一样,Tomcat一样(访问同一个Tomcat,基于GFS分布式文件系统),JRE也一样.这样看来唯一产生问题的就是Linux环境配置问题.
3.后面想想,有人之前已经对两台Linux服务器做了相同的优化处理,那么可能问题没有出在这里(很大怀疑是这个地方的问题),于是先把问题放一放,去解决一个另一个在Linux下产生的问题(图片明明存在,通过图片路径构件一个RenderedOp对象获取高度时却报错,说找不到这个图片),很奇怪,为什么这个问题也是在这台服务器上产生的呢?(更加怀疑是这台服务器环境设置问题了)
4.于是在这台Linux服务器上装了一个Eclipse准备调试,在eclipse中启动Tomcat时发现又没那个错误了,不通过eclipse启动那错误又产生了.仔细检查了一下,是因为我eclipse设置的启动参数JVM Head为1G,而脚本启动文件设置的是2G,于是我将tomcat启动脚本文件也设置为1G,发现正常启动,没问题,这让我有点犯迷糊了,为什么另一台设置成2G却正常呢?回头再改成2G,仔细看了下错误:"too many file open",好象是不让打开太多文件(打开一个Buffer还未关闭,接着打开另一个),同样的硬件环境和软件环境,为什么这台会有这样的问题呢?最有可能导致的原因就是操作系统环境设置问题!.
5.在网上google了一下"too many file open",发现的确是Linux环境设置问题,Linux环境有个设置open files的地方,于是将open files改成2048(命令为:ulimit -n 2048),接着把之前tomcat启动脚本还原,启动脚本发现没有报错.
6.确定是Linux环境后,我再仔细对比了一下两台Linux服务器的配置参数,发现不一样,原来是这台Linux没有做优化导致的原因,于是将这台并发不过250的服务器优化了一下,命令如下:
● 增加文件描述符
ulimit -n 65535
echo 65532 > /proc/sys/fs/file-max
● 优化TCP/IP设置
echo 30 > /proc/sys/net/ipv4/tcp_fin_timeout
echo 60000 > /proc/sys/net/ipv4/tcp_keepalive_time
echo 15000 > /proc/sys/net/ipv4/tcp_keepalive_intvl
echo 0 > /proc/sys/net/ipv4/tcp_window_scaling
● 其他优化
#使用更多的本地端口
echo 1024 25000 > /proc/sys/net/ipv4/ip_local_port_range
#增加更多的socket buffer内存(参考)
echo 2621143 > /proc/sys/net/core/rmem_max
echo 262143 > /proc/sys/net/core/rmem_default
echo 4096 131072 262143 > /proc/sys/net/ipv4/tcp_rmem
echo 4096 13107262143 > /proc/sys/net/ipv4/tcp_wmem
#增加运行期所需的shm内存(参考)
echo "67108864" > /proc/sys/kernel/shmmax
echo 16777216 > /proc/sys/net/core/rmem_max
echo 16777216 > /proc/sys/net/core/wmem_default
echo 16777216 > /proc/sys/net/core/wmem_max
echo 4096 > /proc/sys/net/core/somaxconn
echo 262143 > /proc/sys/net/core/rmem_default
7.优化完后,再一次对这太做压力测试,成功了,并发到1000时,访问liferay5.2.2这个数据量较少的页面,也比较流畅,响应时间在5秒左右
8.后面问了下老大这台Linux做过优化没,老大说做过了,我就郁闷了,明明没做嘛!后面才发现ulimit -n只是暂时的,重起后就不生效了,需要修改下limits.conf文件,在该文件底部加上:
* soft nofile 32768
* hard nofile 32768
Tags: 

延伸阅读

最新评论

发表评论