JDK Tomket的安装与调优

白日放歌须纵酒,青春作伴好还乡。这篇文章主要讲述JDK Tomket的安装与调优相关的知识,希望能为你提供帮助。
安装JDK

  • #官网下载
https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html
  • 解压
# tar zxf jdk-8u144-linux-x64.tar.gz -C /usr/local/
  • 设置环境变量
# vim /etc/profile
#最后加入 export java_HOME=/usr/local/jdk1.8.0_301 export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH:$HOME/bin

  • source 环境变量
# source /etc/profile
  • # java -version
    java version "1.8.0_301"
    Java(TM) SE Runtime Environment (build 1.8.0_301-b09)
    Java HotSpot(TM) 64-Bit Server VM (build 25.301-b09, mixed mode)

安装Tomcat
  • 官网下载
https://tomcat.apache.org/download-80.cgi
  • 解压
# tar zxf apache-tomcat-8.5.23.tar.gz -C /usr/local/
  • 启动
# /usr/local/tomcat/bin/startup.sh
# ps aux | grep tomcat
root2684 73.54.6 2485544 87136 pts/0Sl00:110:01 /usr/local/jdk1.8.0_301/bin/java -Djava.util.logging.config.file=/usr/local/tomcat/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Dorg.apache.catalina.security.SecurityListener.UMASK=0027 -Dignore.endorsed.dirs= -classpath /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar -Dcatalina.base=/usr/local/tomcat -Dcatalina.home=/usr/local/tomcat -Djava.io.tmpdir=/usr/local/tomcat/temp org.apache.catalina.startup.Bootstrap start
root27040.00.0 112812976 pts/0R+00:110:00 grep --color=auto tomcat
  • 访问页面
http://192.168.1.11:8080


Tomcat调优
  • 解决tomcat启动慢的问题
01-Jun-2020 10:08:56.985 INFO [main] org.apache.catalina.startup.Catalina.load Initialization processed in 328 ms 01-Jun-2020 09:33:11.962 INFO [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["http-nio-8080"] 01-Jun-2020 10:08:57.321 INFO [main] org.apache.catalina.startup.Catalina.start Server startup in xxxx ms 解决方案1 修改下面文件,将random改成urandom vim /usr/local/jdk1.8/jre/lib/security/java.security #securerandom.source=file:/dev/random securerandom.source=file:/dev/urandom 解决方案2 vim /usr/local/tomcat855/bin/catalina.sh if [[ "$JAVA_OPTS" != *-Djava.security.egd=* ]]; then JAVA_OPTS="$JAVA_OPTS -Djava.security.egd=file:/dev/urandom" fi 解决方案3 yum install rng-tools -y systemctl start rngd.service systemctl status rngd.service 原理是生成随机数的时候卡住 echo $RANDOM 将random修改为urandom,使用伪随机数
  • 内存优化
# vim /usr/local/apache-tomcat-8.5.70/bin/catalina.sh
JAVA_OPTS="-Xms1024m -Xmx1024m -Xmn400m -XX:MetaspaceSize=200M -XX:MaxMetaspaceSize=1024M -XX:NewSize=200M -XX:MaxNewSize=1024M"
注: -Xms3072m初始堆大小 -Xmx3072m最大堆大小,设置为可用内存的80% -Xmn400m年轻代大小 -XX:MetaspaceSize=200M设置持久代(perm gen)初始值 -XX:MaxMetaspaceSize=1024M设置持久代最大值 -XX:NewSize=200M设置年轻代大小(for 1.3/1.4) -XX:MaxNewSize=1024M设置年轻代最大值(for 1.3/1.4)
  • 并发优化
【JDK Tomket的安装与调优】# vim /usr/local/apache-tomcat-8.5.70/conf/server.xml
< Connector port="8080" protocol="HTTP/1.1" URIEncoding="UTF-8" enableLookups="false" disableUploadTimeout="true" connectionTimeout="20000" acceptCount="300" maxThreads="500" compression="on" compressionMinSize="2048" compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain" redirectPort="8443" /> 注:acceptCount使用所有可能的请求处理线程时,传入连接请求的最大队列长度。队列已满时收到的任何请求都将被拒绝。默认值为100。 URIEncoding在%xx解码URL之后,这指定用于解码URI字节的字符编码。如果未指定,则除非org.apache.catalina.STRICT_SERVLET_COMPLIANCE 系统属性设置为UTF-8,否则将使用UTF-8 true。 minSpareThreads始终保持运行状态的最小线程数。这包括活动线程和空闲线程。如果未指定,10 则使用默认值。如果执行程序与此连接器相关联,则此属性将被忽略,因为连接器将使用执行程序而不是内部线程池执行任务。请注意,如果配置了执行程序,则将正确记录为此属性设置的任何值,但是会报告该值(例如,通过JMX),-1以明确未使用它。 maxThreads此Connector将创建的请求处理线程的最大数量,因此确定了可以处理的同时请求的最大数量。如果未指定,则此属性设置为200。如果执行程序与此连接器相关联,则此属性将被忽略,因为连接器将使用执行程序而不是内部线程池执行任务。请注意,如果配置了执行程序,则将正确记录为此属性设置的任何值,但是会报告该值(例如,通过JMX), -1以明确未使用它。 maxConnections服务器在任何给定时间将接受和处理的最大连接数。达到此数目后,服务器将接受但不处理另一个连接。在处理的连接数降至maxConnections以下之前,该附加连接将被阻止,此时服务器将再次开始接受和处理新的连接。请注意,一旦达到限制,操作系统仍然可以根据acceptCount设置接受连接。默认值因连接器类型而异。对于NIO和NIO2,默认值为10000。对于APR /本机,默认值为8192。仅对于NIO / NIO2,将该值设置为-1将禁用maxConnections功能,并且不计算连接数。 disableUploadTimeout此标志允许Servlet容器在数据上载期间使用其他通常更长的连接超时。如果未指定,则将此属性设置为true禁用此较长的超时。 enableLookups设置为true是否要调用以 request.getRemoteHost()执行DNS查找以返回远程客户端的实际主机名。设置为false跳过DNS查找并改为以字符串形式返回IP地址(从而提高性能)。默认情况下,DNS查找被禁用。 compression所述连接器可在试图节省服务器的带宽使用HTTP / 1.1 GZIP压缩。该参数的可接受值为“ off”(禁用压缩),“ on”(允许压缩,这将导致压缩文本数据),“ force”(在所有情况下均强制压缩)或数字整数值(即等效于“ on”,但指定压缩输出之前的最小数据量。如果内容长度未知,并且压缩设置为“ on”或更具攻击性,则输出也将被压缩。如果未指定,则此属性设置为“ off”。 注意:在使用压缩(节省带宽)和使用sendfile功能(节省CPU周期)之间需要权衡。如果连接器支持sendfile功能,例如NIO连接器,则使用sendfile将优先于压缩。症状是大于48 Kb的静态文件将以未压缩的形式发送。您可以通过设置useSendfile连接器的属性来关闭sendfile,如下所述,或者在DefaultServlet的配置中(默认值 conf/web.xml或web.xmlWeb应用程序的)更改sendfile的使用阈值 。 compressionMinSize如果压缩设置为“ on”,则此属性可用于指定压缩输出之前的最小数据量。如果未指定,则此属性默认为“ 2048”。 compressibleMimeType该值是逗号分隔的MIME类型列表,可以对其使用HTTP压缩。默认值为 text/html,text/xml,text/plain,text/css,text/javascript,application/javascript,application/json,application/xml 。 redirectPort如果此连接器支持非SSL请求,并且收到一个< security-constraint> 要求进行SSL传输匹配 的请求,则Catalina将自动将请求重定向到此处指定的端口号。 enableLookups设置为true是否要调用以 request.getRemoteHost()执行DNS查找以返回远程客户端的实际主机名。设置为false跳过DNS查找并改为以字符串形式返回IP地址(从而提高性能)。默认情况下,DNS查找被禁用。 maxProcessors服务器同时最大处理线程数 minProcessors服务器创建时的最小处理线程数
  • 缓存优化
tomcat的maxThreads、acceptCount(最大线程数、最大排队数) 说明: maxThreads:tomcat起动的最大线程数,即同时处理的任务个数,默认值为200 acceptCount:当tomcat起动的线程数达到最大时,接受排队的请求个数,默认值为100 这两个值如何起作用,请看下面三种情况 情况1:接受一个请求,此时tomcat起动的线程数没有到达maxThreads,tomcat会起动一个线程来处理此请求。 情况2:接受一个请求,此时tomcat起动的线程数已经到达maxThreads,tomcat会把此请求放入等待队列,等待空闲线程。 情况3:接受一个请求,此时tomcat起动的线程数已经到达maxThreads,等待队列中的请求个数也达到了acceptCount,此时tomcat会直接拒绝此次请求,返回connection refused maxThreads如何配置 一般的服务器操作都包括量方面:1计算(主要消耗cpu),2等待(io、数据库等) 第一种极端情况,如果我们的操作是纯粹的计算,那么系统响应时间的主要限制就是cpu的运算能力,此时maxThreads应该尽量设的小,降低同一时间内争抢cpu的线程个数,可以提高计算效率,提高系统的整体处理能力。 第二种极端情况,如果我们的操作纯粹是IO或者数据库,那么响应时间的主要限制就变为等待外部资源,此时maxThreads应该尽量设的大,这样才能提高同时处理请求的个数,从而提高系统整体的处理能力。此情况下因为tomcat同时处理的请求量会比较大,所以需要关注一下tomcat的虚拟机内存设置和linux的open file限制。 我在测试时遇到一个问题,maxThreads我设置的比较大比如3000,当服务的线程数大到一定程度时,一般是2000出头,单次请求的响应时间就会急剧的增加, 百思不得其解这是为什么,四处寻求答案无果,最后我总结的原因可能是cpu在线程切换时消耗的时间随着线程数量的增加越来越大, cpu把大多数时间都用来在这2000多个线程直接切换上了,当然cpu就没有时间来处理我们的程序了。 以前一直简单的认为多线程=高效率。。其实多线程本身并不能提高cpu效率,线程过多反而会降低cpu效率。 当cpu核心数< 线程数时,cpu就需要在多个线程直接来回切换,以保证每个线程都会获得cpu时间,即通常我们说的并发执行。 所以maxThreads的配置绝对不是越大越好。 现实应用中,我们的操作都会包含以上两种类型(计算、等待),所以maxThreads的配置并没有一个最优值,一定要根据具体情况来配置。 最好的做法是:在不断测试的基础上,不断调整、优化,才能得到最合理的配置。 acceptCount的配置,我一般是设置的跟maxThreads一样大,这个值应该是主要根据应用的访问峰值与平均值来权衡配置的。 如果设的较小,可以保证接受的请求较快相应,但是超出的请求可能就直接被拒绝 如果设的较大,可能就会出现大量的请求超时的情况,因为我们系统的处理能力是一定的。 maxThreads 配置要结合 JVM -Xmx 参数调整,也就是要考虑内存开销。
  • 协议优化
1、关闭AJP端口 AJP是为 Tomcat 与 HTTP 服务器之间通信而定制的协议,能提供较高的通信速度和效率。如果tomcat前端放的是apache的时候,会使用到AJP这个连接器。若tomcat未与apache配合使用,因此不使用此连接器,因此需要注销掉该连接器。< !-- < Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /> --> 2、bio模式: 默认的模式,性能非常低下,没有经过任何优化处理和支持. 3、nio模式: 1) nio(new I/O),是Java SE 1.4及后续版本提供的一种新的I/O操作方式(即java.nio包及其子包)。Java nio是一个基于缓冲区、并能提供非阻塞I/O操作的Java API,因此nio也被看成是non-blocking I/O的缩写。它拥有比传统I/O操作(bio)更好的并发运行性能。 2) 如何启动此模式: 修改server.xml里的Connector节点,修改protocol为org.apache.coyote.http11.Http11NioProtocol 4、apr模式: apr是从操作系统级别解决异步IO问题,大幅度提高服务器的并发处理性能,也是Tomcat生产环境运行的首选方式 目前Tomcat 8.x默认情况下全部是运行在nio模式下,而apr的本质就是使用jni技术调用操作系统底层的IO接口,所以需要提前安装所需要的依赖。 首先是需要安装openssl和apr,命令如下: yum -y install openssl-devel yum -y install apr-devel -y 安装之后,去tomcat官网下载native组件,native可以看成是tomcat和apr交互的中间环节,下载地址是:http://tomcat.apache.org/download-native.cgi
# 安装native tar -xvzf tomcat-native-1.2.10-src.tar.gz -C /usr/local cd /usr/local/tomcat-native-1.2.10-src/native/ ./configure make & & make install # 修改tomcat-catalina,sh vim /usr/local/tomcat855/bin/catalina.sh JAVA_OPTS="$JAVA_OPTS $JSSE_OPTS" JAVA_OPTS="$JAVA_OPTS -Djava.library.path=/usr/local/apr/lib"


    推荐阅读