Web服务器加速之Tomcat7性能如何调优

Web服务器加速之Tomcat7性能如何调优

1.     Tomcat是一个运行在Java JVM(虚拟机)环境的的一个应用,使用Java开发的。

2.     Tomcat也有自己的web管理功能,分别对应了Tomcat下webapps下的项目如下:

都对应了不同的角色能访问到具体的项目,目前掌握的Tomcat只有如下:

<role rolename="manager-gui"/>
<role rolename="admin-gui"/>
<role rolename="admin "/>
<role rolename="admin "/>

这里的配置是配置管理员账号,目的是进入Tomcat默认部署的项目,进行相关Tomcat启动参数和启动信息

<user username="tomcat" password="123456" roles="manager-gui,admin-gui"/>

3.     疑问:由于没有阅读和百度到具体的角色权限访问项目的详细描述,暂时不知道admin,manager和manager-gui,admin-gui(这二个主要是配置server status和host manager管理页面访问)角色区别,都对应了什么样的权限问题?

4.     客户端动态请求访问Tomcat下webapps下的项目动态资源(http1.0或http1.1)会直接根据http1.0或http1.1直接返回资源,但在在访问静态资源的时候,在tomcat(服务端)不会直接返回静态资源,会在客户端和服务端多一层静态资源的处理,服务端-->ajp(协议)-->静态资源处理-->http协议-->客户端,但通常ajp的协议一般都用不到的。

中间静态资源处理也不是本地就能直接处理的,而是转发到Apache基金下的服务器来做静态资源处理的,很消耗资源,又不是常用到,而且做静态资源处理的时候一般都用Nginx+Tomcat来处理,且Nginx处理性能比ajp快很多,所有可以得到如下优化手段:禁用ajp协议

5.     Tomcat优化手段

a)     虚拟机(Jvm)优化

b)    通信协议优化(到底使用Bio,Nio,Aio和禁用ajp协议)

c)     外部连接池优化(可根据业务量和资源合理调配连接池数量),可以根据第三方工具去开启并发测试来确定一个最好线程池连接数。

d)    更加深入内部配置(server.xml)

6.     根据Tomcat的通信协议引发对通信协议的优化(Bio,Nio,Aio)

如何查看Tomcat启动时用的是什么通信模式,可以看启动日志:

参考博客地址:Tomcat Bio,Nio,Aio 模式性能测试与个人看法,https://yq.aliyun.com/articles/14768

7.     server.xml 是Tomcat的核心配置文件其中包括了Tomcat整体架构信息和各组件之间的联系,service.xml 文件配置介绍参考博客地址:https://www.cnblogs.com/kismetv/p/7228274.html

8.     对比Bio,Nio的高效处理来与是:同步非阻塞,多了(通道和缓冲区和选择器,并存在连接池的概念,所有可以根据业务量来设置具体的连接处max数来优化性能,默认连接池数量为150)。

9.     Jetty比Tomcat性能高,但为什么还有这么多企业都在使用Tomcat,是在于Tomcat本身虽然没有Jetty性能高,但对应的Tomcat优化后和Tomcat的可扩展性决定Tomcat还是没法被Jetty直接取代,而且基于Tomcat还是J2ee制定规范者开发的,也带来了不少人使用它。Tomcat能够进行细粒度控制和nginx搭配优化而更加厉害了,而且Tomcat内部优化非常多。

10.  Tomcat 中虚拟机(Jvm)优化参数,可以直接配置到catalina.bat中

11.  连接器参数优化(主要用于受理客户端请求处理的,所有它的参数配置也特别重要)

12.  启用(外部配置连接池),可根据业务场景和我们的一个服务器硬件资源条件可以适当加大线程连接池连接池。

13.  疑问:现在下载的Tomcat默认使用的是Apr模式的通信协议而不是Bio,要怎么才能配置出Bio的通信协议?

14.  疑问:使用Nio通信模式的时候,配置外部线程池数量不好用,管理台提示线程池数量为-1?

15.  Tomcat集群的时候,根据我们的项目来确定是否使用Nio模式,如果说我们的项目的类库比较新,都是1.5类库(jdk版本)之后 那么不妨我们将我们集群当中的每一个Tomcai服务器的启动模式设置为高并发高性能的应答模式-->NIO模式。

16. server.xml 配置文件如下:

<?xml version='1.0' encoding='utf-8'?>
<Server port="8005" shutdown="SHUTDOWN">
  <Listener className="org.apache.catalina.startup.VersionLoggerListener" />
  <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
  <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
  <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
  <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />

  <GlobalNamingResources>
    <Resource name="UserDatabase" auth="Container"
              type="org.apache.catalina.UserDatabase"
              description="User database that can be updated and saved"
              factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
              pathname="conf/tomcat-users.xml" />
  </GlobalNamingResources>

  <Service name="Catalina">

	<!-- 优化手段之三:启动外部连接池,来满足高并发已经复用的请求,根据业务场景(如每秒并发数)在硬件资源条件下可以加大线程连接池 -->
	<!-- 模拟并发来测试线程连接池在多少比较合适:使用第三方并非测试工具来模拟(telnet) -->
	<!-- 
    <Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
        maxThreads="150" minSpareThreads="4"/>
    -->

	<!--
    <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />
	-->
	<!-- 优化手段之二:关闭bio,启动nio(高性能的应答模式), -->		
	<!-- 优化手段之四:连接器的优化,可以根据经验设置一个最佳实践配置参数 -->
	<!-- 细粒度控制问题决定一个企业要选择tomcat,而不选择jetty,要选择mybatis而不选择hibernate,架构师都是可控灵活的架构 -->
	<Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol"
		   connectionTimeout="20000"
		   redirectPort="8443" />
	
	<!-- 优化手段之五:JVM参数的优化 -->
	<!-- 优化手段之六:虚拟机的性能优化 -->
    <!--
    <Connector executor="tomcatThreadPool"
               port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />
    -->
	
    <!--
    <Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
               maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
               clientAuth="false" sslProtocol="TLS" />
    -->

    <!-- Define an AJP 1.3 Connector on port 8009 优化手段之一,禁用ajp 减少集群处理时间 -->
    <!-- <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /> -->

    <Engine name="Catalina" defaultHost="localhost">
      <Realm className="org.apache.catalina.realm.LockOutRealm">
        <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
               resourceName="UserDatabase"/>
      </Realm>

      <Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">
        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
               prefix="localhost_access_log" suffix=".txt"
               pattern="%h %l %u %t &quot;%r&quot; %s %b" />
		
      </Host>
    </Engine>
  </Service>
</Server>

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Netkiller

PHP 安全与性能

目录 1. Apache mod_php / php-fpm 1.1.1. Apache 1.1.2. Nginx / lighttpd + fastcgi 1...

2975
来自专栏开发与安全

linux系统编程之进程(一):进程基本概述

一、什么是进程 从用户的角度来看进程是程序的一次执行过程。 从操作系统的核心来看,进程是操作系统分配的内存、CPU时间片等资源的基本单位。 进程是资源分配的...

22310
来自专栏每日一篇技术文章

Java_开发环境搭建(MAC)_02

![71AF0D75-9EC8-457F-AC16-FD446F6C1C4F.png](http://upload-images.jianshu.io...

952
来自专栏小樱的经验随笔

mount命令详解及常见问题汇总

一 、mount命令(用来挂载硬盘或镜像等) 用法:mount [-t vfstype] [-o options] device dir 1、-t vfstyp...

6825
来自专栏xingoo, 一个梦想做发明家的程序员

Oozie分布式工作流——Action节点

前篇讲述了下什么是流控制节点,本篇继续来说一下什么是 Action Nodes操作节点。Action节点有一些比较通用的特性: Action节点是远程的 ...

2186
来自专栏MoeLove

CentOS7上安装Python3.6

当前最新的 CentOS 7.3 默认安装的是 Python 2 ,并且默认的官方 yum 源中不提供 Python 3 的安装包。有些用户想要升级使用 Pyt...

2732
来自专栏武军超python专栏

2018年7月31日学习ubuntu的基础操作命令和打包压缩解压缩

今天遇到的新单词: faith n 信用,信任 usage n 用法 upload n上传

1524
来自专栏编程坑太多

『高级篇』docker之DockerSwarm微服务部署(30)

PS:有详细看看官网的文档,里面有非常多样化的配置,我相信基本可以满足大家的需求。到这样docker swarm 也就学完了,相信有个整体的认识吧。另外要说下有...

1771
来自专栏测试开发架构之路

Tomcat入门

1、JavaWeb概念 Java web,是用java技术来解决相关web互联网领域的技术的总称。web包括:web服务器和web客户端两部分。 java在...

6407
来自专栏分布式系统和大数据处理

Kafka分布式消息系统(搭建Zookeeper集群) - Part.2

kafka使用zookeeper来管理Brokers(kafka服务进程)、执行partition(分区)的leader选举、当出现变更时向kafka发送通知(...

1773

扫码关注云+社区

领取腾讯云代金券