Tomcat性能优化:
每个web客户端请求对于服务器端来说就一个单独的线程,客户端的请求数量增多将会导致线程数就上去了,CPU就忙着跟线程切换。
而NIO则是使用单线程(单个CPU)或者只使用少量的多线程(多CPU)来接受Socket,而由线程池来处理堵塞在pipe或者队列里的请求.这样的话,只要OS可以接受TCP的连接,web服务器就可以处理该请求。大大提高了web服务器的可伸缩性。
大家都听说了在Apache Tomcat6 中支持了Java语言的特性 NIO( New I/O),不管你对NIO的技术是否熟悉,但你肯定能想象的到NIO是一个好东西。的确,使用NIO在服务器端会有更好的性能,加强服务器端对并发处理的性能。 请注意:很抱歉,在tomcat6在默认的配置选项中是没有把NIO功能打开。所以很多正在使用Tomcat6的朋友们本以为能快活的使用上NIO。
不信,你可以试试,从Apache Tomcat 站点下载 的Tomct6 压缩包中 conf/server.xml的 配置文件第69行,内容如下:
|
<Connector
port
=
"8080"
protocol
=
"HTTP/1.1"
connectionTimeout
=
"20000"
redirectPort
=
"8443"
/>
|
进行测试,可以在控制台的启动信息里看见,默认状态下没有被打开nio配置,启动时的信息,如下:
|
2010
-
2
-
1
12
:
59
:
40
org
.
apache
.
coyote
.
http11
.
Http11Protocol
init
信息
:
Initializing
Coyote
HTTP
/
1.1
on
http
-
8080
2010
-
2
-
1
12
:
59
:
40
org
.
apache
.
catalina
.
startup
.
Catalina
load
|
修改成支持NIO的类型,配置如下:
|
<Connector
port
=
"8080"
protocol
=
"org.apache.coyote.http11.Http11NioProtocol"
connectionTimeout
=
"20000"
redirectPort
=
"8443"
/>
|
进行测试,被打开nio配置,启动时的信息,如下:
|
2010
-
2
-
1
13
:
01
:
01
org
.
apache
.
tomcat
.
util
.
net
.
NioSelectorPool
getSharedSelector
信息
:
Using
a
shared
selector
for
servlet
write
/
read
2010
-
2
-
1
13
:
01
:
01
org
.
apache
.
coyote
.
http11
.
Http11NioProtocol
init
信息
:
Initializing
Coyote
HTTP
/
1.1
on
http
-
8080
|
这样才能让你真正体验到Tomcat6下NIO给你的系统带来的快感。
–end–
黄海的配置:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
<Connector
port
=
"8080"
protocol
=
"org.apache.coyote.http11.Http11NioProtocol"
executor
=
"tomcatThreadPool"
compression
=
"on"
compressionMinSize
=
"2048"
maxThreads
=
"30000"
minSpareThreads
=
"512"
maxSpareThreads
=
"2048"
enableLookups
=
"false"
redirectPort
=
"8443"
acceptCount
=
"35000"
debug
=
"0"
connectionTimeout
=
"40000"
disableUploadTimeout
=
"true"
URIEncoding
=
"UTF-8"
useBodyEncodingForURI
=
"true"
/>
|
连接器使用的线程池的名子:executor=”tomcatThreadPool”
连接器端口 :port=”8090″
连接器使用的传输方式 :protocol=”org.apache.coyote.http11.Http11NioProtocol”
传输时是否支持压缩 :compression=”on”
压缩的大小 :compressionMinSize=”2048″
3.设置Tomcat连接器池。
|
<Executor
name
=
"tomcatThreadPool"
namePrefix
=
"catalina-exec-"
maxThreads
=
"1000"
minSpareThreads
=
"350"
/>
|
黄海在配置文件中添加了如下配置:
|
<Executor
name
=
"tomcatThreadPool"
namePrefix
=
"catalina-exec-"
maxThreads
=
"1000"
minSpareThreads
=
"350"
/>
|
线程池名: name=”tomcatThreadPool”
线程前缀: namePrefix=”catalina-exec-”
最大产生线程数:maxThreads=”1000″
最小初始现程数:minSpareThreads=”350″
解决Tomcat APR – tcnative-1.dll引起的 “Socket accept failed WSACancelBlockingCall”问题
问题描述:
系统环境(在 Tomcat Server Status 中直接复制过来)
Tomcat Version | JVM Version | JVM Vendor | OS Name | OS Version | OS Architecture |
Apache Tomcat/6.0.32 | 1.6.0_20-b02 | Sun Microsystems Inc. | Windows XP | 5.1 | x86 |
在 Tomcat 的 $CATALINA_HOME/bin 目录下加了 tcnative-1.dll ,结果关闭服务时出现如下错误。
Logs/catalina.2011-08-02.log 代码
|
2011
-
8
-
2
9
:
03
:
53
org
.
apache
.
tomcat
.
util
.
net
.
AprEndpoint
$
Acceptor
run
严重
:
Socket
accept
failed
org
.
apache
.
tomcat
.
jni
.
Error
:
A
blocking
operation
was
interrupted
by
a
call
to
WSACancelBlockingCall
.
at
org
.
apache
.
tomcat
.
jni
.
Socket
.
accept
(
Native
Method
)
at
org
.
apache
.
tomcat
.
util
.
net
.
AprEndpoint
$
Acceptor
.
run
(
AprEndpoint
.
java
:
1109
)
at
java
.
lang
.
Thread
.
run
(
Thread
.
java
:
595
)
2011
-
8
-
2
9
:
03
:
53
org
.
apache
.
coyote
.
ajp
.
AjpAprProtocol
destroy
信息
:
Stopping
Coyote
AJP
/
1.3
on
ajp
-
8009
|
解决:
问题根源 :你下载的 tcnative-1.dll 文件不是 Tomcat 原始使用的那个版本文件
在 $CATALINA_HOME/webapps/docs/apr.html 打开其官方 Apache Portable Runtime (APR) 文档 描述,其 APR 包的源码在 bin/tomcat-native.tar.gz 归档文件中。所以,打开该文件就可以知道该 Tomcat native 的版本是多少,然后就到 Tomcat native 下载中心 下载相同版本的 tcnative-1.dll 和 openssl.exe 即可。问题搞定了, 就 这么简单!如果版本不一样,就可能会出现上面这个问题,这就是引起该问题的根源所在。
纯属转载,原文地址:http://www.tbdazhe.com/archives/486 点击打开链接