1. tomcat线程名称设置
一.tomcat的优化
1.tomcat的自身调优
采用动静分离
调优Tomcat线程池
调优Tomcat的连接器Connector
通过修改Tomcat的运行模式
禁用AJP连接器
2.JVM的调优
内存调优
垃圾回收策略调优
下面对Tomcat的优化进行详细的说明.
二.tomcat的自身调优
采用动静分离
静态资源如果让Tomcat处理的话,Tomcat的性能会损耗很多所以一般采用Nginx+Tomca实现动静分离,让Tomcat只负责jsp文件的解析工作,Nginx是实现静态资源的访问.
调优Tomcat线程池
打开Tomcat的server.xml,配置Executor
2. java 设置线程名称
在Java中每一个线程都归属于某个线程组管理的一员,例如在主函数main()主工作流程中产生一个线程,则产生的线程属于main这个线程组管理的一员。简单地说,线程组就是由线程组成的管理线程的类,这个类是java.lang.ThreadGroup类。定义一个线程组,通过以下代码可以实现。
ThreadGroup group=new ThreadGroup("group")
;Thread thread=new Thread(group,"the first thread of group")
;ThreadGroup类中的某些方法,可以对线程组中的线程产生作用。
例如,setMaxPriority()方法可以设定线程组中的所有线程拥有最大的优先权。
所有线程都隶属于一个线程组。那可以是一个默认线程组,亦可是一个创建线程时明确指定的组。
在创建之初,线程被限制到一个组里,而且不能改变到一个不同的组。
每个应用都至少有一个线程从属于系统线程组。
若创建多个线程而不指定一个组,它们就会自动归属于系统线程组。
线程组也必须从属于其他线程组。必须在构建器里指定新线程组从属于哪个线程组。
若在创建一个线程组的时候没有指定它的归属,则同样会自动成为系统线程组的一名属下。
因此,一个应用程序中的所有线程组最终都会将系统线程组作为自己的“父” -----------------河南新华
3. tomcat配置变量
Apache tomcat 是目前最为流行的java网站开发的服务器软件。下面介绍一下tomcat 8的安装流程。
1、进入apache官网下载tomcat 8.在左手边的菜单区,选择download下的tomcat8 版本。根据你操作系统选择不同的下载文件,建议下载.zip格式的软件包,这样免于安装直接用。如下图:
2、将安装文件下载到本地硬盘,如图:
3、下载完成后进入到文件目录,解压缩刚刚下载的软件包。
4、打开软件,可以看到软件包的目录,bin -- 文件夹主要是存放Tomcat服务启动相关的执行档及相关设定。 conf -- 文件夹主要是存放Tomcat服务器相关的设定。 webapps -- 文件夹主要是存放Tomcat管理网站及日后开发好的JSP网站布署的地方。 logs -- 文件夹主要是存放Tomcat日志文件存放的地方。
5、当然这样下载之后是不能直接运行的,还需要下载jdk(可以在sun官网下载).还需要配置环境变量。进入“控制面板”,鼠标单击单击”系统与安全“。如下图:
6、单击”系统后,选择“系统高级设置”。如下图:
7、选择“环境变量”,进行环境变量的设置。如下图:
8、选择“新增”,针对某个用户就选择上面的新增。针对全部用户就选择系统下的新增。建议选择系统下面的新增。如下图:
9、新增或者编辑“变量名:CLASSPATH”,变量值就是%TOMCAT_HOME%\BIN,实际上就是指定tomcat的路径。
10、tomcat环境变量配置完成。下面可以启动tomcat了。运行tomcat目录/bin/startup。
11、tomcat 开始运行,弹出运行对话框。如下图:
运行成功。tomcat 配置完成。
4. tomcat配置项目名
war在哪才能使用,取决于你的配置文件tomcat下会有一个webapp文件夹,这里就是默认的,存放war的路径。
如你想更改,那么你打开conf文件夹下的server.xml文件,你会找到这句话:<pre t="code" l="xml"><Host appBase="webapps" autoDeploy="true" name="localhost" unpackWARs="true">appBase所指定的就是默认的文件夹路径,这里使用的是相对路径,tomcat会根据自动配置的环境变量来找到自己的安装根目录,然后在加上webapps就是完整路径了。
如果你想把自己的项目放到其它地方,比如tomcat安装在C盘,项目放到D盘,你可以修改为<pre t="code" l="xml"><Host appBase="D:/myProject/xxx" autoDeploy="true" name="localhost" unpackWARs="true">所以war可以在哪里使用,取决于你的配置路径。多说一句:Host标签下还有一个Context标签,也是用来指定项目前缀或路径的,当二者都使用绝对路径时,会导致项目被加载2次,需注意。
5. tomcat多线程配置
maxThreads:tomcat起动的最大线程数,即同时处理的任务个数,默认值为200
acceptCount:当tomcat起动的线程数达到最大时,接受排队的请求个数,默认值为100
6. 设置线程的名字有几种方法
指针,,递归,算法,线程,Debug,全栈,变量,继承,封装,泛型,多态
7. tomcat配置详解
1.启动MyEclipse
2.选项Window->Preferences->MyEclipse->Severs->Tomcat->Tomcat7.x
将Tomcat 7.x server选项改成Enable
3.Tomcat base directory中的路径设置成Tomcat服务器的安装路径,设置完成后其他的两个路径Tomcat base directory的路径和Tomcat temp directory的路径会自动设置好
4.选择Tomcat 7.x下的JDK节点,并且将JDK设置成1.6
5.选择Tomcat 7.x节点下的Launch节点,并且Default Tomcat 7.x launch mode设置成Run mode
此时已经成功的在MyEclipse上搭建好了Tomcat服务器
8. tomcat 线程数设置
Tomcat 默认配置的最大请求数是 150,也就是说同时支持 150 个并发,当然了,也可以将其改大。 当某个应用拥有 250 个以上并发的时候,应考虑应用服务器的集群。 具体能承载多少并发,需要看硬件的配置,CPU 越多性能越高,分配给 JVM 的内存越多性能也就越高,但也会加重 GC 的负担。 操作系统对于进程中的线程数有一定的限制: Windows 每个进程中的线程数不允许超过 2000 Linux 每个进程中的线程数不允许超过 1000 另外,在 Java 中每开启一个线程需要耗用 1MB 的 JVM 内存空间用于作为线程栈之用。
9. tomcat最大线程数配置方案
Socket参数选项:
1、TCP_NODELAY:表示立即发送数据。
2、SO_RESUSEADDR:表示允许重用Socket所绑定的本地地址
3、SO_TIMEOUT:表示接受数据时的超时时间。
4、SO_LINGER:表示当执行close();方法时候,是否理解关闭底层的socket。(Reset报文)
setSoLinger(true, 0): 执行该方法,那么执行Socket的close方法,该方法也会立即返回,但底层的Socket也会立即关闭,所有未发送完的剩余数据被丢弃
setSoLinger(true, 3600): 那么执行Socket的close方法,该方法不会立即返回,而进入阻塞状态,同时,底层的Socket也会尝试发送剩余的数据,只有满足下面的两个条件之一,close方法才会返回:
(1):底层的Socket已经发送完所有的剩余数据
(2): 尽管底层的Socket还没有发送完所有的剩余数据,但已经阻塞了3600秒,close()方法的阻塞时间超过3600秒,也会返回,剩余未发送的数据被丢弃。
net.ipv4.tcp_tw_reuse = 1 表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭;net.ipv4.tcp_tw_recycle = 1 表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭。
5、SO_SNFBUF:表示发送数据的缓冲大小
6、SO_RCVBUF:表示接受数据的缓冲区的大小
7、SO_KEEPALIVE:表示长时间处于空闲状态的SOCEKT,是否自动把他/她关闭
8、OOBINLINE:表示是否支持发送一个字节的TCP紧急数据
默认参数
注: Connector 通常在%HOME_TOMCAT%/conf/servser.xml 文件内
# 正常参数
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
配置参数调试
# 优化参数
<Connector port="8080"
protocol="HTTP/1.1"
maxThreads="1000"
minSpareThreads="100"
acceptCount="1000"
maxConnections="1000"
connectionTimeout="20000"
maxHttpHeaderSize="8192"
tcpNoDelay="true"
compression="on"
compressionMinSize="2048"
disableUploadTimeout="true"
redirectPort="8443"
enableLookups="false"
URIEncoding="UTF-8" />
参数详解
1)port
注:代表Tomcat端口号,默认8080。
2)protocol
注:协议类型,可选类型有4种,BIO(阻塞型IO),NIO,NIO2和APR。
# BIO
BIO(Blocking I/O) 阻塞式I/O操作,传统的Java I/O操作(即java.io包及其子包)。Tomcat在默认情况下,是以bio模式运行的,bio模式是三种运行模式中性能最低的一种。BIO配置采用默认即可。
BIO更适合处理简单流程,如程序处理较快可以立即返回结果。简单项目及应用可以采用BIO。
# NIO
NIO(New I/O)是Java SE 1.4及后续版本提供的一种新的I/O操作方式(即java.nio包及其子包)。Java nio是一个基于缓冲区、非阻塞I/O操作的Java API它拥有比传统I/O操作(bio)更好的并发运行性能。
NIO更适合后台需要耗时完成请求的操作,如程序接到了请求后需要比较耗时的处理这已请求,所以无法立即返回结果,这样如果采用BIO就会占用一个连接,而使用NIO后就可以将此连接转让给其他请求,直至程序处理完成返回为止。
# APR
APR(Apache Portable Runtime/Apache可移植运行时),是Apache HTTP服务器的支持库。你可以简单地理解为:Tomcat将以JNI的形式调用 Apache HTTP服务器的核心动态链接库来处理文件读取或网络传输操作,从而大大地提高 Tomcat对静态文件的处理性能。
APR可以大大提升Tomcat对静态文件的处理性能,同时如果你使用了HTTPS方式传输的话,也可以提升SSL的处理性能。
# 修改方式
//BIO
protocol="HTTP/1.1"
//NIO
protocol="org.apache.coyote.http11.Http11NioProtocol"
//NIO2
protocol="org.apache.coyote.http11.Http11Nio2Protocol"
//APR
protocol="org.apache.coyote.http11.Http11AprProtocol"
3)maxThreads (线程池的大小默认200)
注:连接器创建处理请求线程的最大数目,处理同事请求的最大数目,默认值为200。
如果一个执行器与此连接器关联,则忽略此属性,因为该属性将被忽略,所以该连接器将使用执行器而不是一个内部线程池来执行任务。maxThreads是一个重要的配置属性,maxThreads配置的合理直接影响了Tomcat的相关性能。maxThreads并不是配置的越大越好,事实上你即使配置成999999也是没有用的,因为这个最大值是受操作系统及相关硬件所制约的,并且最大值并不一定是最优值,所以我们追寻的应该是最优值而不是最大值。
QPS(Query Per Second):每秒查询率QPS是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准。我们常常使用 QPS值来衡量一个服务器的性能。
QPS = 并发数 / 平均响应时间
并发数 = QPS * 平均响应时间
一个系统吞吐量通常由QPS、并发数两个因素决定,每套系统的这两个值都有一个相对极限值,在应用场景访问压力下,只要某一项达到系统最高值,系统的吞吐量就上不去了,如果压力继续增大,系统的吞吐量反而会下降,原因是系统超负荷工作,上下文切换、内存等等其它消耗导致系统性能下降。所谓吞吐量这里可以理解为每秒能处理请求的次数。
所以选择一个合理的 maxThreads值,其实并不是那么容易的事。因为过多的线程只会造成,更多的内存开销,更多的CPU开销,但是对提升QPS确毫无帮助;找到最佳线程数后通过简单的设置,可以让web系统更加稳定,得到最高,最稳定的QPS输出。
# 获取最佳maxThreads的最佳值
(1)通过线上系统不断使用和用户的不断增长来进行性能测试,观察QPS,响应时间,这种方式会在爆发式增长时系统崩溃,如双12等。
(2)根据公式计算,服务器端最佳线程数量=((线程等待时间+线程cpu时间)/线程cpu时间) * cpu数量,这种方式有时会被误导,因为某些系统处理环节可能会耗时比较长,从而影响公式的结果。
(3)单、多用户压力测试,查看CPU的消耗,然后直接乘以百分比,再进行压测,一般这个值的附近应该就是最佳线程数量,这种方式理想场景比较适用,实际情况会比这个复杂的多。
(4)根据系统的自身情况调整,如硬件限制,系统限制,程序处理能力限制等。
(5)定期修改为不同的 maxThreads值,看服务器响应结果及用户反应。
# QPS和线程数的关系
(1)在最佳线程数量之前,QPS和线程是互相递增的关系,线程数量到了最佳线程之后,QPS持平,不在上升,甚至略有下降,同时相应时间持续上升。
(2)同一个系统而言,支持的线程数越多(最佳线程数越多而不是配置的线程数越多),QPS越高。
# QPS和响应时间的关系
(1)对于一般的web系统,响应时间一般有CPU执行时间+IO等待时间组成。
(2)CPU的执行时间减少,对QPS有实质的提升,IO时间的减少,对QPS提升不明显。如果要想明显提升QPS,优化系统的时候要着重优化CPU消耗大户。
4)minSpareThreads
注:线程的最小运行数目,这些始终保持运行。如果未指定,默认值为10。
5)acceptCount (默认为100,ServerSocket.accept队列,backlog:半队列的大小)
注:最大队列长度。一般与maxThreads相同,默认为100。
当所有可能的请求处理线程都在使用时传入连接请求的最大队列长度。如果未指定,默认值为100。一般是设置的跟 maxThreads一样或一半,此值设置的过大会导致排队的请求超时而未被处理。所以这个值应该是主要根据应用的访问峰值与平均值来权衡配置。
6)maxConnections (NIO与NIO2的默认值为10000,accept的Socket的大小)
注:在任何给定的时间内,服务器将接受和处理的最大连接数。当这个数字已经达到时,服务器将接受但不处理,等待进一步连接。NIO与NIO2的默认值为10000,APR默认值为8192。
7)connectionTimeout (设置到Socket.setSoTimeout(connectionTimeout ))
注:当请求已经被接受,但未被处理,也就是等待中的超时时间。单位为毫秒,默认值为60000。通常情况下设置为30000。
8)maxHttpHeaderSize
注:请求和响应的HTTP头的最大大小,以字节为单位指定。如果没有指定,这个属性被设置为8192(8 KB)。
9)tcpNoDelay
注:如果为true,服务器socket会设置TCP_NO_DELAY选项,在大多数情况下可以提高性能。缺省情况下设为true。
10)compression
注:是否启用gzip压缩,默认为关闭状态。这个参数的可接受值为“off”(不使用压缩),“on”(压缩文本数据),“force”(在所有的情况下强制压缩)。
11)compressionMinSize
注:如果compression="on",则启用此项。被压缩前数据的最小值,也就是超过这个值后才被压缩。如果没有指定,这个属性默认为“2048”(2K),单位为byte。
12)disableUploadTimeout
注:这个标志允许servlet Container在一个servlet执行的时候,使用一个不同的,更长的连接超时。最终的结果是给servlet更长的时间以便完成其执行,或者在数据上传的时候更长的超时时间。如果没有指定,设为false。
13)enableLookups
注:关闭DNS反向查询。
14)URIEncoding
注:URL编码字符集。
10. tomcat线程与代码线程关系
线程是自动调整的,不需要你来手工调整。优化的文档可以参考edocs里相关的内容。在控制台上,队列设置里面,有Thread Count、Thread Priority和Queue Length,可以调整一下。另外,backlog也可以调整一下。提升线程数会在重新启动server后生效,队列长度是执行队列的最大长度,提升线程优先权将导致这个队列cpu优先权超过低优先权线程。提升线程数有时可以增加应用程序性能,但是在提升数量前,有很多因素需要考虑。设置数量太高会降低服务器性能,在服务器上可以并行处理的线程数取决于服务器硬件的cpu性能,有效的处理器越多,可以给服务器的线程数越多,并且越期望有性能的提高。你也可以在config.xml中加入8.1 style,用81-style-execute-queues ,配置一下 myserver myserver true 7002 true