This commit is contained in:
by931
2022-09-06 22:30:37 +08:00
parent 66970f3e38
commit 3d6528675a
796 changed files with 3382 additions and 3382 deletions

View File

@@ -190,13 +190,13 @@ function hide_canvas() {
<blockquote>
<p>前面一节课阐述了 JDK 的发展过程,以及怎么安装一个 JDK在正式开始进行 JVM 的内容之前,我们先了解一下性能相关的一些基本概念和原则。</p>
</blockquote>
<p><img src="assets/bnt0w.png" alt="0.260488235671565.png" /></p>
<p><img src="assets/bnt0w.png" alt="png" /></p>
<p>如果要问目前最火热的 JVM 知识是什么? 很多同学的答案可能是 “<code>JVM 调优</code>” 或者 “<code>JVM 性能优化</code>”。但是具体需要从哪儿入手,怎么去做呢?</p>
<p>其实“调优”是一个诊断和处理手段,我们最终的目标是让系统的处理能力,也就是“性能”达到最优化,这个过程我们就像是一个医生,诊断和治疗“应用系统”这位病人。我们以作为医生给系统看病作为对比,“性能优化”就是实现“把身体的大小毛病治好,身体达到最佳健康状态”的目标。</p>
<p>那么去医院看病,医生会是怎么一个处理流程呢?先简单的询问和了解基本情况,发烧了没有,咳嗽几天了,最近吃了什么,有没有拉肚子一类的,然后给患者开了一系列的检查化验单子:去查个血、拍个胸透、验个尿之类的。然后就会有医生使用各项仪器工具,依次把去做这些项目的检查,检查的结果就是很多标准化的具体指标(这里就是我们对 JVM 进行信息收集,变成各项指标)。</p>
<p>然后拿过来给医生诊断用,医生根据这些指标数据判断哪些是异常的,哪些是正常的,这些异常指标说明了什么问题(对系统问题进行分析排查),比如是白细胞增多(系统延迟和抖动增加,偶尔宕机),说明可能有炎症(比如 JVM 配置不合理)。最后要“对症下药”,开出一些阿莫西林或者头孢(对 JVM 配置进行调整),叮嘱怎么频率,什么时间点服药,如果问题比较严重,是不是要住院做手术(系统重构和调整),同时告知一些注意事项(对日常运维的要求和建议),最后经过一段时间治疗,逐渐好转,最终痊愈(系统延迟降低,不在抖动,不再宕机)。通过了解 JVM 去让我们具有分析和诊断能力,是本课程的核心主题。</p>
<h3>2.1 量化性能相关指标</h3>
<p><img src="assets/9iyxk.png" alt="0.7784482211178771.png" /></p>
<p><img src="assets/9iyxk.png" alt="png" /></p>
<p>&quot;没有量化就没有改进&quot;,所以我们需要先了解和度量性能指标,就像在医院检查以后得到的检验报告单一样。因为人的主观感觉是不靠谱的,个人经验本身也是无法复制的,而定义了量化的指标,就意味着我们有了一个客观度量体系。哪怕我们最开始定义的指标不是特别精确,我们也可以在使用过程中,随着真实的场景去验证指标有效性,进而替换或者调整指标,逐渐的完善这个量化的指标体系,成为一个可以复制和复用的有效工具。就像是上图的<code>血常规检查报告单</code>,一旦成为这种标准化的指标,那么使用它得到的结果,也就是这个报告单,给任何一个医生看,都是有效的,一般也能得到一致的判断结果。</p>
<p>那么系统性能的诊断要做些什么指标呢?我们先来考虑,进行要做诊断,那么程序或 JVM 可能出现了问题,而我们排查程序运行中出现的问题,比如排查程序 BUG 的时候,要优先保证正确性,这时候就不仅仅是 JVM 本身的问题,例如死锁等等,程序跑在 JVM 里,现象出现在 JVM 上,很多时候还要深入分析业务代码和逻辑确定 Java 程序哪里有问题。</p>
<ol>
@@ -229,7 +229,7 @@ function hide_canvas() {
<li><strong>业务需求指标</strong>:如吞吐量(QPS、TPS)、响应时间(RT)、并发数、业务成功率等。</li>
<li><strong>资源约束指标</strong>:如 CPU、内存、I/O 等资源的消耗情况。</li>
</ul>
<p><img src="assets/uc0za.png" alt="0.3186824516633562.png" /></p>
<p><img src="assets/uc0za.png" alt="png" /></p>
<blockquote>
<p>详情可参考: <a href="https://www.jianshu.com/p/62cf2690e6eb">性能测试中服务器关键性能指标浅析</a></p>
</blockquote>
@@ -246,7 +246,7 @@ function hide_canvas() {
<li>调整 JVM 启动参数GC 策略等等</li>
</ul>
<h3>2.3 性能调优总结</h3>
<p><img src="assets/wgj7v.png" alt="9b861ce8-8350-4943-ac1f-d6fb4fa2f127.png" /></p>
<p><img src="assets/wgj7v.png" alt="png" /></p>
<p>性能调优的第一步是制定指标,收集数据,第二步是找瓶颈,然后分析解决瓶颈问题。通过这些手段,找当前的性能极限值。压测调优到不能再优化了的 TPS 和 QPS就是极限值。知道了极限值我们就可以按业务发展测算流量和系统压力以此做容量规划准备机器资源和预期的扩容计划。最后在系统的日常运行过程中持续观察逐步重做和调整以上步骤长期改善改进系统性能。</p>
<p>我们经常说“<code>脱离场景谈性能都是耍流氓</code>”,实际的性能分析调优过程中,我们需要根据具体的业务场景,综合考虑成本和性能,使用最合适的办法去处理。系统的性能优化到 3000TPS 如果已经可以在成本可以承受的范围内满足业务发展的需求,那么再花几个人月优化到 3100TPS 就没有什么意义,同样地如果花一倍成本去优化到 5000TPS 也没有意义。</p>
<p>Donald Knuth 曾说过“<code>过早的优化是万恶之源</code>”,我们需要考虑在恰当的时机去优化系统。在业务发展的早期,量不大,性能没那么重要。我们做一个新系统,先考虑整体设计是不是 OK功能实现是不是 OK然后基本的功能都做得差不多的时候当然整体的框架是不是满足性能基准可能需要在做项目的准备阶段就通过 POC概念证明阶段验证。最后再考虑性能的优化工作。因为如果一开始就考虑优化就可能要想太多导致过度设计了。而且主体框架和功能完成之前可能会有比较大的改动一旦提前做了优化可能这些改动导致原来的优化都失效了又要重新优化多做了很多无用功。</p>