当系统出现oom问题时,我们一般的定位思路是怎样的?

系统OOM常见的原因有:

1、用户态内存需求过多,资源不足;
2、大页配置不正确;
3、水位线值异常;
4、slab内存过多;
5、rcu异常;

OOM问题定位步骤如下:

1、查看/proc/meminfo,查看用户态内存和内核态内存分别占用多少内存;通过top命令查看占用内存较多的前10个进程;

1、用户态内存使用过多;
2、top 10的进程存在非虚拟机进程,通常情况下,使用内存最多的是虚拟机进程。如果是费虚拟机进程出现在了前top10里,那么有可能是这个进程有内存泄露的问题;
3、如果top10进程都是虚拟机进程,确认虚拟机的规格是不是超过上限了;

2、查看大页配置是否正确,确认是否大量大页没有使用。如果大页还有剩余,虚拟机都是使用的小页,那么有可能是大页配置的不正确;

3、查看linux系统水位线配置是否正常,水位线,一般配置在文件/proc/sys/vm/min_free_kbytes,水位线控制有3个值,min,low,high,当可用内存低于low时,系统开始回收内存。当可用内存大于high时,停止回收,当可用内存低于min值时,禁止给用户态进程分配内存;当水位线值被误修改为很大的值时,很容易造成用户态内存不足。

4、查看/proc/slabinfo,内核及模块通过kmalloc分配的内存是通过slab管理的,如果这部分内存一直不释放,会导致slab内存使用过多,出现OOM;查看slabinfo,更正常系统对比,检查异常的slab,根据slab名称查看对应的释放代码,排查问题;

5、RCU异常,RCU保护的指针指向的内存释放,需要调用call_rcu或者kfree_rcu来释放,当所有cpu都经过一个grace period后,内存在能真正释放。cpu上触发一次调度后,grace period结束。如果出现了RCU异常,某一个cpu上的grace period结束不了,通过RCU释放的内存就无法真正的释放。一般造成RCU异常的是某一个CPU上发生了死循环。

crash> struct rcu_state.rda rcu_sched_state
rda = 0x141e0
crash> struct rcu_date.qlen 0x141e0:all

如上命令可以打印出每个cpu上rcu中的qlen的大小, qlen为等待释放的object数量,一般情况下这个值在1000以下,如果其他cpu的qlen值都过大,只有一个cpu的qlen值小,那么有可能是这个qlen正常的cpu出现了死循环。

有一次出现OOM,我们就发现一个cpu中的rcu qlen值较小,其他cpu上的rcu qlen值很大,后来重点看这个cpu上的调用栈,分析代码,打印log,后来发现,在这个cpu上由于硬件问题出现了死循环,最后导致一直没有完成一个grace period,后面几个cpu的rcu就没有真正的完成释放,所以他们的qlen值很大,slabinfo查看object数量也很大。

定位一个oom问题的更多相关文章

  1. 浅谈程序员创业(要有一个自己的网站,最好的方式还是自己定位一个产品,用心把这个产品做好。或者满足不同需求的用户,要有特色)good

    浅谈程序员创业 ——作者:邓学彬.Jiesoft 1.什么是创业? 关于“创业”二字有必要重新学习一下,找了两个相对权威定义: 创业就是创业者对自己拥有的资源或通过努力能够拥有的资源进行优化整合,从而 ...

  2. MOVE - 重定位一个游标

    SYNOPSIS MOVE [ direction { FROM | IN } ] cursorname DESCRIPTION 描述 MOVE 在不检索数据的情况下重新定位一个游标. MOVE AL ...

  3. 定位一个网络问题引起的ceph异常

    前言 有一个ceph环境出现了异常,状态就是恢复异常的慢,但是所有数据又都在走,只是非常的慢,本篇将记录探测出问题的过程,以便以后处理类似的问题有个思路 处理过程 问题的现象是恢复的很慢,但是除此以外 ...

  4. lseek() 定位一个已经打开的文件

    Lseek lseek()的作用是,设置文件内容的读写位置. 每个打开的文件都有一个"当前文件偏移量",是一个非负整数,用以度量从文件开始处计算的字节数.通常,读写操作都是从当前文 ...

  5. IDEA快速定位一个文件到项目目录

    第一步:快捷键搜索java文件关键字 快捷键Ctrl+N,如果设置为Eclipse版本快捷键为Ctrl+Shift+R 第二步:定位文件到项目目录中 1.在当前文件下 2.点击定位按钮 3.定位到项目 ...

  6. SQL2008:WITH MOVE 子句可用于重新定位一个或多个文件

    sql2008数据库 还原备份文件还原产生这个错误的原因是:还原目录下存在多个同名文件, 如图所示,只需要将第2个以及以后的mdf文件改成其它名字就行了,比如s.mdf,s1.mdf等等.

  7. SQLSERVER数据库还原的时候,报 WITH MOVE 子句可用于重新定位一个或多个文件 的错误,求解决

    http://www.flybi.net/question/4070 梁勇 - 天善智能微软BI首席讲师 数据库备份文件还原产生这个错误的原因是:还原目录下存在多个同名文件, 如图所示,只需要将第2个 ...

  8. css 定位属性position的使用方法实例-----一个层叠窗口

    运行结果: <!DOCTYPE html> <html> <head> <title>重叠样式窗口</title> <style ty ...

  9. java OOM还在看log日志,兄弟你错的的很严重,正确方式是分析dump文件

    目录 OOM异常--intsmaze 正确姿势dump文件分析--intsmaze 正确的姿势--intsmaze dump丢失打印--intsmaze 哪些内存溢出会产生dump文件--intsma ...

随机推荐

  1. Windows系统禁止自动更新

    Windows + R键 输入services.msc(服务管理窗口) 找到Windows Update 停止且禁用 恢复->第一次失败 无操作 Windows + r 输入gpedit.msc ...

  2. 4.Flink实时项目之数据拆分

    1. 摘要 我们前面采集的日志数据已经保存到 Kafka 中,作为日志数据的 ODS 层,从 kafka 的ODS 层读取的日志数据分为 3 类, 页面日志.启动日志和曝光日志.这三类数据虽然都是用户 ...

  3. MySQL保留2位小数

    1.round(x,d),四舍五入.round(x) ,其实就是round(x,0),也就是默认d为0 select round(110.35,1); # 110.4 2.TRUNCATE(x,d), ...

  4. CoaXPress 接口相机的控制方法--1

    GenICam 介绍 简而言之,GenICam 定义了一个通用的相机接口,使得应用程序的编写.相机的控制可以与具体的型号解耦,这样就可以设计出通用的软件完成对不同相机的控制.我们实际使用的CoaXPr ...

  5. 基于 Kintex-7 XC7K325T的半高PCIe x4双路万兆光纤收发卡

    一.板卡概述 板卡采用Xilinx公司的XC7K325T-2FFG900I芯片作为主处理器,可应用于万兆网络.高速数据采集.存储:光纤隔离网闸等领域. 二.功能和技术指标: 板卡功能 参数内容 主处理 ...

  6. 01 MySQL数据库安装(Windows+Mac)

    目录 MySQL数据库安装 Windows 1.主要版本简介 2.软件下载 3.文件目录简介 4.使用 4.1配置环境变量 4.2登录 制作MySQL服务端开机自启动 运行MySQL 4.3 密码修改 ...

  7. wmware15安装centos7.9

    详细步骤如下: 下面位置应该写:D:\k8s\k8s-master01 也可以桥接 下面可以删除 从官方下载的,不需要test,所以选择第一个 默认英文的即可 改为上海 保持默认 配置静态ip 主机名 ...

  8. windev中自定义选定列的使用和注意事项

    windev系统默认的多选,需要使用Ctrl+或者Shift+来点选,使用并不方便,所以我们一般在首列增加checkbox列,并在行头增加一个checkbox控制,作为全选使用.使用这个方法时,有几个 ...

  9. Dell服务器配置RAID1+RAID0磁盘阵列

    有台DELL R730的服务器,需要部署下公司的程序,这里记录下raid配置. 环境要求 两块硬盘做raid 1 一块硬盘做raid 0 服务器开机,开始配置raid 服务器开机,在出现下图提示时,同 ...

  10. 【windows 操作系统】进程

    前言 Windows的内部实现也近似于"一切皆文件"的思想,当然,这一切都只在内核里才有,下载一个WinObj这软件就可以看到,Windows上各种设备.分区.虚拟对象都是挂载到根 ...