首页 > 系统相关 >Linux 服务器CPU超高如何快速定位

Linux 服务器CPU超高如何快速定位

时间:2023-06-25 15:24:56浏览次数:41  
标签:top 进程 线程 超高 Linux 堆栈 CPU 最耗

Linux 服务器CPU超高如何快速定位

原创 senfel 架构集结号 2023-02-24 11:07 发表于四川 收录于合集#故障排查5个

前言

在生产环境中有时会遇见服务器CPU超高的问题,特别是重大版本发布后如果有内存泄露很容出现CPU超高,严重可能会达到100%。现在我们使用的服务器都是多核CPU,当出现CPU告警我们需要及时发现问题代码并处置,不然严重情况下会导致服务器宕机。

如何快速定位

1、找到最耗CPU进程

2、找到最耗CPU线程

3、找到线程堆栈信息

4、找到问题代码并处置

定位工具top

top [-] [d] [p] [q] [c] [C] [S] [n]

参数:

d:指定每两次屏幕信息刷新之间的时间间隔,当然用户可以使用s交互命令来改变之

p:通过指定监控进程ID来仅仅监控某个进程的状态

q:该选项将使top没有任何延ch迟的进行刷新。如果调用程序有超级用户权限,那么top将以尽可能高的优先级运行

S:指定累计模式

s:使top命令在安全模式中运行。这将去除交互命令所带来的潜在危险

i:使top不显示任何闲置或者僵死进程

c:显示整个命令行而不只是显示命令名

H:显示线程

本次定位我们需要用到:

c:显示整个命令行而不只是显示命令名

H:显示线程

 

小试牛刀

我们以测试环境为例,找出最耗CPU线程堆栈并定位代码

1、找到最耗CPU的进程

  • 执行top -c ,显示进程运行信息列表,c参数作用是显示整个命令行

  • 键入P (大写p),进程按照CPU使用率排序

图示:

图片

如上图,最耗CPU的进程PID为1,查看命令行可以看到是loanOrder服务。

 

2、找到最耗CPU的线程

  • top -Hp 1 显示一个进程的线程运行信息列表,参数H就是显示线程,参数p则是仅仅监控pid

  • 键入P (大写p),线程按照CPU使用率排序

图示:

图片

如上图,进程1内,最耗CPU的线程PID为750。

 

3、找到线程堆栈信息

3.1 将线程PID转化为16进制,需要使用命令 printf "%x\n" 线程PID

[root@devops-01 /]# printf "%x\n" 750

2ee

如上750的16进制2ee,之所以要转化为16进制,是因为堆栈里线程id是用16进制表示的。

3.2 根据查到进程下线程750过滤得到堆栈信息,此时需要使用命令

jstack 进程PID | grep '线程PID' -C5 --color

jstack 1 | grep '2ee' -C5 --color

图示:

图片

如上图,找到了耗CPU高的线程对应的线程名称“http-nio-7014-exec-9"”,以及看到了该线程正在执行代码的堆栈。

4、根据堆栈信息找到问题代码并合理处置

目前是在锁等待的状态。在实际的内存泄露场景中,一般此时就会展示发生内存泄露的代码。

 

总结:用命令找到影响CPU的堆栈代码是最方便的,当然也可以采用arthas诊断工具,只是需要安装工具包然后也是看控制台找到线程ID,然后根据线程堆栈定位代码。

 

 

收录于合集 #故障排查  5个 下一篇线上监控诊断神器arthas 阅读 3585 文章已于2023-02-24修改   架构集结号 92篇原创内容  

标签:top,进程,线程,超高,Linux,堆栈,CPU,最耗
From: https://www.cnblogs.com/cherishthepresent/p/17502978.html

相关文章

  • 六、kubernetes网络-linux网络虚拟化(二)
    1.6初识Linux隧道:ipip前文介绍的tun设备也叫作点对点设备,之所以叫这个名字,是因为tun经常被用来做隧道通信(tunnel)。我们可以通过命令iptunnelhelp查看IP隧道的相关操作。Linux原生支持下列5种L3隧道:·ipip:即IPv4inIPv4,在IPv4报文的基础上封装一个IPv4报文;·GRE:即通用路由封装......
  • Linux 导入
    Linux导入大纲发展历史系统目录结构Shell之Bash常用命令分享发展历史Unix和LinuxUnix操作系统在20世纪60年代构思完成并实现,并在1970年首次发布。由我们的C语言之父,丹尼斯·里奇和肯·汤普逊自行开发。它因容易获取与可移植性高而广泛被学术机构和工商企业采用、......
  • 创建Linux快捷指令
    要创建Linux快捷指令,可以按照以下步骤进行操作:1.打开命令行终端,进入你想要存储快捷指令的目录。2.创建一个新文件,文件名为你想要的快捷指令名称,例如myshortcut。使用文本编辑器打开这个新文件并添加你要执行的命令。例如,如果你想要创建一个叫做myshortcut的指令,当你运行它时会......
  • Linux usb 4. Device 详解【转】
    转自:https://blog.csdn.net/pwl999/article/details/120997525文章目录1.简介2.PlatformLayer2.1PlatformDevice2.2PlatformDriver3.UDC/GadgetLayer3.1GadgetBus3.2GadgetDevice3.2.1EndpointAlloc3.2.2EndPointAccess3.2.3UDCControl3.3GadgetDriver(Con......
  • Linux mem 2.8 Kfence 详解【转】
    转自:https://pwl999.blog.csdn.net/article/details/1244949581.原理介绍Kfence(KernelElectricFence)是Linux内核引入的一种低开销的内存错误检测机制,因为是低开销的所以它可以在运行的生产环境中开启,同样由于是低开销所以它的功能相比较KASAN会偏弱。Kfence的基本原......
  • 通过句柄恢复Linux下误删除的数据库数据文件
    环境介绍:OS:RedhatEnterPrise5.4DB:OracleEnterPriseDatabase11gR2(11.2.3.0)   在数据库正常运行时,运维人员在无意中将部分数据文件删除了,此时数据库管理员并不知道,且数据库运行正常,并没有立即抛出错误和告警;但是开发人员在对某张表进行更新的时候,正好这张表在被删除的......
  • Linux 无法从本地字符界面(tty1-tty6)登陆深度解析
    Linux无法从本地字符界面(tty1-tty6)登陆深度解析作者:吴伟龙(PrudentWoo) 问题描述:    每次装完Oracle数据库之后,本地的tty1-tty6就无法登陆,只能通过vtty或tty7图形终端登陆。 问题现象:     输入完用户名密码之后,自动弹回如下界面:日志信息:[root@nec3~]#tail......
  • Linux使用HTTP代码示例
    以下是使用Linux命令行发送HTTP请求的示例:1.使用curl命令发送GET请求:```curl ExampleDomain```2.使用curl命令发送POST请求:```curl-XPOST-d"param1=value1&param2=value2" ExampleDomain```3.使用wget命令发送GET请求:```wget ExampleDomain```4.使用wget命令发送POST......
  • Linux Windows 双系统的一些问题
    时钟不一致问题https://sspai.com/post/55983定位到计算机\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\TimeZoneInformation目录下,新建一个DWORD类型,名称为RealTimeIsUniversal的键,并修改键值为1即可。windows连不上网在设置-WLAN-管理已知网络,将wifi忘记,......
  • Linux下执行文件删除的操作{确认!确认! 确认!}
    ubuntu删除文件夹命令rm-r文件名字--->强制删除XXX文件 rm-f文件名字--->强制删除XXX文件(centos) 注: linux中,强制删除文件的命令是rm-f,但是在今天的服务器共享文件夹中,输入总是报错,网上一查,原来ubuntu中删除命令是rm-==特别注意,在Linux......