如何排查TOP命令发现内存占用高,但是无进程占用内存问题解决思路 |
您所在的位置:网站首页 › 占内存大的软件有哪些 › 如何排查TOP命令发现内存占用高,但是无进程占用内存问题解决思路 |
一、问题现象 示例现象:监控人员发现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 |