Tomcat 线上调优记录

news2024/9/23 21:23:55

原始Tomcat配置

  • 启动参数

Plaintext
-Xms256m -Xmx512m -XX:MaxPermSize=128m

  • Tomcat 参数配置

XML
<Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
 maxThreads="1500" minSpareThreads="50" maxIdleTime="600000"/>
    <Connector
               port="8801" protocol="org.apache.coyote.http11.Http11Nio2Protocol"
               connectionTimeout="20000" URIEncoding="UTF-8"
               enableLookups="false"
               sendReasonPhrase="true"
               useBodyEncodingForURI="true"  maxThreads="500"
               compression="on" compressionMinSize="2048"
               compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain"
               acceptCount="1200" disableUploadTimeout="true"/>

第一次修改

问题表现

  • Tomcat 接口重启,tomcat 线程飙升到1000+,短时间内出现大量OOM,表现出的现象数据库连接不可用,数据查询超时等。进而导致服务不可用

Plaintext
?[m?[1;35m2022-04-13 19:01:42 ERROR [http-nio2-8803-exec-500] (ResultInterceptor.java:172) [result exception...msgType : 3, code : 99, msg : Could not get JDBC Connection; nested exception is com.alibaba.druid.pool.GetConnectionTimeoutException: wait millis 10656, active 18, maxActive 24, creating 0, error: com.alibaba.druid.pool.DruidDataSource.getConnectionInternal(DruidDataSource.java:1775)       
com.alibaba.druid.pool.DruidDataSource.getConnectionDirect(DruidDataSource.java:1427)       
com.alibaba.druid.filter.FilterChainImpl.dataSource_connect(FilterChainImpl.java:5059) ]

Plaintext
?[m?[1;35m2022-04-13 19:05:26 ERROR [http-nio2-8812-exec-303] (ResultInterceptor.java:172) [result
?[mognl.MethodFailedException: Method "handleMsg" failed for object friendGame.action.HandleMsgAction@31aa0e68 [java.lang.OutOfMemoryError: GC overhead limit exceeded]
        at ognl.OgnlRuntime.callAppropriateMethod(OgnlRuntime.java:1932)
        at ognl.ObjectMethodAccessor.callMethod(ObjectMethodAccessor.java:68)
        at com.opensymphony.xwork2.ognl.accessor.XWorkMethodAccessor.callMethodWithDebugInfo(XWorkMethodAccessor.java:98)
        at com.opensymphony.xwork2.ognl.accessor.XWorkMethodAccessor.callMethod(XWorkMethodAccessor.java:90)
        at ognl.OgnlRuntime.callMethod(OgnlRuntime.java:1996)

  • 短暂的出现大量memcached 的连接

推测问题原因

  • Tomcat 线程数配置的过高,减少tomcat的最大线程配置,调大tomcat 的初始线程数
  • 服务中过度依赖memcached ,一个登录操作可能存在几十个查询操作,memcached响应过慢时,会导致tomcat 导致创建大量线程
  • 基于 xmemcached 作为memcached连接SDK 其底层消息响应机制基于java.util.concurrent.CountDownLatch 实现,过多使用会导致cpu 使用率增高

程序修改点

  • 启动参数

堆最大小统一为512MB ,移除jdk7的永久代参数配置,新增新生代配置

Plaintext
 -Xms512m -Xmx512m -Xmn256m

Tomcat  参数配置

  • 移除Executor 线程池配置减少冗余线程
  • Connector maxThreads修改为500,新增  minSpareThreads="50" 初始化线程为50

Plaintext
<!--    <Executor name="tomcatThreadPool" namePrefix="catalina-exec-"-->
<!--        maxThreads="1500" minSpareThreads="50" maxIdleTime="600000"/>-->

    <Connector
               port="8801" protocol="org.apache.coyote.http11.Http11Nio2Protocol"
               connectionTimeout="20000" URIEncoding="UTF-8"
               enableLookups="false"
               sendReasonPhrase="true"
               useBodyEncodingForURI="true"
minSpareThreads="50" maxThreads="500"
               compression="on" compressionMinSize="2048"
               compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain"
               acceptCount="1200" disableUploadTimeout="true"/>

优化点

  • 限制tomcat 的线程数,避免重启时(瞬时高峰)导致线程创建过多
  • 修改堆的最大最小值,降低堆内存的动态变化的性能影响
  • 项目中对应公共不变的数据,采用本地缓存(Caffeine )
  • 接口服务对接PinPoint 进行监控

仍存在的问题

  • 重启时Tomcat 仍创建到了 线程池限制的最大值
  • 短时间出现memcached 连接超时大量减少,但极少连接超时信息
  • 重启时客户端能看到短时间的卡顿

第二次修改

问题表现

  • 项目下午三点更新,晚七点高峰期开始收到服务器资源预警,CPU和内存使用暴增,观察接口出现大量数据连接异常和OOM 日志
  • 观察PinPoint 上日志记录 更新后tomcat 线程持续保持在最大值附近,jvm频繁的出现full gc
  • 查看历史的升级记录,每次升级tomcat 线程都是保持到最大值持续到第二天凌晨开始降低

推测问题原因

  • 对比其它项目组的jvm内存配置,jvm 堆内存设置偏小
  • 运维的通过监听tomcat端口号的限流策略存在不合理处。在端口号启动后将有半分钟左右的服务不可用空窗期,大量的消息堆积导致至服务可用时,tomcat 的处理线程被压满,因为tomcat 的线程销毁策略是60s内没有被使用。故tomcat 的线程数目在凌晨左右开始降低

程序修改点

  • 启动参数
  • 提升JVM 的堆内存为1g
  • 设置元空间的初始大小与最大值
  • 设置JVM 发生OOM 时保存堆信息到指定文件

Plaintext
-Xms1g
-Xmx1g
-Xmn512m
-XX:MetaspaceSize=128m
-XX:MaxMetaspaceSize=320m
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/home/gcweb/jdk_dump

优化点

  • 扩大堆的内存限制,增大服务器资源的使用
  • 设置新生代的的初始值,避免在未达到初始值前提下每次扩增时带来的FullGC
  • 记录OOM的堆信息况
  • 运维人员使用新的重启放流策略,采用监控url 方式取代端口监听。 重启时限制nginx 发送消息到接口,监控接口服务检测url 地址 是否可用,第一次可用时延期1min 再次检测是否可用。两次可用时,nginx 开始放流
  • 修改接口重启时各项指标保持在正常水平,客户端没有明显的卡顿感

第三次修改

问题表现

  • pinpoint上观察堆使用明显偏高,full gc 的一天有三四次,在12,19 点高峰期尤为明显

推测问题原因

  • 本地保持与线上相同的tomcat配置,压测接口。并通过visualvm 观察jvm 堆信息。
  • 压测后发现 s1,s0 逐渐变小,eden 开始变大,导致 eden  gc时 s0,s1容量无法承受eden  的对象信息,导致大量对象进入老年代,进而fullgc 比较频繁

程序修改点

  • 启动参数
  • 指定CMS GC 算法

Plaintext
-Xms1g
-Xmx1g
-Xmn512m
-XX:MetaspaceSize=128m
-XX:MaxMetaspaceSize=320m
-XX:+UseConcMarkSweepGC
-XX:+UseCMSCompactAtFullCollection
-XX:CMSInitiatingOccupancyFraction=70
-XX:+CMSParallelRemarkEnabled
-XX:SoftRefLRUPolicyMSPerMB=0
-XX:SurvivorRatio=8
-XX:-OmitStackTraceInFastThrow
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/home/gcweb/

优化点

  • 指定CMS 作为 老年代的GC 算法,并开启GC 后压缩UseCMSCompactAtFullCollection
  • 通过指定CMS 禁用了 UseAdaptiveSizePolicy 新生代的内存动态变化策略,避免过多数据进入老年代

开启UseAdaptiveSizePolicy

高并发访问后

重点关注

  • Tomca 线程数目最大值设置数目过大,瞬时高峰导致创建过多线程可能导致OOM
  • Tomcat 业务处理线程,并非启动时创建。是在第一个http 请求到来时开始创建(最多一次创建50个线程。未达到核心线程时,第二次访问再创建),故前端开始放流时,会出现短暂的CPU使用率增高
  • GC 算法选择,不推荐使用默认的 -XX:+UseAdaptiveSizePolicyJdk5 默认开启) 其目的为了增大JVM 吞吐量。开启后 新生代 egen:s0:s1 不再遵守指定的比例大小(4:1:1)而是采用JVM自己动态变化的新生代的分层大小。故开启后 s1,s2 很可能被压缩的很小,导致youngGc时,大量的对象被压倒 老年代 ,进而产生频繁full gc 推荐使用Jdk8 推荐 CMSJdk9+ 使用G1 jdk9 g1商用化)
  • Jvm 内存大小设置,推荐堆的总体大小1g+ ,新生代不少于堆总体一半,s1,s2 的容量不要过小,避免 yongGc 时因对象过大,而直接进入老年代

监控工具

  1.  pinpoint (运维部门已支持),可以监控jvm 的大至堆使用,fullgc 的频率
  1. Arthas 用于堆使用详情,gc的详情,以及动态修改jvm 部分参数
  1. visualVm 用于开发环境测试(推荐 安装 visualgc 插件,监控gc详情)

visualVm  本机使用观察注意项

下载 不推荐 Oracle jdk8 自带的。

推荐下载的插件

Java 启动的参数信息

仪表盘信息,总体介绍 jvm 使用信息

当前线程使用情况

支持sample 支持监控特定时间的 java 的内存cpu 使用情况

profile  可用监控 项目中 sql 的使用信息,cpu,锁 等信息监控,(开源版存在,Oracle版无)

常用jdk8 JVM参数

Plaintext

-Xmx1g
-Xms1g
:初始堆大小直接等于最大堆大小
-Xmn512m         新生代大小
-XX:MetaspaceSize=128m        元空间初始大小
-XX:MaxMetaspaceSize=320m         元空间最大值
-XX:+UseConcMarkSweepGC        尽量使用CMS收集器,降低GC停顿时间
-XX:+UseCMSCompactAtFullCollection        使用并发收集器时,开启对年老代的压缩.
-XX:CMSInitiatingOccupancyFraction        使用cms作为垃圾回收使用70%后开始CMS收集
-XX:+CMSParallelRemarkEnabled        降低标记停顿
-XX:SoftRefLRUPolicyMSPerMB=0 避免元空间fullgc时 class被清理 导致重新加载
-XX:SurvivorRatio=8 新生代 内存分区 6:1:1
-verbose:gc 在控制台输出GC情况
-XX:+PrintGCDetails 在控制台输出详细的GC情况
-XX:+PrintGCDateStamps GC的打印基于日期的时间戳
-XX:-OmitStackTraceInFastThrow  避免打印同样错误日志到一定次数就会被jvm默认优化掉。
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=C:/Users/liaojinlong/Downloads/dump/heap/(文件路径-保证目录存在)

-XX:+UseStringDeduplication 合并重复字符串
-XX:+DisableExplicitGC 禁用代码中System.gc()
-XX:-UseAdaptiveSizePolicy 关闭内存分配策略自适应 保证 edgen:s1:s2 8L1:1

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/356925.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

传感器原理及应用期末复习汇总(附某高校期末真题试卷)

文章目录一、选择题二、填空题三、简答题四、计算题一、选择题 1.下列哪一项是金属式应变计的主要缺点&#xff08;A&#xff09; A、非线性明显 B、灵敏度低 C、准确度低 D、响应时间慢 2.属于传感器动态特性指标的是&#xff08;D&#xff09; A、重复性 B、线性度 C、灵敏…

Centos7安装Python3

前言系统版本&#xff1a;Centos7.6python版本&#xff1a; python 3.10.4下载python下载链接&#xff1a;直通车找到对应版本的python安装包,这里以python 3.10.4为例点击3.10.4版本的链接&#xff0c;拉到最下面找到Files中对应的linux安装包鼠标右键复制下载链接登录linux系…

西电_数字信号处理二_学习笔记

文章目录【 第1章 离散随机信号 】【 第2章 维纳滤波 】【 第3章 卡尔曼滤波 】【 第4章 自适应滤波 】【 第5章 功率谱估计 】这是博主2022秋季所学数字信号处理二的思维导图&#xff08;软件是幕布&#xff09;&#xff0c;供大家参考&#xff0c;如内容上有不妥之处&#xf…

面试题记录

Set与Map的区别 map是键值对&#xff0c;set是值的集合。键&#xff0c;值可以是任何类型map可以通过get获取&#xff0c;map不能。都能通过迭代器进行for…of遍历set的值是唯一的&#xff0c;可以做数组去重&#xff0c;map&#xff0c;没有格式限制&#xff0c;可以存储数据…

Lesson4---Python语言基础(2)

4.1 内置数据结构 4.1.1 序列数据结构&#xff08;sequence&#xff09; 成员是有序排列的每个元素的位置称为下标或索引通过索引访问序列中的成员Python中的序列数据类型有字符串、列表、元组 “abc” ≠ “bac” 4.1.1.1 创建列表和元组 Python中的列表和元组&#xff0c…

阶段二10_面向对象高级_分类分包思想和案例环境搭建

一.分类思想 1.分类思想概念&#xff1a; 分工协作&#xff0c;专人干专事 2.信息管理系统分类[案例] Student 类-------------------->标准学生类&#xff0c;封装键盘录入的学生信息&#xff08;id , name , age , birthday&#xff09; StudentDao 类-----------------&…

2022年全国职业院校技能大赛(中职组)网络安全竞赛试题(3)

目录 模块A 基础设施设置与安全加固 &#xff08;本模块20分&#xff09; 一、项目和任务描述&#xff1a; 假定你是某企业的网络安全工程师&#xff0c;对于企业的服务器系统&#xff0c;根据任务要求确保各服务正常运行&#xff0c;并通过综合运用用户安全管理与密码策略、…

vTESTstudio - VT System CAPL Functions - VT7001

vtsSerialClose - 关闭VT系统通道的串行端口功能&#xff1a;关闭由系统变量命名空间指定的VT系统通道的串行端口。Target&#xff1a;目标通道变量空间名称&#xff0c;例如&#xff1a;VTS::ECUPowerSupply返回值&#xff1a;0&#xff1a;成功重置目标通道最大和最小值-1&am…

密码的世界

网络世界中常见的攻击方法 窃听攻击 窃听攻击是网络世界最常见的一种攻击方式&#xff0c;一些不能泄露的隐私信息&#xff0c;例如银行卡密码&#xff0c;账号密码&#xff0c;如果被窃听泄露的话通常会带来比较严重的后果。 中间人攻击 在中间人攻击中&#xff0c;小明准…

九龙证券|突然哑火!最火爆中小盘明显回调,后市咋走?机构最新解读

中证1000和国证2000指数创年内新高后&#xff0c;连续2日回调。 2月17日A股商场震动下行&#xff0c;创业板指数跌幅超2%&#xff0c;近3000只个股跌落&#xff0c;北向资金小幅净流入&#xff0c;商场成交额接近万亿关口&#xff0c;港股也出现显着回调痕迹。 以中小市值公司…

XSS基础——xsslabs通关挑战

目录XSS基础一、XSS基础概念1、XSS基础概念2、XSS分类二、xsslabs通关挑战level 1level 2level 3htmlspecialchars函数html事件属性level 4level 5level 6level 7level 8深入理解浏览器解析机制和XSS向量编码level 9level 10level 11level 12level 13三、总结XSS基础 一、XSS基…

算法刷刷刷| 二叉树篇| 110平衡二叉树| 257二叉树的所有路径 |404左叶子之和| 513找树左下角的值| 112路径总和| 113路径总和II

110.平衡二叉树 给定一个二叉树&#xff0c;判断它是否是高度平衡的二叉树。 本题中&#xff0c;一棵高度平衡二叉树定义为&#xff1a; 一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。 class Solution {public boolean isBalanced(TreeNode root) {int dfs…

【前端】Vue3+Vant4项目:旅游App-项目总结与预览(已开源)

文章目录项目预览首页Home日历&#xff1a;日期选择开始搜索位置选择上搜索框热门精选-房屋详情1热门精选-房屋详情2其他页面项目笔记项目代码项目数据项目预览 启动项目&#xff1a; npm run dev在浏览器中F12&#xff1a; 首页Home 热门精选滑动到底部后会自动加载新数据&a…

【factoryio】使用SCL编写 <机械手控制> 程序

使用虚拟工厂软件和博图联合仿真来编写【scl】机械手控制程序 文章目录 目录 文章目录 前言 二、程序编写 1.机械手运行部分 2.启动停止部分 3.急停复位部分 三、完整代码 总结 前言 在前面我们一起写过了许多案例控制的编写&#xff0c;在这一章我们一起来编写一下一个…

Vue中 引入使用 babel-polyfill 兼容低版本浏览器

注意&#xff1a;本文主要介绍的 vue-cli 版本&#xff1a;3.x&#xff0c; 4.x&#xff1b; 最近在项目中使用 webpack 打包后升级&#xff0c;用户反馈使用浏览器&#xff08;chrome 45&#xff09;访问白屏。经过排查发现&#xff1a;由于 chrome 45 无法兼容 ES6 语法导致的…

linux018之安装mysql

linux上安装mysql&#xff1a; 第一步&#xff1a;查看是否已经安装mariadb&#xff0c;mariadb是mysql数据库的分支&#xff0c;mariadb和mysql一起安装会有冲突&#xff0c;所以需要卸载掉。 yum list installed | grep mariadb &#xff1a;查看是否安装mariadb&#xff0c;…

「可信计算」论文初步解读

可信计算组织&#xff08;Ttrusted Computing Group,TCG&#xff09;是一个非盈利的工业标准组织&#xff0c;它的宗旨是加强在相异计算机平台上的计算环境的安全性。TCG于2003年春成立&#xff0c;并采纳了由可信计算平台联盟&#xff08;the Trusted Computing Platform Alli…

数据结构与算法

1、复杂度分析&#xff08;上&#xff09;&#xff1a;如何分析、统计算法的执行效率和资源消耗&#xff1f;复杂度分析是整个算法学习的精髓&#xff0c;只要掌握了它&#xff0c;数据结构和算法的内容基本上就掌握了一半。&#xff08;1&#xff09;为什么需要复杂度分析&…

Github 学生优惠包 -- 最新防踩坑指南

Github学生优惠包的申请最近越来越麻烦&#xff0c;里面有非常多的坑&#xff0c;留下此文防止各位申请的时候踩到。 此文面向中国大陆真正有学生身份的同学&#xff01;&#xff01;&#xff01; 文章目录前言1.用到的网址2.申请所需3.详细步骤4.踩坑点前言 记得在一年以前还…

进程的概念

进程的概念 程序的概念 这里说的是一个可执行文件&#xff0c;passive的意思可以理解为我们这个执行文件需要我们进行双击才会被被执行。 双击后&#xff0c;程序入口地址读入寄存器&#xff0c;程序加载入主存&#xff0c;成为一个进程 进程是主动去获取想要的资源&#xff0…