1

【Java面试】生产环境服务器变慢,如何诊断处理? - 跟着Mic学架构

 2 years ago
source link: https://www.cnblogs.com/mic112/p/16551708.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

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

这是最近一些工作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学架构」公众号公众号获取更多技术干货!

1666682-20220804190835916-1625033237.png

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK