【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学架构」公众号公众号获取更多技术干货!

【Java面试】生产环境服务器变慢,如何诊断处理?的更多相关文章
- java面试-生产环境服务器变慢,谈谈你的诊断思路
1.uptime:查询linux系统负载 11:16:16 系统当前时间 up 64 days, 19:23 从上次启动开始系统运行的时间3 users 连接数量,同一用户多个连接的时候算多个load ...
- Linux性能分析:生产环境服务器变慢,诊断思路和性能评估
Linux性能分析:生产环境服务器变慢,诊断思路和性能评估 一.整机:top 二.CPU:vmstat 所有CPU核信息 每个进程使用CPU的用量分解信息 三.内存:free 四.硬盘:df 五.磁盘 ...
- java面试-生产环境出现CPU占用过高,谈谈你的分析思路和定位
思路:结合Linux和JDK命令一起分析 1.用top命令找出CPU占比最高的进程 2.ps -ef|grep java|grep -v grep 或者jps -l进一步定位,得知是怎样一个后台程序惹 ...
- IBM Thread and Monitor Dump Analyzer for Java解决生产环境中的性能问题
这个工具的使用和 HeapAnalyzer 一样,非常容易,同样提供了详细的 readme 文档,这里也简单举例如下: #/usr/java50/bin/java -Xmx1000m -jar jca ...
- 利用ansible-playbook从测试环境获取tomcat中java项目新版本发布到生产环境
一.环境描述 安装有ansible的服务器:192.168.13.45 测试环境服务器:192.168.13.49 /home/app/api-tomcat/webapps/api.war为测试环境新 ...
- .NET C#微信公众号开发远程断点调试(本地远程调试生产环境代码)
最近在做微信公众号开发,由于之前没有接触过,突然发现调试不方便,不方便进行断点跟踪调试.因为微信那边绑定的服务器地址必须是公网地址,但是还是想进行断点调试(毕竟这样太方便了,程序有Bug,一步步断点跟 ...
- [转]跳板机Jumpserve的生产环境配置
6.跳板机Jumpserver] Jumpserver是国内一款开源的轻便的跳板机系统,他们的官网:http://www.jumpserver.org/ 使用这款软件意在提高公司内部登录生产环境服 ...
- Rails的静态资源管理(四)—— 生产环境的 Asset Pipeline
官方文档:http://guides.ruby-china.org/asset_pipeline.html http://guides.rubyonrails.org/asset_pipeline.h ...
- [转]Jumpserve跳板机的生产环境应用
Jumpserver是国内一款开源的轻便的跳板机系统,他们的官网:http://www.jumpserver.org/ 使用这款软件意在提高公司内部登录生产环境服务器的便捷性,权限分配细化,以及后台管 ...
随机推荐
- 其实 Gradle Transform 就是个纸老虎 —— Gradle 系列(4)
前言 目前,使用 AGP Transform API 进行字节码插桩已经非常普遍了,例如 Booster.神策等框架中都有 Transform 的影子.Transform 听起来很高大上,其本质就是一 ...
- c# 读取所有磁盘的剩余空间
介绍: 有一个控制台命令是创建指定大小的空文件,因此我想制作一个一键填充剩余磁盘空间的坑人小程序. 想要填充剩余容量,就要先获取所有本地磁盘的剩余空间,这个程序就是用来做这个的. 项目类型为c#控制台 ...
- 解决windows server 2008r2服务器自动关机
问题 具体表现就是系统自动关机,网上说是开机后2小时就会自动关机 系统版本: 解决 PsTools下载 解压:PSTools.zipg,如解压到C:\PSTools目录下 执行如下命令,打开注册表 W ...
- 一文带你搞懂 Kafka 的系统架构(深度好文,值得收藏)
Kafka 简介 Kafka 是一种高吞吐.分布式.基于发布和订阅模型的消息系统,最初是由 LinkedIn 公司采用 Scala 和 java 开发的开源流处理软件平台,目前是 Apache 的开源 ...
- python初识数据类型(字典、集合、元组、布尔)与运算符
目录 python数据类型(dict.tuple.set.bool) 字典 集合 元组 布尔值 用户交互与输出 获取用户输入 输出信息 格式化输出 基本运算符 算术运算符 比较运算符 逻辑运算符 赋值 ...
- Dockerfile 使用 SSH
如果在书写 Dockerfile 时,有些命令需要使用到 SSH 连接,比如从私有仓库下载文件等,那么我们应该怎么做呢? Dockerfile 使用 SSH Dockerfile 文件配置 为了使得 ...
- 拥有webkit内核浏览器的平台
1-拥有webkit内核的浏览器: IOS safari Android 的浏览器 Google chrome 猎豹浏览器 百度浏览器 Opera 以上可知手机的浏览器均为webkit内核 2-拥有其 ...
- 一文带你看懂Java中的Lock锁底层AQS到底是如何实现的
前言 相信大家对Java中的Lock锁应该不会陌生,比如ReentrantLock,锁主要是用来解决解决多线程运行访问共享资源时的线程安全问题.那你是不是很好奇,这些Lock锁api是如何实现的呢?本 ...
- IDEA初始化基础配置
0.前言 这篇博客是给认识的那帮新手搞的,刚进入IT行业的崽们 这个东西配置好了,也可以选择弄成在线文档,下一次安装IDEA时,有一个import导入配置,然后就可以自己配置好了( 虽然方便,但不建议 ...
- React简单教程-2-ts和组件参数
前言 在上一章:React 简单教程-1-组件 我们知道了 React 的组件是什么,长什么样,用 js 和 HTML 小小体验了一下组件.在这一章,我们将使用 typescript(简称 ts) 来 ...