服务器配置:linux+tomcat
现象:Linux服务器没有崩,有浏览器中访问页面,出现无法访问的情况,没有报4xx或5xx错误(假死),并且重启tomcat后,恢复正常。
原因:tomcat默认最大连接数(线程数)200个,默认每一个连接的生命周期2小时(7200秒),tomcat使用http 1.1协议,而http1.1默认是长连接。tomcat接受处理完请求后,socket没有主动关闭,因此如果在2小时内,请求数超过200个,服务器就会出现上述假死现象。
解决方案1:及时断开socket
解决方案2:修改tomcat配置文件,修改最大连接数(增大)
修改server.xml配置文件,Connector节点中增加acceptCount和maxThreads这两个属性的值,并且使acceptCount大于等于maxThreads:
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" acceptCount="500" maxThreads="400" />
解决方案3:修改linux的TCP超时时间(socket生命周期)限制
1
2
3
4
5
6
7
8
9
10
11
12
|
vi /etc/sysctl .conf # Decrease the time default value for tcp_fin_timeout connection net.ipv4.tcp_fin_timeout = 30 # Decrease the time default value for tcp_keepalive_time connection net.ipv4.tcp_keepalive_time = 1800 # 探测次数 net.ipv4.tcp_keepalive_probes=2 # 探测间隔秒数 net.ipv4.tcp_keepalive_intvl=2 编辑完 /etc/sysctl .conf,要重启network 才会生效 [root@temp /] # /etc/rc.d/init.d/network restart |
参考:
http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=4091262
http://www.xuebuyuan.com/1584364.html
http://blog.163.com/kel_scott66/blog/static/11505396320097245547700/
--------------------------------------------------------------------------------------------------------
tomcat 开启远程manger的办法
首先需要修改tomcat/conf/tomcat-users.xml的用户权限修改为:
<role rolename="admin-gui"/>
<role rolename="manager-gui"/>
<user username="admin" password="1234" roles="admin-gui,manager-gui"/>
其次修改tomcat/webapps/host-manager/META-INF/context.xml和tomcat/webapps/manager/META-INF/context.xml,原始代码为:
<Context antiResourceLocking="false" privileged="true" >
<Valve className="org.apache.catalina.valves.RemoteAddrValve"
allow="127.d+.d+.d+|::1|0:0:0:0:0:0:0:1" />
<Manager sessionAttributeValueClassNameFilter="java.lang.(?:Boolean|Integer|Long|Number|String)|org.apache.catalina.filters.CsrfPreventionFilter$LruCache(?:$1)?|java.util.(?:Linked)?HashMap"/>
</Context>
修改为:
<Context antiResourceLocking="false" privileged="true" >
<Valve className="org.apache.catalina.valves.RemoteAddrValve"
allow="^.*$" />
<Manager sessionAttributeValueClassNameFilter="java.lang.(?:Boolean|Integer|Long|Number|String)|org.apache.catalina.filters.CsrfPreventionFilter$LruCache(?:$1)?|java.util.(?:Linked)?HashMap"/>
</Context>
修改完成后不用重启tomcat,再进行远程访问,即可。
====================================================
最佳实践调优,用执行器。
====================================================
另外调优tomcat的方法,
tomcat的读写io的方式,有3种
bio,nio,apr,
其中bio是最元始的,效果最差。
apr是最新的,配置太过于繁琐,但是从操作系统级别来解决异步的IO问题,能大幅度提交性能。
这里介绍nio,并且带executor,执行器。
如下:
执行器优化(线程池)
在tomcat中每一个用户请求都是一个线程,所以可以使用线程池提高性能。
开启并且使用
在Connector中指定使用共享线程池
查看Tomcat控制台
Executor重要参数说明:
name:共享线程池的名字。这是Connector为了共享线程池要引用的名字,该名字必须唯一。默认值:None;
namePrefix:在JVM上,每个运行线程都可以有一个name 字符串。这一属性为线程池中每个线程的name字符串设置了一个前缀,Tomcat将把线程号追加到这一前缀的后面。默认值:tomcat-exec-;
maxThreads:该线程池可以容纳的最大线程数。默认值:200;
maxIdleTime:在Tomcat关闭一个空闲线程之前,允许空闲线程持续的时间(以毫秒为单位)。只有当前活跃的线程数大于minSpareThread的值,才会关闭空闲线程。默认值:60000(一分钟)。
minSpareThreads:Tomcat应该始终打开的最小不活跃线程数。默认值:25。
threadPriority:线程的等级。默认是Thread.NORM_PRIORITY
Connector重要参数说明:
executor:表示使用该参数值对应的线程池;
minProcessors:服务器启动时创建的处理请求的线程数;
maxProcessors:最大可以创建的处理请求的线程数;
acceptCount:指定当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,超过这个数的请求将不予处理。
参数最佳实践
禁用AJP连接器
AJP(Apache JServer Protocol)
AJPv13协议是面向包的。WEB服务器和Servlet容器通过TCP连接来交互;为了节省SOCKET创建的昂贵代价,WEB服务器会尝试维护一个永久TCP连接到servlet容器,并且在多个请求和响应周期过程会重用连接。
我们一般是使用Nginx+tomcat的架构,所以用不着AJP协议,所以把AJP连接器禁用。
在管理界面中看不到ajp了:
完成上面几步对Tomcat的优化配置,你的Tomcat服务器并发量肯定会有大幅度的提升。这只是简单的配置,后续还会有针对JVM的专项介绍。JVM参数也是影响Tomcat性能的一个重要因素。
==========================================
tomcat 8 在阿里云centos部署巨慢的问题。
是因为随机数生成器
cat /proc/sys/kernel/random/entropy_avail
用上面此命令查看当前随机数熵池,
没有优化时,随机数值大约20多。安装rngd后,值为3000多,安装java优化参数后,值为300-400多.
--------------------------------------------
以下是安装rng服务器的步骤:
yum install rng-tools 安装rngd服务。
systemctl start rngd
如果cpu是不支持rng特性或是使用虚拟机,可以使用/dev/urandom来模拟
cp /usr/lib/systemd/system/rngd.service /etc/systemd/system
或者 systemctl enable rngd 若删除 disable
编辑/etc/systemd/system/rngd.service
ExecStart=/sbin/rngd -f -r /dev/urandom
systemctl daemon-reload 重载服务
systemctl restart rngd 重启
另外一个方法:
在tomcat/bin/catalina.sh中添加如下语句:
JAVA_OPTS="$JAVA_OPTS -Djava.security.egd=file:/dev/./urandom" ,加入到原有的JAVA_OPTS的后面。这种方法安装后,cat /proc/sys/kernel/random/entropy_avail 的值为300多
===============================================
部署war在根目录
修改server.xml文件
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true"> <!-- SingleSignOn valve, share authentication between web applications Documentation at: /docs/config/valve.html --> <!-- <Valve className="org.apache.catalina.authenticator.SingleSignOn" /> --> <!-- Access log processes all example. Documentation at: /docs/config/valve.html Note: The pattern used is equivalent to using pattern="common" --> <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log" suffix=".txt" pattern="%h %l %u %t "%r" %s %b" /> <!-- deployed at root dir -- // 以下这段是部署在根目录 -->
<Context path="" docBase="/www/webapps/zhouyi2/" /> </Host>