Tomcat
2023-05-09 17:56:25 0 举报
AI智能生成
Tomcat
作者其他创作
大纲/内容
性能优化
性能监控
关键指标
吞吐量
响应时间
错误数
线程池
CPU
JVM 内存
JConsole
开启 JMX
查看吞吐量、响应时间、错误数
查看线程池
查看 JVM 内存
常用命令
定位进程:ps -ef | grep tomcat
查看进程大致信息:cat /proc/<pid>/status
监控 CPU 和内存使用状况:top -p <pid>
查看 Tomcat 网络连接:netstat -na | grep <port>
统计已建立连接数:netstat -na | grep ESTABLISH | grep <port> | wc -l
统计等待连接数:netstat -na | grep TIME_WAIT | grep <port> | wc -l
查看网络流量:ifstat
启动速度调优
清理冗余文件
清理不必要的 Web 应用
清理 XML 配置文件
清理 JAR 文件
清理其他文件
关闭不需要功能
禁止 Tomcat TLD 扫描
关闭 WebSocket 支持
关闭 JSP 支持
禁止 Servlet 注解扫描
其他功能优化
配置 Web-Fragment 扫描
随机数熵源优化
并行启动多个 Web 应用
JVM GC 调优
CMS 收集器
G1 收集器
I/O 和线程池调优
选择 I/O 模型
利特尔法则
考虑 I/O 阻塞
实际场景
内存溢出调优
问题成因
问题定位
拒绝连接问题分析
网络参数
网络配置
CPU 占用调优
排查思路
线程定位
分析上下文切换开销
通用组件
日志框架:Logger
门面日志 API
Java 日志系统
JULI
DirectJDKLog
LogFactory
Handler
FileHandler
AsyncFileHandler
Formatter
OnlineFormatter
VerbatimFormatter
JdkLoggerFormatter
日志配置
Tomcat + SLF4J + Logback
基本配置
Session 管理:Manager
Session 创建
Manager 接口
RequestFacade 类
Manager 类
ManagerBase 类
StandardSession 类
Session 清理
StandardContext
Session 事件
集群通信:Cluster
通信原理
通信配置
基础配置
优化配置
工作过程
Tomcat A 启动
Tomcat B 启动
Tomcat A 接收 HTTP 请求,创建 Session 1
Tomcat A 崩溃
Tomcat B 接收 Tomcat A 的请求
Tomcat A 重新启动
Tomcat A 接收请求,Session 1 被用户注销
Tomcat B 接收到一个新请求,创建 Session 2
Tomcat A 上的 Session 2 过期
功能特性
WebSocket
WebSocketEndpoint
编程式
声明式
WebSocket 加载
UpgradeProcessor
WebSocket
协议升级
异步 Servlet
基本实现
startAsync 方法
创建 AsyncContext
通知 CoyoteAdapter
complete 方法
action 方法 -> processSocketEvent 方法
SocketWrapper#processSocket 方法
SocketWrapper#createSocketProcessor 方法
内嵌式容器
Spring Boot 支持
WebServer 接口
ServletWebServerFactory 接口
getWebServer 方法
ServletContextInitializer 接口
WebServerFactoryCustomizerBeanPostProcessor 接口
创建和启动
onRefresh 和 createWebServer
getWebServer
注册 Servlet
Servlet 注解
ServletRegistrationBean
动态注册
定制 Web 容器(2.0+)
通用 Web 容器工厂 ConfigurableServletWebServerFactory
特定 Web 容器工厂 TomcatServletWebServerFactory
基本概念
Servlet 规范
Servlet 接口
Servlet
service
init 和 destroy
ServletConfig
GenericServlet
Servlet 容器
工作流程
Web 应用
扩展机制
过滤器
监听器
I/O 模型
NIO:非阻塞 I/O,采用 Java NIO 类库实现
NIO 2:异步 I/O,采用 JDK 7 最新的 NIO.2 类库实现
APR:采用 Apache 可移植运行库实现,C/C++ 实现的本地库
应用层协议
HTTP/1.1:大部分 Web 应用采用的访问协议
AJP:用于和 Web 服务器集成(如 Apache)
HTTP/2.0:大幅度的提升了 Web 性能
与 Jetty 的比较
整体架构
连接器(Connector)
容器(Container)
生命周期
组合模式:Lifecycle 接口
观察者模式:Lifecycle 事件
模板模式:LifecycleBase 类
注册监听器
运行模式
Catalina
优雅关停:CatalinaShutdownHook
创建 Socket 监听连接
Server
添加 Service 方法:addService
Service
观察者模式:MapperListener
管理启动依赖:startInternal
Engine
管理子容器:ContainerBase#children
处理请求 Pipeline:StandardEngineValve
容器(Container)
处理流程
层次结构
Engine:引擎,根据协议和端口号选定
Host:虚拟主机 / 站点,根据域名选定
Context:Web 应用程序,根据 URL 路径选定
类加载机制
JVM 的类加载器
双亲委派模型
findClass
loadClass
Web 应用隔离
WebAppClassLoader:同名 Servlet 应用的隔离
SharedClassLoader:共享 JAR 包只能加载一次
CatalinaClassLoader + CommonClassLoader:隔离 Tomcat 的类和 Web 应用的类
currentThread().getContextClassLoader():Spring 的加载问题
开发须知
管理 Filter
Filter 链
实现链式调用
管理 Listener
触发监听器
Wrapper:Servlet,根据 URL 路径选定
管理 Servlet
延迟加载:loadServlet
Pipeline-Valve
Pipeline-Valve 管道
addValve
getBasic
热加载与热部署
后台线程
ContainerBackgroundProcessor
ContainerBase
backgroundProcess
热加载:Context 容器
Context#reload
类加载器
热部署:Host 容器
周期事件处理
连接器(Connector)
ProtocolHandler
Endpoint
非阻塞 I/O:NioEndpoint
LimitLatch:连接控制器
Acceptor:监听新连接,交给 Poller 处理
Poller:Selector,检测 Channel 数据就绪状态
SocketProcessor:封装数据处理任务
Executor:线程池
异步 I/O:Nio2Endpoint
Java NIO.2
AcceptHandler
CompletionHandler
ReadHandler
LimitLatch:连接控制器
Nio2Acceptor:通过回调函数实现监听
Nio2SocketWrapper:封装 Channel 并提供接口给 Http11Processor 读写数据
SocketProcessor:封装数据处理任务
Executor:线程池
AprEndpoint
Acceptor:监听新连接,交给 Poller 处理
Poller:查询 I/O 事件(不轮询)
本地内存优化
HeapByteBuffer 与 DirectByteBuffer
sendfile:静态文件的处理
传统方式
直接系统调用
Executor
Java 线程池
ThreadPoolExecutor
FixedThreadPool/CachedThreadPool
定制线程池
线程数与队列长度
处理逻辑
任务队列
Processor
HttpProcessor
Adapter
CoyoteAdapter
0 条评论
下一页