【经验】通过JVM调优,让凯哥个人博客响应速度提升了不少
为什么你的个人博客访问慢?
不知道大家有没有注意到,在22.10.31 21点之后,凯哥的个人博客站点(凯哥Java:www.kaigejava.com)访问速度提升了不少。那是因为凯哥对站点做了优化。本文就记录优化方面:
优化从以下几个方面入手的:
1:JVM调优
2:日志打印
3:删除已经不用的代码
前提条件:
凯哥个人博客,是购买阿里云最廉价的机器。配置如下:1C2G1M的共享性。
一:JVM调优
先来看看优化前凯哥配置的Tomcat启动参数
-Xms512m -Xmx512m -Xmn512m -Xss1024K -XX:MaxPermSize=256m -XX:MaxNewSize=256m
再来看看修改前服务器情况:
是不是很刺激。
排查网站访问慢,主要原因是CPU使用率太高了。不小心就100%的使用率。CPU处理不过来,页面可不响应慢吗。
这真好是一个CPU占用过高的案例。我们就来讲讲CPU占用过高排查流程吧
1:CPU占用过高排查流程
1:利用top命令查出CPU最高的进程PID。比如是16379
top
2:查看该进程下占用最高的线程ID .
公式:【top -Hp pid】
top -Hp 16379
3:根据占用率最高的线程ID。将其转换成16精致形式(因为java native线程以16进制形式书城)
公式:【printf '%x\n' 线程id】
比如上图占用最高的线程id是16383。所以查看命令:
printf '%x\n' 16383
4:利用jstack打印出线程调用栈信息。
公式:【jstack top最高pid | grep printf出来的十六进制 -A50 --color】
jstack 16379 | grep '3fff' -A50 --color
可以看到GC相关的线程在runnable。吆西。那我们就来看看GC的情况:
从上图,我们可以看到Full GC 还是很频繁啊。
我们再来看看JVM调优一些理论知识:
低延迟。延迟时间是值STW时间。STW越短,响应时间越好。度量标准是缩短由于垃圾收集引起的停顿时间或完全消除因垃圾收集所引起的停顿,避免应用程序运行时发生抖动。暂停时间越短算法越好。
3:MinorGC尽可能多地收集垃圾。这个原则就是MinorGC原则。准守这一原则可以降低应用程序FullGC的发生频率。
4:堆大小调整的着手点,分析点:
a、统计Minor GC持续时间
b、统计Minor GC的次数
c、统计Full GC的最长持续时间
d、统计最差情况下Full GC评率
e、统计GC持续时间和频率对优化堆的大小是主要着手点
f、我们按照业务系统对延迟和吞吐量的需求,在按照这些我们可以进行各个区大小的调整
g、一般来说吞吐量优先的垃圾回收器:-XX:+UseParallelGC -XX:+UseParallelOldGC.也就是常规的(PS/PO)
再来想想什么情况下需要调优?
1:老年代(Heap内存)持续上涨达到设置的最大内存值
2:Full GC次数频繁
3:GC停顿(STW)时间长(超过1S,具体值按照应用场景而定)
4:应用出现OOM等内存异常情况
5:应用出现堆外内存异常(OutOfDirectMemoryErro)等内存异常(failed to allocate 167777216byte(s) of directmemory. used:1056964615,max:1073741824)
6:应用中有使用本地缓存且占用大量内存空间
7:系统吞吐量与响应性能不高或下降
8:应用CPU占用过高不下或内存占用过高不下
额滴乖乖~。上面8种情况,凯哥命中了:1、2、3、7、8。哇嘎嘎。博客响应速度真的有点慢。得好几秒才能响应过来。调优走起:
我们先来看看常用的JVM参数:
设置JVM对内存的初始化大小和最大大小相关参数:
1:-Xms:设置JVM启动时候申请的最小内存。默认是物理内存的1/64
2:-Xmx:设置JVM可申请的最大内存。默认为物理内存的1/4。
从最小内存到最大内存调整过程:默认当空余堆内存小于40%的时候,JVM会增大Heap到-Xmx指定的大小。这个比例可以通过-XX:MinHeapFreeRation来指定;
从最大内存到最小内存调整过程:当空余堆内存大于70%的时候,JVM会减小heap的大小到-Xms指定的大小。这个比例可以通过XX:MaxHeapFreeRation来指定这个比例。
正是因为有了这个动态扩/缩容,为了减少JVM的扩/缩容。一般都是设置-Xms的大小等于-Xmx的值
线程相关参数:
3:-Xss:设置每个线程的堆大小。设置思路:看每个线程大约需要占用多少内存。可能会有多少线程同时运行等
年轻代\年老代大小设置相关的
4:-XX:NewSize:新生代初始化内存的大小(注意:该值需要小于-Xms的值)
5:-XX:MaxnewSize:新生代可悲分配的内存的最大上限(注意:该值需要小于-Xmx的值)
6:-Xmn:设置年轻代大小。
整个堆大小 = 年轻代大小 + 年老代大小+持久化大小。持久化大小一般规定为64MB。所以增大年轻代后,将会减少老年代的大小。此值对系统性能影响较大。Sun官方推荐配置为整个堆的3/8。
年轻代\年老代比例设置
-XX:NewRation:设置年轻代(包括Eden和两个Survivor区)与来年代的比值(除去持久化)。
-XX:SurvivorRation:设置年轻代中Eden去与Survivor去的大小比值。
-XX:MaxPermSize:设置持久代大小
--XX:MaxTenuringThreshold 设置垃圾最大年龄。如果设置为0,年轻代对象不经过Survivor区。直接进老年代。
再来看看凯哥服务器配置:
再来回顾下凯哥Tomcat配置的JVM参数:
-Xms512m -Xmx512m -Xmn512m -Xss1024K -XX:MaxPermSize=256m -XX:MaxNewSize=256m
根据上面-Xmx的设置来看,凯哥设置的Xms和Xmx应该没问题。但是GC很频繁啊,所以,不能看在上面的-Xmx:设置JVM可申请的最大内存。默认为物理内存的1/4这个来配置。应该配置大一点。
而且,凯哥在配置Xss的时候,也配置的有问题。把每个线程堆大小设置成了1M。凯哥服务器内存本来就紧张。而每个线程的大小1M。有点太浪费了。于是凯哥修改Tomcat的JVM参数。如下:
-Xms768m -Xmx768m -Xmn512m -Xss128K -XX:MaxPermSize=256m -XX:MaxNewSize=256m
启动的时候报错,启动失败。提示 :
The stack size specified is too small, Specify at least 228k
栈设置的太小了,最小也得228K。
-Xms768m -Xmx768m -Xmn512m -Xss228K -XX:MaxPermSize=256m -XX:MaxNewSize=256m
修改之后,重启服务后,查看gc日志:
可以明显的看到gc的频率下降了。服务启动正常。可以正常访问。
二:日志打印
当时查看,凯哥服务器的磁盘可以使用的剩下2~3个G了。而且日志文件:
磁盘读写延迟时间:
磁盘快满了,导致磁盘读写延迟很高。所以,凯哥优化采用的第二种方式就是删除日志文件,释放磁盘空间
三:删除已经不用的代码
从启动日志中,凯哥看到了还有很多和当前博客不相关的。于是果断删除了一些不用的代码。
这些都操作完成之后,服务重启,访问博客。速度有明显的提升。
小总结:
1:当服务访问速度明显下降后,要及时查看服务器资源情况。看看是cpu高还是内存占用高
2:分析JVM的各个参数。在对JVM进行调优前,需要对这些参数有深入理解,以及对当前服务器资源了解。别想凯哥一样,没有考虑当前服务器的资源(-Xss:1M 是之前机器配置的。之前机器性能比这个好)
3:要记得给服务器添加打印gc的日志文件。可以通过观察gc的日志文件查看gc频率
4:记得服务器磁盘大小也要监控。
5:及时删除项目中,已经不再使用的无用代码
【经验】通过JVM调优,让凯哥个人博客响应速度提升了不少的更多相关文章
- JVM调优之经验
在生产系统中,高吞吐和低延迟一直都是JVM调优的最终目标,但这两者恰恰又是相悖的,鱼和熊掌不可兼得,所以在调优之前要清楚舍谁而取谁.一般计算任务和组件服务会偏向高吞吐,而web展示则偏向低延迟才会带来 ...
- JVM调优(二)经验参数设置
调优设置具体解析 堆大小设置 JVM 中最大堆大小有三方面限制:相关操作系统的数据模型(32-bt还是64-bit)限制:系统的可用虚拟内存限制:系统的可用物理内存限制.32位系统下,一般限制在1.5 ...
- JVM调优的几种策略(转)
JVM参数调优是一个很头痛的问题,可能和应用有关系,别人说可以的对自己不一定管用.下面是本人一些JVM调优的实践经验,希望对读者能有帮助,环境LinuxAS4,resin2.1.17,JDK6.0,2 ...
- 【Spark深入学习 -14】Spark应用经验与程序调优
----本节内容------- 1.遗留问题解答 2.Spark调优初体验 2.1 利用WebUI分析程序瓶颈 2.2 设置合适的资源 2.3 调整任务的并发度 2.4 修改存储格式 3.Spark调 ...
- jmeter --JVM调优设置
JMeter用户可根据运行的计算机配置,来适当调整JMeter.bat中的JVM调优设置,如下所示: set HEAP=-Xms512m -Xmx512m set NEW=-XX:NewSize=12 ...
- 面试总问的jvm调优到底是要干什么?
1. 压力测试的理解,xxx的性能10w/s,对你有意义么? 没有那家卖瓜的会说自己家的不甜,同样,没有哪个开源项目愿意告诉你在对它条件最苛刻的时候压力情况是多少,一般官网号称给你看的性能指标都是在最 ...
- JVM调优参数、方法、工具以及案例总结
这种文章挺难写的,一是JVM参数巨多,二是内容枯燥乏味,但是想理解JVM调优又是没法避开的环节,本文主要用来总结梳理便于以后翻阅,主要围绕四个大的方面展开,分别是JVM调优参数.JVM调优方法(流程) ...
- jvm调优神器——arthas
在上一篇<jvm调优的几种场景>中介绍了几种常见的jvm方面调优的场景,用的都是jdk自带的小工具,比如jps.jmap.jstack等.用这些自带的工具排查问题时最大的痛点就是过程比较麻 ...
- Jvm调优理论篇
Jvm实战调优 OOM(Out Of Memory) 内存溢出错误 ps:由于Java虚拟机有许多实现,本文主要阐述的是OpenJDK的HotSpot虚拟机,JDK版本是8. 一.首先要明白造成OOM ...
- 高并发场景下JVM调优实践之路
一.背景 2021年2月,收到反馈,视频APP某核心接口高峰期响应慢,影响用户体验. 通过监控发现,接口响应慢主要是P99耗时高引起的,怀疑与该服务的GC有关,该服务典型的一个实例GC表现如下图: 可 ...
随机推荐
- GuavaCache、EVCache、Tair、Aerospike 缓存框架比较
Guava Cache.EVCache.Tair.Aerospike 是不同类型的缓存解决方案,它们各有特点和应用场景.下面我会逐一分析这些缓存系统的优势.应用场景,并提供一些基本的代码示例. Gua ...
- C#中重写(override)及覆盖(new)的区别详解
1. 重写和覆盖的定义 1.1 重写(override)的定义 在C#中,用override关键字来重写一个父类中的虚方法或抽象方法.override关键字用于指示编译器,我要用派生类中的一个方法 ...
- linux 清理 pyinstaller 打包程序运行留下的临时文件
前言 pyinstaller 打包的 python 二进制可执行程序运行的时候,会在 /tmp 目录下生成 _MEI* (*指的是随机数字)文件夹, 如果程序没有正常退出或者终止了,_MEI* 文件夹 ...
- VUEX - 手稿
- IntellJ Idea遇到Errors occurred while compiling module的解决方法
问题描述 Information:java: Errors occurred while compiling module '0-common' Information:javac 11 was us ...
- Nuxt框架中内置组件详解及使用指南(四)
title: Nuxt框架中内置组件详解及使用指南(四) date: 2024/7/9 updated: 2024/7/9 author: cmdragon excerpt: 摘要:本文详细介绍了Nu ...
- 全网最适合入门的面向对象编程教程:09 类和对象的Python实现-类之间的关系,你知道多少?
全网最适合入门的面向对象编程教程:09 类和对象的 Python 实现-类之间的关系,你知道多少? 摘要: 本文主要对类之间的关系进行了基本介绍,包括继承.组合.依赖关系,并辅以现实中的例子加以讲解, ...
- redis基本数据结构-散列
redis基本数据结构-hash散列数据结构 1. 基本情况 一个散列键最多可以包含 2^32 - 1 个字段 散列类型不能嵌套其他数据类型 2.命令 插入/更新字段 hset key field1 ...
- WebGL加载本地模型
前言 大部分的webgl框架,比如threejs和babylon等,都可以加载obj和gltf模型. 我们的引擎,基于three封装,同样有加载模型的loader,因此加载obj和gltf模型也是很简 ...
- MYSQL DQL in 到底会不会走索引&in 范围查询引发的思考。
前情引子 in 会不会走索引?很多人肯定会回答.废话.如果命中了索引.那肯定会走. 其实我和大多数人一样.一开始也是这么想的.直至有一个血淋淋的案子让我有所改观.有所思考. 背景介绍 业务的工单表.我 ...