运维八一 运维八一
首页
运维杂记
编程浅尝
周积跬步
专栏
生活
关于
收藏
  • 分类
  • 标签
  • 归档
Source (opens new window)

运维八一

运维,运维!
首页
运维杂记
编程浅尝
周积跬步
专栏
生活
关于
收藏
  • 分类
  • 标签
  • 归档
Source (opens new window)
  • 操作系统

  • 域名解析

  • 公有云

  • CI&CD

  • 数据库

  • 负载均衡&反向代理

  • 存储系统

  • 容器&容器编排

  • 批量管理

  • 邮件系统

  • 监控系统

  • Web服务

    • HTTP介绍
    • nginx进阶
    • nginx优化
    • nginx容器化部署
    • Nginx反向代理问题
    • nginx日志切割脚本
    • nginx log各种过滤分析
    • nginx安全问题处理
    • Nginx location Rewrite参数
    • 查看apache、nginx、mysql、php编译参数
    • Tomcat优化
    • centos下tomcat启动很慢
    • tomcat升级
    • PHP优化
    • apache+tomcat负载均衡
    • apache部署
    • apache限制地址和用户访问
    • httpd虚拟主机
    • apache配置文件参数详解
    • apache优化
    • nginx&apache&lighttpd介绍
    • Lighttpd优化
    • web程序性能动态追踪简明手册
  • 虚拟化

  • 防火墙

  • 压测

  • 文件同步

  • 私有云

  • 日志系统

  • 代码仓库&版本管理

  • 安全审计

  • 远程拨号

  • 大数据

  • 统一认证

  • 消息队列

  • Apollo

  • 运维杂记
  • Web服务
lyndon
2022-06-10

Tomcat优化

# 1. Tomcat内存优化

Tomcat 内存优化主要是对 tomcat 启动参数优化,在启动时告诉 JVM 我要一块大内存(调优内存是最直接的方式),可以在启动脚本 catalina.sh 中设置 java_OPTS 参数。

JAVA_OPTS参数说明:

-server 			启用jdk 的 server 版
-Xms	 			java虚拟机初始化时的最小内存 
-Xmx 				java虚拟机可使用的最大内存 
-XX: PermSize 		内存永久保留区域 
-XX:MaxPermSize 	内存最大永久保留区域
1
2
3
4
5

服务器参数配置:

现公司服务器内存一般都可以加到最大2G ,所以可以采取以下配置:

JAVA_OPTS=’-Xms1024m -Xmx2048m -XX: PermSize=256M -XX:MaxNewSize=256m -XX:MaxPermSize=256m’
1

# 2. Tomcat 线程优化

在Tomcat 配置文件 server.xml 中优化线程和并发处理能力。

<Connector port="9027"
protocol="HTTP/1.1"
maxHttpHeaderSize="8192"
maxThreads="1000"			客户请求最大线程数
minSpareThreads="100"	Tomcat初始化时创建的 socket 线程数
maxSpareThreads="1000"	Tomcat连接器的最大空闲 socket 线程数
minProcessors="100"		服务器创建时的最小处理线程数
maxProcessors="1000"	服务器同时最大处理线程数
enableLookups="false"	若设为true,则支持域名解析,可把 ip 地址解析为主机名
compression="on"			打开压缩功能
compressionMinSize="2048"	启用压缩的输出内容大小,这里面默认为2KB
compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain"	压缩类型
connectionTimeout="20000"	定义建立客户连接超时的时间. 如果为 -1, 表示不限制建立客户连接的时间
URIEncoding="utf-8"			URL统一编码
acceptCount="1000"			监听端口队列最大数,满了之后客户请求会被拒绝(不能小于maxSpareThreads )
redirectPort="8443"			在需要基于安全通道的场合,把客户请求转发到基于SSL 的 redirectPort 端口 
disableUploadTimeout="true"/>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

# 3. Tomcat IO优化

Tomcat有三种工作模式:Bio、Nio(Aio)和Apr

同步阻塞IO(JAVA BIO):

同步并阻塞,服务器实现模式为一个连接一个线程(one connection one thread 想想都觉得恐怖,线程可是非常宝贵的资源),当然可以通过线程池机制改善.

BIO方式适用于连接数目比较小且固定的架构,这种方式对服务器资源要求比较高,并发局限于应用中,JDK1.4以前的唯一选择,但程序直观简单易理解.

JAVA NIO:

又分为同步非阻塞IO,异步阻塞IO 与BIO最大的区别one request one thread.可以复用同一个线程处理多个connection(多路复用).

NIO方式适用于连接数目多且连接比较短(轻操作)的架构,比如聊天服务器,并发局限于应用中,编程比较复杂,JDK1.4开始支持.

异步非阻塞IO(Java NIO2,又叫AIO):

主要与NIO的区别主要是操作系统的底层区别.可以做个比喻:比作快递,NIO就是网购后要自己到官网查下快递是否已经到了(可能是多次),然后自己去取快递;AIO就是快递员送货上门了(不用关注快递进度)。

AIO方式使用于连接数目多且连接比较长(重操作)的架构,比如相册服务器,充分调用OS参与并发操作,编程比较复杂,JDK7开始支持.

在server.xml中实现对Tomcat的IO切换.

<Connector port="80" protocol="org.apache.coyote.http11.Http11NioProtocol" 
    connectionTimeout="20000" 
    URIEncoding="UTF-8" 
    useBodyEncodingForURI="true" 
    enableLookups="false" 
    redirectPort="8443" />
1
2
3
4
5
6

APR

APR是从操作系统级别来解决异步的IO问题,大幅度的提高性能. (http://apr.apache.org/).

APR(Apache Portable Runtime)是一个高可移植库,它是Apache HTTP Server 2.x的核心.能更好地和其它本地web技术集成,总体上让Java更有效率作为一个高性能web服务器平台而不是简单作为后台容器.

在产品环境中,特别是直接使用Tomcat做WEB服务器的时候,应该使用Tomcat Native来提高其性能.如果不配APR,基本上300个线程狠快就会用满,以后的请求就只好等待.但是配上APR之后,并发的线程数量明显下降,从原来的300可能会马上下降到只有几十,新的请求会毫无阻塞的进来.

在局域网环境测,就算是400个并发,也是一瞬间就处理/传输完毕,但是在真实的Internet环境下,页面处理时间只占0.1%都不到,绝大部分时间都用来页面传输.如果不用APR,一个线程同一时间只能处理一个用户,势必会造成阻塞。所以生产环境下用apr是非常必要的.

安装Apache Tomcat Native Library,直接启动就支持apr(http://tomcat.apache.org/native-doc/)它本身是基于APR的. 具体安装方法可以参考其他博客和文章. 排除代码问题Tomcat优化到这个层次,可以应对大部分性能需求.

工作模式原理涉及到了网络I/O模型知识:

**阻塞式I/O模型:**应用进程调用recv函数系统调用时,如果等待要操作的数据没有发送到内核缓冲区,应用进程将阻塞,不能接收其他请求。反之,内核recv端缓冲区有数据,内核会把数据复制到用户空间解除阻塞,继续处理下一个请求。(内核空间(缓冲区)--用户空间(系统调用))

**非阻塞式I/O模型:**应用进程设置成非阻塞模式,如果要操作的数据没有发送到内核缓冲区,recv系统调用返回一个错误,应用进程利用轮询方式不断检查此操作是否就绪,如果缓冲区中有数据则返回,I/O操作同时不会阻塞应用进程,期间会继续处理新请求。

**I/O****复用模型:**阻塞发生在select/poll的系统调用上,而不是阻塞在实际的I/O系统调用上。能同时处理多个操作,并检查操作是否就绪,select/epoll函数发现有数据就绪后,就通过实际的I/O操作将数据复制到应用进程的缓冲区中。

**异步I/O模型:**应用进程通知内核开始一个异步I/O操作,并让内核在整个操作(包括数据复制缓冲区)完成后通知应用进程,期间会继续处理新请求。

**I/O****操作分为两个阶段:**第一个阶段等待数据可用,第二个阶段将数据从内核复制到用户空间。

**前三种模型的区别:**第一阶段阻塞式I/O阻塞在I/O操作上,非阻塞式I/O轮询,I/O复用阻塞在select/poll或epoll上。第二阶段都是一样的。而异步I/O的两个阶段都不会阻塞进程。

wKiom1cPZiexhqQVAADEfIyyX4s521.png

上次更新: 2022/06/12, 15:48:09
查看apache、nginx、mysql、php编译参数
centos下tomcat启动很慢

← 查看apache、nginx、mysql、php编译参数 centos下tomcat启动很慢→

最近更新
01
ctr和crictl显示镜像不一致
03-13
02
alpine镜像集成常用数据库客户端
03-13
03
create-cluster
02-26
更多文章>
Theme by Vdoing | Copyright © 2015-2024 op81.com
苏ICP备18041258号-2
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式