记一次服务器Tomcat优化经历
公司需要一台测试服务器来做测试用,所以花了几天时间把服务全部部署好,在部署好war包之后,发现Tomcat访问慢。
1、进入Tomcat的bin目录下,运行
./catalina.sh run命令,在前台打印运行信息,首先看其有没有报错。好,没有报错,进行下一步。
1)修改你的jdk目录下/jre/lib/security目录下的java.security这个文件,将securerandom.source=file:/dev/random改成securerandom.source=file:/dev/./urandom,这是Java官方给的解决方案,修改随机数。
2)修改Tomcat目录下conf目录下server.xml文件配置:
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="40000"
redirectPort="8443" URIEncoding="UTF-8"
acceptCount="4000" maxThreads="5000"
compression="on" compressionMinSize="2048"
compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain"
disableUploadTimeout="true" debug="0"
maxHttpHeaderSize="8192" useBodyEncodingForURI="true" minProcessors="100" maxProcessors="5000"
minSpareThreads="1000" maxSpareThreads="4000" enableLookups="false"/>
2、top查看线程,看看java有没有特别高的占用,有的话,用jstack pid追踪查看是哪的语句造成的。
3、设置JVM运行大小,及配置优化参数,在Tomcat目录bin目录下vim catalina.sh
在# OS specific support. $var _must_ be set to either true or false.这一行下加入:
export JAVA_OPTS="-server -Xms1400M -Xmx6144M -Xss1024k -XX:+AggressiveOpts -XX:+UseBiasedLocking -XX:+DisableExplicitGC -XX:MaxTenuringThreshold=14 -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+CMSParallelRemarkEnabled -XX:LargePageSizeInBytes=128m -XX:+UseFastAccessorMethods -XX:+UseCMSInitiatingOccupancyOnly -Djava.awt.headless=true "
4、nginx+Tomcat做动静分离设置,加快网页载入速度,我的nginx配置如下:
负载均衡配置:
upstream gw {
server localhost:8080;
}
在http模块里加入:
proxy_cache_key '$host:$server_port$request_uri';
proxy_temp_file_write_size 64k;
proxy_temp_path /dev/shm/cache/proxy_temp_path;
proxy_cache_path /dev/shm/cache/proxy_cache_path levels=1:2 keys_zone=cache_one:200m inactive=5d max_size=1g;
proxy_ignore_headers X-Accel-Expires Expires Cache-Control Set-Cookie;
server配置:
server {
listen 80;
server_name localhost 192.168.1.111:8080;
access_log /data/wwwlogs/access_nginx.log combined;
location ~ ^/crossdomain.xml {
root /usr/local/crossdomain;
}
location ~ .*\.(js|css|ico|png|jpg|eot|svg|ttf|woff) {
proxy_cache cache_one;
proxy_cache_valid 200 304 302 5d;
proxy_cache_valid any 5d;
proxy_cache_key '$host:$server_port$request_uri';
add_header X-Cache '$upstream_cache_status from $host';
root /usr/local/tomcat/gw/webapps/gw/WEB-INF ;
expires 10d;
}
location ~ .*$ {
#index index;
proxy_pass http://gw;
}
}
5、配置Tomcat+mysql连接池,在http://tomcat.apache.org/tomcat-7.0-doc/jndi-datasource-examples-howto.html这个网址里可以看到示例。
在conf目录下编辑context.xml文件,注释:<WatchedResource>WEB-INF/web.xml</WatchedResource>默认。
添加:
<Resource name="jdbc/zhi"
auth="Container"
type="javax.sql.DataSource"
factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
testWhileIdle="true"
testOnBorrow="true"
testOnReturn="false"
validationQuery="SELECT 1"
validationInterval="30000"
timeBetweenEvictionRunsMillis="30000"
maxActive="1000"
minIdle="10"
maxWait="20000"
initialSize="10"
removeAbandonedTimeout="60"
removeAbandoned="true"
logAbandoned="true"
minEvictableIdleTimeMillis="30000"
jmxEnabled="true"
jdbcInterceptors="org.apache.tomcat.jdbc.pool.interceptor.ConnectionState;
org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer"
username="root"
password="用户密码"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://你所要连接数据库的地址"/>
在WEB-INF目录下编辑web.xml文件,在<web-app>中加入:
<description>MySQL Test App</description>
<resource-ref>
<description>DB Connection</description>
<res-ref-name>jdbc/zhi</res-ref-name> #名字要对应
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
注意要将数据驱动包放在Tomcat的lib目录下,否则会提示找不到数据驱动。
连接池配置完成。
6、首先./shutdown.sh,然后运行./catalina.sh run命令,同时在网页打开你要打开的网页,查看输出,可以看到网页调用数据库等信息,计算下连接数据库所需时间,看是否要优化数据库。我就卡在这一步上了,Tomcat是秒速反应,但是在连接数据库时耗费的时间在6S左右。由于数据库在另一台公网服务器上,所以也只能凑合用了。
tomcat优化有四种:JVM优化,连接池优化,线程优化,内存优化。
原来打开网页要20多秒,经过优化,测试服务器载入网页速度快了最少13秒以上。