生产环境服务器变慢该怎么诊断怎么排查?

         生产环境服务器变慢主要涉及3个维度的问题:CPU利用率、磁盘I/O效率、内存瓶颈。

1、CPU利用率:

        CPU利用率过高或者过低都会影响程序处理效率。CPU利用率过高说明当前服务器要处理的指令过多,当CPU忙不过来的时候,指令的运行效率自然就会下降,用户能感受到的就是程序响应变慢。

        针对这个问题在上一篇文章中有提到:生产环境CPU过高怎么办就是使用top命令找到CPU占用过高的Java进程,再根据进程ID通过ps -mp找到进程中CPU过高的线程ID,通过printf命令转成十六进制后,通过jstack命令打印当前虚拟机的线程快照,根据快照日志排查问题代码。

        如果是CPU利用率太低的话就是说程序对资源使用不够,没有重复利用CPU的性能,可以提高线程数量来提升程序性能。

2、磁盘I/O效率:

        在程序运行过程中会直接或者间接涉及一些与磁盘I/O相关的操作,比如程序直接读/写磁盘或者程序依赖的第三方组件对磁盘进行持久化存储,此时磁盘I/O效率就会对程序运行效率产生影响。

        针对这种情况可以使用iostat命令查看,如果磁盘负载较高,可以针对性地进行优化。比如,借助缓存系统,减少磁盘I/O次数;用顺序写替代随机写入,减少寻址开销;使用mmap替代read/write,减少内存拷贝次数。另外,磁盘I/O效率可以通过CPU与负载的非线性关系体现出来。当负载增大时,系统吞吐量不能有效增大,CPU不能线性增长,则很可能是磁盘I/O出现阻塞。

3、内存瓶颈:

        内存作为一块临时存储数据的组件,所有CPU运行的指令都需要从内存中去读/写。内存的合理使用可以减少应用和磁盘的I/O频率,减少网络I/O的频率,极大地提升I/O性能。

        JVM对内存的合理分配,能够避免频繁的YGC和FULL GC。当内存使用率较高时,可以用dump命令查出JVM堆内存,用MAT工具进行分析,查出大对象或者占用内存最多的对象,以及排查是否存在内存泄漏的问题。如果用 dump 命令查出的堆内存文件正常,则可以考虑是堆外内存被大量使用导致出现问题,此时需要借助操作系统的pmap命令查出进程的内存分配情况。如果CPU和内存使用率都很正常,那么就需要进一步开启GC日志,分析用户线程暂停的时间、各部分内存区域GC次数和时间等指标,这里可以借助jstat命令或可视化工具GCEasy等。如果问题出在GC上,则考虑是不是内存不足,然后根据垃圾对象的特点进行参数调优,使用更适合的垃圾收集器,用jstack命令分析各个线程的状态。如果问题比较隐蔽,则考虑是否开启JMX,使用 visualmv 等可视化工具进行远程监控与分析。

猜你喜欢

转载自blog.csdn.net/weixin_42717648/article/details/131630853