• 【Java面试】生产环境服务器变慢,如何诊断处理?


    “生产环境服务器变慢?如何诊断处理”

    这是最近一些工作5年以上的粉丝反馈给我的问题,他们去一线大厂面试,都被问到了这一类的问题。

    今天给大家分享一下,面试过程中遇到这个问题,我们应该怎么回答。

    这个问题高手部分的回答,我整理到了一个10W字的文档里面,大家可以在我的主页加V领取。

    来看看高手的回答。

    高手:#

    生产环境服务器处理效率变慢,我认为主要会涉及到三个纬度:

    • CPU的利用率
    • 磁盘IO效率
    • 内存

    CPU利用率过高或者CPU利用率过低,都会影响程序的处理效率。

    利用率过高,说明当前服务器要处理的指令比较多,当CPU忙不过来的时候,指令的运算效率自然就会下降。

    反馈在用户上的感受就是程序响应变慢了。

    针对这个问题,我们可以使用top命令查询当前系统中占用CPU过高的进程,以及定位到这个进程中比较活跃的线程。

    再通过jstack命令打印当前虚拟机的线程快照,然后根据快照日志排查问题代码。

    如果CPU利用率过低,说明程序资源使用不够,可以增加线程数量提升程序性能。

    程序运算过程中,会直接或者间接涉及到一些磁盘IO相关的操作,比如程序直接读写磁盘,

    或者程序依赖的第三方组件涉及到磁盘的持久化存储,所以磁盘的IO效率也会对程序运行效率产生影响。

    针对这个情况,可以使用iostat命令查看,如果磁盘负载较高,可以针对性的进行优化,比如

    • 借助缓存系统,减少磁盘IO次数
    • 用顺序写替代随机写入,减少寻址开销
    • 使用mmap替代read/write,减少内存拷贝次数

    另外,系统IO的瓶颈可以通过CPU和负载的非线性关系体现出来。当负载增大时,系统吞吐量不能有效增大,

    CPU不能线性增长,其中一种可能是IO出现阻塞。

    最后,就是内存的瓶颈,内存作为一块临时存储数据的组件,所有CPU运算的指令都需要从内存中去读写。

    内存的合理使用,可以减少应用和磁盘的直接IO频率,以及减少网络IO的频率,极大提升IO性能。

    其次,作为Java应用程序的运行平台JVM,对于内存的合理分配,能够避免频繁的YGC和FULL GC。

    内存使用率比较高的时候, 可以 dump 出 JVM 堆内存,然后借助 MAT 工具进行分析,

    查出大对象或者占用最多的对象,以及排查是否存在内存泄漏的问题。

    如果 dump 出的堆内存文件正常,此时可以考虑堆外内存被大量使用导致出现问题,

    需要借助操作系统指令 pmap 查出进程的内存分配情况。

    如果 CPU 和 内存使用率都很正常,那就需要进一步开启 GC 日志,分析用户线程暂停的时间、

    各部分内存区域 GC 次数和时间等指标,可以借助 jstat 或可视化工具 GCeasy 等,

    如果问题出在 GC 上面的话,考虑是否是内存不够、根据垃圾对象的特点进行参数调优、使用更适合的垃圾收集器;

    分析 jstack 出来的各个线程状态。如果问题实在比较隐蔽,考虑是否可以开启 jmx,使用 visualmv 等可视化工具远程监控与分析。

    总结#

    这个问题涉及到的知识面比较多,站在面试者的角度来说。

    如果没有实际解决过类似问题,可以说一下自己的思路

    只要大体思路和方向是对的,那在遇到类似问题的时候,可以利用网络上的资料

    去逐步尝试解决。

    大家记得点赞收藏加关注。

    版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Mic带你学架构
    如果本篇文章对您有帮助,还请帮忙点个关注和赞,您的坚持是我不断创作的动力。欢迎关注「跟着Mic学架构」公众号公众号获取更多技术干货!

  • 相关阅读:
    人工智能对我们的生活带来的影响
    pip下载paddle、sklearn、cv2问题
    大数据库练习题
    逍遥自在学C语言 | 赋值运算符
    关于JavaScript变量介绍
    《设计模式》组合模式
    Java学习之数据结构知识点
    基于LSTM-Adaboost的电力负荷预测(Matlab代码实现)
    基于频谱的GCN的数学原理
    使用pg_hint_plan定义Postgresql执行计划
  • 原文地址:https://www.cnblogs.com/mic112/p/16551708.html