Linux系统CPU内存使用率过高的问题排查

Linux系统CPU内存使用率过高的问题排查,第1张

    服务器出现由内存问题引发的故障,例如系统内部服务响应速度变慢、服务器登录不上、系统触发 OOM(Out Of Memory)等。通常情况下当实例内存使用率持续高于90%时,可判断为实例内存使用率过高。CPU/内存使用率过高的问题原因可能由硬件因素、系统进程、业务进程或者木马病毒等因素导致。     笔者以前写过一篇文章- Linux 下的 60 秒分析的检查清单 ,适用于 任何性能问题 的分析工作,这一篇文章是关于CPU/内存使用率的具体的排查思路总结。     执行 top 命令后按  M ,根据驻留内存大小进行排序,查看 “RES” 及 “SHR” 列是否有进程占用内存过高。按 P,以 CPU 占用率大小的顺序排列进程列表,查看是否有进程占用cpu过高。     如果有异常进程占用了大量 CPU 或内存资源,记录需要终止的进程 PID,输入k,再输入需要终止进程的 PID ,按 Enter。     另外说明一下,top 运行中可以通过 top 的内部命令对进程的显示方式进行控制,最常用的是M和P。     CPU 空闲但高负载情况,Load average 是 CPU 负载的评估,其值越高,说明其任务队列越长,处于等待执行的任务越多。执行ps -axjf命令,查看进程状态,并检查是否存在 D 状态进程。D 状态指不可中断的睡眠状态,该状态进程无法被杀死,也无法自行退出。若出现较多 D 状态进程,可通过恢复该进程依赖资源或重启系统进行解决。     Linux 系统通过分页机制管理内存的同时,将磁盘的一部分划出来作为虚拟内存。而 kswapd0 是 Linux 系统虚拟内存管理中负责换页的进程。当系统内存不足时,kswapd0 会频繁的进行换页 *** 作。换页 *** 作非常消耗 CPU 资源,导致该进程持续占用高 CPU 资源。     执行top命令,找到 kswapd0 进程。观察 kswapd0 进程状态,若持续处于非睡眠状态,且运行时间较长并持续占用较高 CPU 资源,执行 vmstat ,free,ps 等指令,查询系统内进程的内存占用情况,重启系统或终止不需要且安全的进程。如果 si,so 的值也比较高,则表示系统存在频繁的换页 *** 作,当前系统的物理内存已经不能满足您的需要。  si  表示每秒从交换区写入内存的大小(单位:kb/s) , so  每秒从内存写到交换区的大小。     执行cat/proc/meminfo |grep-i shmem命令查看共享内存。         buddy可以以页为单位获取连续的物理内存了,即4K为单位。slab负责需要频繁的获取/释放并不大的连续物理内存,比如几十字节。执行cat /proc/meminfo | grep -i SUnreclaim命令查看slab 内存。         标准的 4KB 大小的页面外,内存大页管理内存中的巨大的页面,处理较少的页面映射表,从而减少访问/维护它们的开销。执行cat /proc/meminfo | grep -iE "HugePages_Total|Hugepagesize" 查看内存大页。 内存使用率计算:  (Total - available)100% / Total (Total - Free - Buffers - Cached - SReclaimable + Shmem)* 100% / Total   cat /proc/meminfo查看信息含义:

方法一

第一步:使用

top命令,然后按shift+p按照CPU排序

找到占用CPU过高的进程的pid

第二步:使用

top -H -p [进程id]

找到进程中消耗资源最高的线程的id

第三步:使用

echo 'obase=16[线程id]' | bc或者printf "%x\n" [线程id] 

将线程id转换为16进制(字母要小写)

bc是linux的计算器命令

第四步:执行

jstack [进程id] |grep -A 10 [线程id的16进制]”

查看线程状态信息

方法二

第一步:使用

top命令,然后按shift+p按照CPU排序

找到占用CPU过高的进程

第二步:使用

ps -mp pid -o THREAD,tid,time | sort -rn

获取线程信息,并找到占用CPU高的线程

第三步:使用

echo 'obase=16[线程id]' | bc或者printf "%x\n" [线程id]

将需要的线程ID转换为16进制格式

第四步:使用

jstack pid |grep tid -A 30 [线程id的16进制]

打印线程的堆栈信息

案例分析

场景描述

生产环境下JAVA进程高CPU占用故障排查

解决过程

1、根据top命令,发现PID为2633的Java进程占用CPU高达300%,出现故障。

2、找到该进程后,如何定位具体线程或代码呢,首先显示线程列表,并按照CPU占用高的线程排序:

1

[root@localhost ~]# ps -mp 2633 -o THREAD,tid,time | sort -rn

显示结果如下:

找到了耗时最高的线程(TID)3626,占用CPU时间有12分钟了!

3、将需要的线程TID转换为16进制格式

12

[root@localhost ~]# printf "%x\n" 3626e18

4、最后使用jstack命令打印出该进程下面的此线程的堆栈信息:

1

[root@localhost ~]# jstack 2633 |grep "e18" -A 30

相比故障的解决而言,发现故障也同等的重要!市场上的大多数监控软件都能实现服务器负载的实时观测,比如:Zabbix、Nagios、阿里云监控(针对云服务器)等。但是当中大部分的软件都需要运维同学主动去设置规则或者检测才能发现问题,如何被动的也能收到告警呢?

推荐大家一个实用的运维软件——王教授,对于业务部署在阿里云上的用户,只需绑定需要监控的只读AcessKey,即可将云上资源的告警信息及时通知给对应的团队成员。

化主动为被动的方式,一方面减轻了运维工程师的工作,另一方面也减小了运维漏看或者忽略告警的情况发生。

可按以下四个方法解决CPU占用率过高的问题:

在运行大型程序之前,查看电脑配置是否满足运行该程序的最低配置,如果确实是电脑配置不行的话,那么就建议将电脑硬件进行升级了

下载杀毒软件或者木马专杀对电脑进行保护,可以使用占用资源小的一些安全工具,例如巨盾,巨盾采用脚本引擎可以极大的释放系统资源,不会使得电脑CPU使用率过高

在使用浏览器时尽量选择一些用户群体比较多的浏览器,一些非主流的浏览器就不必使用了,因为小众的浏览器在兼容性, *** 作性等方面还是有些缺陷的,系统优化也不完善,所以建议使用主流的浏览器,避免出现CPU使用率高怎么办的问题

定期更新电脑各种驱动,可以使用驱动精灵等工具自动更新电脑上的驱动,保持电脑驱动处于最新状态,减少CPU出现100%的概率。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/9012486.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-23
下一篇 2023-04-23

发表评论

登录后才能评论

评论列表(0条)

保存