热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

应用服务器CPU高性能定位和排查

本课程的主旨及目标•导致应用CPU高的常见原因•定位问题的大体思路•定位问题的具体方法•实际案例应用CPU高常见原因•1.程序计算比较密集•2.程序死循环、死锁•3.程序逻请求堵塞

本课程的主旨及目标

•导致应用CPU高的常见原因

•定位问题的大体思路

•定位问题的具体方法

•实际案例

应用CPU高常见原因

•1.程序计算比较密集

•2. 程序死循环、死锁

•3.程序逻请求堵塞

•4.IO读写太高 (df –h看看磁盘是不是满了)

•5.自创线程没有限制(线程池)

•6.不合理的创建对象,导致频繁GC

定位问题的具体方法

1.不管什么情况先用top命令查看资源消耗,找到消耗大量CPU资源的进程pid,我们一般都是java进程排名第一

 

2.输入top –p pid 来单独监控该进程

 

3.在第2步的监控界面输入H,获取当前进程下的所有线程信息

 

4.找到消耗cpu特别高的线程编号(可能会有多个),这里是6752

5.将第4步得到的线程编号6752转成16进制是1a60,因为jstack输出的线程栈信息中,线程ID是以十六进制展示的。

 

6.切换到jbossuser用户【pid对应的进程用户,这里一般是java进程用户】

 

7.因为没有jstack这个文件的环境变量,所以要先export PATH="$PATH:/opt/wildfly/openjdk/openjdk-1.8.0_92/bin"

8.使用命令 jstack $pid | grep “线程id” –A 30,把信息打印出来【这里的-A 30指的是30行】【线程id:根据第5步得到的1a68在pid线程信息里面去找对应线程内容】,也可以写到文件中,下载下来,通过16进制的线程id来搜索定位代码段。

 

9.通过jstack命令来查看下当前内存状态,解读线程信息,定位具体代码位置,接下来就是找开发人员确认问题,看这段代码是否可以优化。

实际案例

案例一:

定位到cpu过高是IO读写太高 ,接下来就是找开发人员确认这段代码是否可以优化

 

案例二:

两个线程执行过程中,需要对两个对象进行加锁,且加锁的顺序不一致,导致了死锁的产生,简单的修复方法是:对两个对象的加锁顺序一致。

注意:必须有两个可以被加锁的对象才能产生死锁,只有一个不会产生死锁问题

 

案例三:

 

案例四:

 

 

 

案例五:

1.生产环境heap堆内存不断上升导致oom,pst环境复现heap堆内存不断上升。经过分析堆内存创建的windq主题或队列WindqQueue、WindqTopic方式会缓存到连接工厂,缓存的对象并不是根据唯一的key去缓存,而是直接使用对象的引用作缓存,导致jvm无法回收这部分内存(比如新建同一个sendOperationTopic的主题Object1,Object2,Object1和Object2都会缓存到连接工厂)。

2.pst环境百万数据重试发现栈内存溢出,由于递归调用导致,已将递归方法修改为循环的方式去调用。

结果:修改后pst环境内存回收稳定,无连接工厂大对象,堆内存,无栈内存溢出,cpu使用情况稳定。

发现程序异常前通过执行指令,直接生成当前JVM的dump文件,15434是指JVM的进程号

jmap -dump:format=b,file=serviceDump.dat 15434

 

 

 

 



推荐阅读
  • CentOS 7 磁盘与文件系统管理指南
    本文详细介绍了磁盘的基本结构、接口类型、分区管理以及文件系统格式化等内容,并提供了实际操作步骤,帮助读者更好地理解和掌握 CentOS 7 中的磁盘与文件系统管理。 ... [详细]
  • 探讨如何通过编程技术实现100个并发连接,解决线程创建顺序问题,并提供高效的并发测试方案。 ... [详细]
  • 近期遇到电脑网络不稳定和游戏时频繁重启的问题,寻求专业建议。网络环境为ADSL调制解调器通过路由器共享给两台电脑使用,怀疑存在ARP攻击或硬件配置问题。希望获得详细的故障排查和解决方案。 ... [详细]
  • 台式电脑的电力消耗:待机一天耗电多少?
    探讨台式电脑的电力消耗问题,特别是待机状态下的能耗。本文将详细介绍影响电脑功耗的因素,并提供计算和优化电源配置的方法。 ... [详细]
  • 深入探讨CPU虚拟化与KVM内存管理
    本文详细介绍了现代服务器架构中的CPU虚拟化技术,包括SMP、NUMA和MPP三种多处理器结构,并深入探讨了KVM的内存虚拟化机制。通过对比不同架构的特点和应用场景,帮助读者理解如何选择最适合的架构以优化性能。 ... [详细]
  • 本文探讨了 Spring Boot 应用程序在不同配置下支持的最大并发连接数,重点分析了内置服务器(如 Tomcat、Jetty 和 Undertow)的默认设置及其对性能的影响。 ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • 本文详细介绍了如何使用Python编写爬虫程序,从豆瓣电影Top250页面抓取电影信息。文章涵盖了从基础的网页请求到处理反爬虫机制,再到多页数据抓取的全过程,并提供了完整的代码示例。 ... [详细]
  • 理解存储器的层次结构有助于程序员优化程序性能,通过合理安排数据在不同层级的存储位置,提升CPU的数据访问速度。本文详细探讨了静态随机访问存储器(SRAM)和动态随机访问存储器(DRAM)的工作原理及其应用场景,并介绍了存储器模块中的数据存取过程及局部性原理。 ... [详细]
  • 本文详细介绍了如何在Ubuntu系统中下载适用于Intel处理器的64位版本,涵盖了不同Linux发行版对64位架构的不同命名方式,并提供了具体的下载链接和步骤。 ... [详细]
  • Linux设备驱动程序:异步时间操作与调度机制
    本文介绍了Linux内核中的几种异步延迟操作方法,包括内核定时器、tasklet机制和工作队列。这些机制允许在未来的某个时间点执行任务,而无需阻塞当前线程,从而提高系统的响应性和效率。 ... [详细]
  • MySQL索引详解与优化
    本文深入探讨了MySQL中的索引机制,包括索引的基本概念、优势与劣势、分类及其实现原理,并详细介绍了索引的使用场景和优化技巧。通过具体示例,帮助读者更好地理解和应用索引以提升数据库性能。 ... [详细]
  • 基于KVM的SRIOV直通配置及性能测试
    SRIOV介绍、VF直通配置,以及包转发率性能测试小慢哥的原创文章,欢迎转载目录?1.SRIOV介绍?2.环境说明?3.开启SRIOV?4.生成VF?5.VF ... [详细]
  • 本文将详细介绍如何在Linux操作系统中执行PHP脚本,包括环境配置、命令使用及验证方法。对于需要在Linux环境下开发或部署PHP应用的用户来说,这是一篇非常实用的文章。 ... [详细]
  • 本文探讨了现代信号处理系统的核心组件,包括数据转换、数据交互和数据处理。详细介绍了AD/DA转换、串/并转换、编解码转换等技术,并讨论了FPGA在信号处理中的应用及其实现方法。 ... [详细]
author-avatar
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有