当前位置: 首页 > 新闻中心 > linux 系统运行缓慢,cpu 100%,以及full gc次数过多问题的排查思路

linux 系统运行缓慢,cpu 100%,以及full gc次数过多问题的排查思路

发布时间:2024-03-27 23:16:29

  1. Linux系统CPU/内存使用率过高的问题排查
  2. linux cpu使用率过高排查
  3. linux占用cpu过高排查linux占用cpu

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

    服务器出现由内存问题引发的故障,例如系统内部服务响应速度变慢、服务器登录不上、系统触发 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查看信息含义:

二、linux cpu使用率过高排查

方法一

第一步:使用

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,即可将云上资源的告警信息及时通知给对应的团队成员。

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

三、linux占用cpu过高排查linux占用cpu

linux进程占用cpu正在运行是什么状态?

系统软件正在后台运行

linux程序systemcpu占用较高说明什么问题?

这说明你的程序在执行过程中,有如下几种情况中的一种或者多种情况发生:

1.进入了一个死循环无法跳出来;

2.也许是一直在等待一个信号,如从dbus上读取一个你需要的信息;

3.有可能是你的程序在对一个非常大的内容进行分析和处理;

4.有可能是你的程序要处理的问题比较多,所以在一个个慢慢的执行。大部分是由上面四种情况引起的,在这四种情况中,第一种情况坚决要避免,因为不如此,那么你的cpu资源将会被吃光。

第二种情况,我的想法是,你要修改一下,看看有没有什么更快,更高效的方法来获取到需要的信号,或者是不去获取信号,而是改用其他方式来处理。

第三和第四两种情况,就要根据你的实际需要来定了。如果是必须这样做,那么也只能够耐心的等待了。但是可以考虑优化代码,优化算法的方式来提高效率。linux系统下有个很好的调试工具gdb。如果不知道自己的程序出现了什么问题,可以利用gdb工具逐步执行,去查找错误所在。

linux服务器cpu占用率很高而内存不高?

较常见的几类原因原因1:程序起用太多解决方法:关闭一些程序

原因2:病毒、恶意代码解决方法:下载最新的防病毒软件,杀毒

原因3:系统运行应用软件出错,造成停止响应(尤其在win98中)解决:强行关闭程序(ctrl+alt+del)

原因4:实时监控软件解决:关闭

原因5:降温软件解决:关闭

原因6:驱动不兼容如安装via4合1驱动的时候,再进系统,资源占用率,100%解决:上网当最新的

原因7:含ht技术的p4cpu由于自身设计的关系(为最大限度的利用cpu而优化),容易出现占用率为100%解决:关闭ht原因8:被别人入侵解决方法:用netstat-an查看是否有一些异常的活动端口,一般防火墙可以解决问题。

其它原因:拷cd、运行3dmark、打开精品网络电视、电脑开机进入系统后的10多秒钟、电脑做服务器等,容易出现占用率为100%。

linux查看tomcat里面哪个应用占用cpu?

linux下获取占用cpu资源最多的10个进程,可以使用如下命令组合:

psaux|head-1;psaux|grep-vpid|sort-rn-k+3|head

linux下获取占用内存资源最多的10个进程,可以使用如下命令组合:

psaux|head-1;psaux|grep-vpid|sort-rn-k+4|head

命令组合解析(针对cpu的,men也同样道理):

psaux|head-1;psaux|grep-vpid|sort-rn-k+3|head

该命令组合实际上是下面两句命令:

psaux|head-1

psaux|grep-vpid|sort-rn-k+3|head

查看占用cpu最高的进程

psaux|head-1;psaux|grep-vpid|sort-rn-k+3|head

或者top(然后按下m,注意这里是大写)

查看占用内存最高的进程

psaux|head-1;psaux|grep-vpid|sort-rn-k+4|head

或者top(然后按下p,注意这里是大写)

该命令组合实际上是下面两句命令:

psaux|head-1

psaux|grep-vpid|sort-rn-k+3|head

其中第一句主要是为了获取标题(userpid%cpu%memvszrssttystatstarttimecommand)。

接下来的grep-vpid是将psaux命令得到的标题去掉,即grep不包含pid这三个字母组合的行,再将其中结果使用sort排序。

sort-rn-k+3该命令中的-rn的r表示是结果倒序排列,n为以数值大小排序,而-k+3则是针对第3列的内容进行排序,再使用head命令获取默认前10行数据。(其中的|表示管道操作)

linux如何查看虚拟机cpu占用率?

top,free,cat/proc/meminfo,cat/proc/cpuinfo。

#dmidecode|grep-a16"memorydevice"|more。

查看内存使用情况:cat/proc/meminfo,查看cpu使用情况:cat/proc/cpuinfo。

在系统维护的过程中,随时可能有需要查看cpu使用率,并根据相应信息分析系统状况的需要。在centos中,可以通过top命令来查看cpu使用状况。

运行top命令后,cpu使用状态会以全屏的方式显示,并且会处在对话的模式--用基于top的命令,可以控制显示方式等等。退出top的命令为q(在top运行中敲q键一次)。

top命令是linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于windows的任务管理器。

可以直接使用top命令后,查看%mem的内容。可以选择按进程查看或者按用户查看,如想查看oracle用户的进程内存使用情况的话可以使用如下的命令:$top-uoracle。