当系统出现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. 大话devops

    一.敏捷的局限性的促使devops诞生 敏捷的局限性:敏捷只注重开发阶段的敏捷,未涉及到整个产品生命周期流程其他环节导致采用敏捷开发流程后效果不明显. devops成为企业数字化转型的助推器,扮演基础 ...

  2. 长安战疫Wp

    长安战疫wp misc 八卦迷宫 直接走迷宫 cazy{zhanchangyangchangzhanyanghechangshanshananzhanyiyizhanyianyichanganyang ...

  3. 文件属性信息详述 上( 硬软连接+文件类型+用户&用户组)

    目录 文件属性信息详述 上 一.文件类型概念说明 1.文件详细信息详解 2.inode编号 二.文件软硬链接说明 1.硬链接和软连接 4.删除文件的底层逻辑 5.文件类型 三.文件用户和用户组 1.概 ...

  4. Note -「最大团-最小度不等式」

      这是什么奇怪的名字qwq. 一些定义   只为便于理解,没有苛求专业的定义. 简单无向图:不存在重边.自环的无向图. \(\delta(G)\):无向图 \(G\) 中结点的最小度数.即 \(\m ...

  5. mysql中generated always as的使用

    -- generated always as的使用 CREATE TABLE t1( c1 INT, c2 DOUBLE(20,19) , c3 INT GENERATED ALWAYS AS(c1* ...

  6. linux 运维工程师如何降低工作难度

    文章目录 1.Linux "优化" 2.git "优化" 3.mysql "优化" 4.kubernetes "优化" ...

  7. JVM基础学习(二):内存分配策略与垃圾收集技术

    Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的高墙,墙外面的人想进去,墙里面的人却想出来 垃圾收集概述 Java内存模型中的堆和方法区是垃圾收集技术所需要关注的终点,因为其他的区域会跟 ...

  8. Devops 开发运维高级篇之微服务代码上传和代码检查

    Devops 开发运维高级篇之微服务代码上传和代码检查 微服务持续集成(1)-项目代码上传到Gitlab 微服务持续集成(2)-从Gitlab拉取项目源码 微服务持续集成(3)-提交到SonarQub ...

  9. 同事会建模,会数据分析,会可视化图表,而你只会用EXCEL?

    ​小李是一家外企的数据分析师,平时处理的都是亿万行级别数据量的报表,为了可以胜任这份工作,小李早早地就学会了各种大数据工具,而且做出来的数据模型高度自动化,效率极高,为公司创造了非常大的价值.因为小李 ...

  10. Oracle数据库的下载、安装与卸载

    Oracle数据库下载: 这里以Oracle 11g为例,推荐去Oracle官网下载 Oracle官网下载地址:https://www.oracle.com/database/technologies ...