原文《The Challenges Tomcat Faces in High Throughput Production Systems》是阿里中间件团队的工程师在2017年在迈阿密ApacheCon上的技术分享。很有参考价值。原文在这里可以找到:https://tomcat.apache.org/presentations.html
高吞吐生产系统下Tomcat所面对的挑战
大纲
- Tomcat在阿里的使用
- 高吞吐web应用
- 面临的挑战
- 案例研究
- 总结
一、Tomcat在阿里的使用
-
2009年开始尝试
-
2013年开始从JBoss迁移到tomcat
-
2015年成为主力servlet容器,数千个web应用,数十万个应用实例
-
现状,2017年, 95% tomcat,5%其他servlet容器。主要是7.0.x (support JDK 6+) 版本,少量8.0.x版本,并开始为实施微服务(比如springboot)准备8.5.x版本
部署标准
每个tomcat实例只部署一个web应用。
tomcatcon1.png启动脚本功能
• Per startup log rotation for catalina.out
• Smart auto-fix for incorrect JVM args
• CATALINA_BASE preparation
• Tomcat startup status detection
监测、诊断和开发工具
- Tomcat Monitor (RESTful service)
• Metrics for OS, JVM, Tomcat, Middleware, and application 操作系统、JVM、Tomcat、中间件、应用的指标Metrics
• Classloading: locate which jar file a class is loaded from 类装载:定位class是从哪一个jar包加载的
• Thread: per thread CPU usage, thread state, etc. 线程:每个线程的CPU使用情况、线程状态等等。
• Connector stats: tomcat thread pool statistics Connector状态:tomcat线程池状态数据 - Diagnostics on production environment 生产环境诊断
• https://github.com/oldmanpushcart/greys-anatomy
• Much easier to use than BTrace 这个工具比BTrace使用简单(译者注:Greys,arthas的前身) - 开发工具
• Package free tomcat Eclipse plugin 免打包tomcat eclipse插件
其他值得一提的实践
- 集群session管理, taobao Session
• Cookie + 分布式kv存储(Tair) - 数据库连接池: Druid
• https://github.com/alibaba/druid
• 高性能、可视化监控、扩展性 - Multi-tenancy多租户
• 传统web应用的高密度部署
• 提供CPU和内存隔离
• 基于多租户JVM
二、高吞吐web应用
tomcatcon2.png- Taobao API Gateway,主要提供给手机端APP
- 与数百个后端服务交互
- 每秒处理百万级请求
整体架构
tomcatcon3.png-
Nginx + Tomcat部署在同一台机器
• 安全性
• Rate Limiting限流
三、面临的挑战
tomcatcon4.png• Connector的选择
• Configuration调优
• NIO Connection和并发问题
• 案例1
• 安全问题
• 案例2
connector选择,有3种架构方式:
-
BIO + Sync RPC :每个请求1个worker线程;没办法支撑到每秒数千个请求;CPU利用率低下。
-
APR + Async RPC :读request header是阻塞的;处理完一个连接过来的请求之后、等待下一个请求来之前、线程可以去服务其他连接,也就是“waiting for the next request ”是非阻塞的。缺点:JVM崩溃问题;维护成本高,需要额外单独的tcnative library
-
NIO + Async RPC :读request header和等连接上的下一个请求都是不阻塞线程的;完全异步,推荐。
Connector配置调优
• Do not change if you really encounter some issue
• Read the documentation carefully
配置参数 | 默认 | 建议 | 说明 |
---|---|---|---|
ConnectionTimeout | 20s | 减小 | |
maxThreads | 200 | 增加 | |
acceptCount (backlog) | 100 | 增加 | min(acceptCount , /proc/sys/net/core/somaxconn) |
processorCache | 200 | 增加 | max(maxThreads, concurrent connection) |
关闭access log
使用nginx侧的access log
四、案例研究
略
五、总结
- 通过异步化来增加系统的吞吐量
• NIO 对于高吞吐量生产环境相对稳定
• 检查正在使用的tomcat版本是否有已知的issue - 排查并发问题可能会非常棘手
• 使用好的工具至关重要 - 及时升级tomcat版本到最新的updates
六、Q & A
略
原文结束
网友评论