当前位置:首页 > 技术 > 正文内容

【经验】通过JVM调优,让凯哥个人博客响应速度提升了不少

Lotus2022-11-01 20:17技术

为什么你的个人博客访问慢?


不知道大家有没有注意到,在22.10.31 21点之后,凯哥的个人博客站点(凯哥Java:www.kaigejava.com)访问速度提升了不少。那是因为凯哥对站点做了优化。本文就记录优化方面:

优化从以下几个方面入手的:

1:JVM调优

2:日志打印

3:删除已经不用的代码

前提条件:

凯哥个人博客,是购买阿里云最廉价的机器。配置如下:1C2G1M的共享性。

【经验】通过JVM调优,让凯哥个人博客响应速度提升了不少_服务器


一:JVM调优​

先来看看优化前凯哥配置的Tomcat启动参数

【经验】通过JVM调优,让凯哥个人博客响应速度提升了不少_日志文件_02


-Xms512m -Xmx512m -Xmn512m -Xss1024K -XX:MaxPermSize=256m -XX:MaxNewSize=256m

再来看看修改前服务器情况:

【经验】通过JVM调优,让凯哥个人博客响应速度提升了不少_服务器_03


是不是很刺激。

排查网站访问慢,主要原因是CPU使用率太高了。不小心就100%的使用率。CPU处理不过来,页面可不响应慢吗。

这真好是一个CPU占用过高的案例。我们就来讲讲CPU占用过高排查流程吧

1:CPU占用过高排查流程​

1:利用top命令查出CPU最高的进程PID。比如是16379

top

【经验】通过JVM调优,让凯哥个人博客响应速度提升了不少_物理内存_04

【经验】通过JVM调优,让凯哥个人博客响应速度提升了不少_物理内存_05


2:查看该进程下占用最高的线程ID .

公式:【top -Hp pid】

top -Hp 16379


【经验】通过JVM调优,让凯哥个人博客响应速度提升了不少_服务器_06



3:根据占用率最高的线程ID。将其转换成16精致形式(因为java native线程以16进制形式书城)

公式:【printf '%x\n' 线程id】

比如上图占用最高的线程id是16383。所以查看命令:

printf '%x\n' 16383


【经验】通过JVM调优,让凯哥个人博客响应速度提升了不少_日志文件_07



4:利用jstack打印出线程调用栈信息。

公式:【jstack top最高pid | grep printf出来的十六进制 -A50 --color】

jstack 16379 | grep '3fff' -A50 --color

【经验】通过JVM调优,让凯哥个人博客响应速度提升了不少_物理内存_08


可以看到GC相关的线程在runnable。吆西。那我们就来看看GC的情况:

【经验】通过JVM调优,让凯哥个人博客响应速度提升了不少_日志文件_09

从上图,我们可以看到Full GC 还是很频繁啊。

【经验】通过JVM调优,让凯哥个人博客响应速度提升了不少_物理内存_10


我们再来看看

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:设置年轻代大小。

整个堆大小

年轻代\年老代比例设置​

-XX:NewRation:设置年轻代(包括Eden和两个Survivor区)与来年代的比值(除去持久化)。

-XX:SurvivorRation:设置年轻代中Eden去与Survivor去的大小比值。

-XX:MaxPermSize:设置持久代大小

--XX:MaxTenuringThreshold 设置垃圾最大年龄。如果设置为0,年轻代对象不经过Survivor区。直接进老年代。

再来看看凯哥服务器配置:

【经验】通过JVM调优,让凯哥个人博客响应速度提升了不少_服务器_11


再来回顾下凯哥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

【经验】通过JVM调优,让凯哥个人博客响应速度提升了不少_日志文件_12


栈设置的太小了,最小也得228K。

-Xms768m -Xmx768m -Xmn512m -Xss228K -XX:MaxPermSize=256m -XX:MaxNewSize=256m

修改之后,重启服务后,查看gc日志:

【经验】通过JVM调优,让凯哥个人博客响应速度提升了不少_物理内存_13


可以明显的看到gc的频率下降了。服务启动正常。可以正常访问。

二:日志打印​

当时查看,凯哥服务器的磁盘可以使用的剩下2~3个G了。而且日志文件:

【经验】通过JVM调优,让凯哥个人博客响应速度提升了不少_服务器_14


磁盘读写延迟时间:

【经验】通过JVM调优,让凯哥个人博客响应速度提升了不少_物理内存_15


磁盘快满了,导致磁盘读写延迟很高。所以,凯哥优化采用的第二种方式就是删除日志文件,释放磁盘空间

三:删除已经不用的代码​

从启动日志中,凯哥看到了还有很多和当前博客不相关的。于是果断删除了一些不用的代码。

这些都操作完成之后,服务重启,访问博客。速度有明显的提升。

小总结:​

1:当服务访问速度明显下降后,要及时查看服务器资源情况。看看是cpu高还是内存占用高

2:分析JVM的各个参数。在对JVM进行调优前,需要对这些参数有深入理解,以及对当前服务器资源了解。别想凯哥一样,没有考虑当前服务器的资源(-Xss:1M 是之前机器配置的。之前机器性能比这个好)

3:要记得给服务器添加打印gc的日志文件。可以通过观察gc的日志文件查看gc频率

4:记得服务器磁盘大小也要监控。

5:及时删除项目中,已经不再使用的无用代码



原文链接

扫描二维码推送至手机访问。

版权声明:本文来源于网络,仅供学习,如侵权请联系站长删除。

本文链接:https://news.layui.org.cn/post/1002.html

分享给朋友:

“【经验】通过JVM调优,让凯哥个人博客响应速度提升了不少” 的相关文章

用 VS Code 搞Qt6:使用 PySide 6

一般来说,用C++写 Qt 应用才是正宗的,不过,为了让小学生也能体验 Qt 的开发过程,或者官方为了增加开发者人数,推出了可用 Python 来编程的 Qt 版本。此版本命名比较奇葩,叫 PySide,与 Qt 6 配套的是 PySide 6。当前最新版本是 6.3.2。 PySide 的优势在于它是官方维护的,完全是C++开发的。在原有库基础上增加了对应的 .pyd 文件,对 API 做了封装...

SqlKata - 方便好用的 Sql query builder

SqlKata查询生成器是一个用C# 编写的功能强大的Sql查询生成器。它是安全的,与框架无关。灵感来源于可用的顶级查询生成器,如Laravel Query Builder和 Knex。 SqlKata有一个富有表现力的API。它遵循一个干净的命名约定,这与SQL语法非常相似。 通过在受支持的数据库引擎上提供一个抽象级别,允许您使用相同的统一API处理多个数据库,并且可搭配 dapper 使用,可...

激活数据价值,探究DataOps下的数据架构及其实践丨DTVision开发治理篇

据中国信通院发布,2012 年到 2021 年 10 年间,我国数字经济规模由 12 万亿元增长到 45.5 万亿元,在整个 GDP 中的比重由 21.6% 提升至 39.8%。顺应时代发展新趋势,“数据” 成为新的生产要素已是毋庸置疑的共识。 如果说数据中台的崛起代表着企业数字化转型从流程驱动走向数据驱动,从数字化走向智能化。那么 DataOps,则是实现数据中台的一个优秀的理念或方法论。 D...

Python基础(十) | Numpy详细教程

第十一章 Numpy库 ⭐本专栏旨在对Python的基础语法进行详解,精炼地总结语法中的重点,详解难点,面向零基础及入门的学习者,通过专栏的学习可以熟练掌握python编程,同时为后续的数据分析,机器学习及深度学习的代码能力打下坚实的基础。 ????本文已收录于Python基础系列专栏: Python基础系列教程 欢迎订阅,持续更新。 10.1 为什么要用Numpy 10.1.1  ...

C语言下for循环的一点技巧总结

for循环是普遍应用与各种计算机语言的一种循环方式。 一般情况下, for循环规则:for(条件一;条件二;条件三) 条件一为满足条件,也就是条件一为1时,进入这个for循环。条件二为循环条件,也就是说当条件二不满足时继续循环。条件三为循环递增条件,里面罗列循环节递增的方式。for循环在实际运行的时候是:首先判断条件一是否为1,为1时进入循环内的下一步,为0跳过整个for循环。其次判断条件二是否为...

分布式存储系统之Ceph集群存储池操作

  前文我们了解了ceph的存储池、PG、CRUSH、客户端IO的简要工作过程、Ceph客户端计算PG_ID的步骤的相关话题,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/16733806.html;今天我们来聊一聊在ceph上操作存储池相关命令的用法和说明;   在ceph上操作存储池不外乎就是查看列出、创建、重命名和删除等操作,常用相关的工具都是“cep...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。