如何排查TOP命令发现内存占用高,但是无进程占用内存问题解决思路

您所在的位置:网站首页 占内存大的软件有哪些 如何排查TOP命令发现内存占用高,但是无进程占用内存问题解决思路

如何排查TOP命令发现内存占用高,但是无进程占用内存问题解决思路

2024-07-09 10:41| 来源: 网络整理| 查看: 265

一、问题现象

        示例现象:监控人员发现A服务器内存升高至90+%,迅速通知到运维人员。同时研发人员反馈服务器没有启动任何进程,机器就自己夯机了。

       cpu相关监控图

        内存相关监控图 

        根据已知信息判断问题出在内存相关。

二、排查思路及步骤

1. 确定问题范围

        •定位问题层次:暂时未确定硬件故障还是软件问题

        •分析依赖关系:检查服务器所属业务上下游依赖是否正常,确定可处理问题时间约3小时。

2. 由表及里逐层深入

        由于当前服务器已经宕机无法操作,优先在机房物理环境将机器重启。重启后发现刷大批量OOM(Out Of Memory 的缩写,表示内存耗尽。当JVM因为没有足够的内存来为对象分配空间,并且垃圾回收器也已经没有空间可回收时,就会抛出这个错误。)报错,确定内存溢出导致机器。

ps:这里还没意识到这次问题不是普通的OOM故障导致;

报错类似:

479.72222?1INFO: task abs_deployer:3025 blocked for more than 120 seconds. 479.722307]“echo 0> /proc/sys/kernel/hung_task_timeout_secs" disables this message. 599.440835JINFO: task abs_deployer :3025 blocked for more than 120 seconds. 599.440911]“echo 8> /proc/sys/kernel/hung_task_timeout_secs" disables this message. 719.1592031INFO: task abs_deployer :3025 blocked for more than 120 seconds. 719.1593591“echo 0> /proc/sys/kernel/hung_task_timeout_secs"disables this message.

        硬件问题检查:

(1)查看服务器显示屏无异常报错、登录服务器带外地址,查看并没有相关硬件告警,因此判断无硬件故障,进一步排查系统故障;

        H3C服务器一般型号默认带外地址192.168.1.2

        默认账号:admin      默认密码:Password@_

        操作系统问题检查:

服务器已经完全无法登录了,通过CENTOS单用户模式也无法进入,于是采用外挂启动盘方式查看系统问题。

        进单用户方法可以参考网猴儿大佬的文档 https://blog.51cto.com/u_14126/9656649

(1)判断是否因为预启动任务将内存吃满,导致系统引导刚结束就OOM。

        已知系统启动流程是加电→加载bios→找到启动设备→读取MBR(主引导记录)→启动引导程序GRUB→加载内核并检测→启动第一个进程/sbin/init→调用rc配置文件→执行rc.loacl→进入系统。因此我们查看rc.loacl,查看是否配置了特殊程序启动项。

cat /etc/rc.d/rc.local 

        额外查看是否有开机自启动任务

chkconfig --list systemctl list-unit-files --type=service | grep enabled

        此命令可显示已启用的服务,并列出其状态为 “enabled”

        上述检测文件为空,均无特殊程序启动。

(2)查看内存实际状态         以GB为单位显示内存使用情况。

free -g

        显示如下:

        这里可以看到内存基本全被使用,但是swap并没有任何使用。通过top看什么进程占用这么高的内存使用。

top #进入后按 M 查看内存

        可以看到没有进程占用到内存,但是看到kswapd0进程占用CPU非常高。

        kswapd0 是 Linux 系统虚拟内存管理中负责换页的进程。出现这种现象通常是由于系统内存不足,导致虚拟内存管理器(kswapd0)需进行频繁的页面交换(换页)。而这种换页操作会消耗很大的CPU资源。 

        可以通过调整vm.swappiness 内核参数来控制交换空间的大小。

        设置vm.swappiness=0 到100的区间,数值越小,则内核越少用到swap分区,但并不禁用swap分区,数值越大则约多用到swap分区。但此参数不可设置太多或太少,以免发送系统错误、运行慢等问题。

cat /proc/sys/vm/swappiness

        查看swappines参数发现当前服务器参数设置60属于正常

        从上述分析,判断有其他地方占将物理内存全部占用,而导致出现负载过高的现象

(3)进一步查看内存占用状态

cat /proc/meminfo #此文件存放当前内存的详细信息

 

        注意:这里发现问题了。可以看到hugepages_total预分配巨页数量非常高,63448 (分配页面数目)* 2048 k(页面大小)= 129,941,504k ≈ 124G 可以看到物理内存都被预分配给内存巨页了。

        查看是否启用huge_page

cat /proc/sys/vm/nr_hugepages #结果是0的话表示未启用 grep -i HugePages_Total /proc/meminfo #结果为0的话表示没有使用

        结果如下:

        本次示例中,nr_hugepages已经是0,但是 HugePages_Total 已经被分配,因此查看sysctl.conf配置文件

cat /etc/sysctl.conf

发现配置了vm.nr_hugepages条目,将此条目#注释,然后重启服务器,可以正常进入系统。

禁用HugePages的方法:

        1.将 nr_hugepages 文件配置改回 0。         2.注释或删除 sysctl.conf 中的vm.nr_hugepages条目。         3.重启服务器生效。

三、结论

        HugePages可以按实际需求使用,但是切记不可将物理内存全部分配导致服务器出现夯机。

四、相关知识记录

 Linux 下的大页一般分为以下两种:         1、标准大页(Huge Pages)         Huge Pages 从Linux Kernel 2.6 后被引入。目的是使用更大的页面(memory page size) 以适应越来越大的系统内存,让操作系统可以支持 现代硬件架构的大而面容量功能。HugPages使用预分配的内存。一般单个大页的空间大于4k。         2、透明大页(Transparent Huge Pages).         Transparent Huge Pages 从RHEL 6 .SUSE Server 11,Oracle Linux(UEK2) 开始引入的一个功能,Transparent Huge Pages 是动态分配内存的。

        本文仅提供思路,具体问题还需结合现场实际情况分析。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3