当系统出现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. async同步异步

    1.同步:var async = require("async"); async.series([step1, step2, step3],function(err, values ...

  2. Solution -「UOJ #87」mx 的仙人掌

    \(\mathcal{Description}\)   Link.   给出含 \(n\) 个结点 \(m\) 条边的仙人掌图.\(q\) 次询问,每次询问给出一个点集 \(S\),求 \(S\) 内 ...

  3. Linux常用命令在Ubuntu 16下(个人笔记)

    可以通过 tab键来补全提示命令或者目录,终端命令的格式: 命令 [-选项,多个选项可以结合写] [参数] , 大多数情况可以通过 ctrl c 退出命令 磁盘管理 pwd 查看当前所在目录 即:pr ...

  4. 微信小程序常见两种登陆注册方式(一)

    普通登录注册以及用户授权登陆 普通登陆注册 概述 此功能的实现简单的借助了微信小程序的云开发,具体在哪里使用,我会标出来.对于用户名.账号.密码都做了简单的校验.主要练手功能的实现,样式只做了简单的编 ...

  5. linux历史命令审计

    一.添加历史命令记录 1.首先在/etc/profile中添加 export HISTORY_FILE=/var/log/Command/Command.log export PROMPT_COMMA ...

  6. Banmabanma的writeup

    大家好,好久不见,前段时间忙于应付网课和作业,还有这恐怖的疫情,差点就嗝屁了......     好了,接下来我们步入正题,这次我为大家带来攻防世界misc部分Banmabanma的writeup. ...

  7. 在 TIME_WAIT 状态的 TCP 连接,收到 SYN 后会发生什么?

    周末跟朋友讨论了一些 TCP 的问题,在查阅<Linux 服务器高性能编程>这本书的时候,发现书上写了这么一句话: 书上说,处于 TIME_WAIT 状态的连接,在收到相同四元组的 SYN ...

  8. 企业为什么需要BI报表工具?

    企业一旦成规模运作起来,数据量是数以万计的,无论数据还是报表都需要协同管理不断更新.面对各大OA\ERP\CRM系统的数据,传统用Excel处理数据效率是很低下的.要想快速出报表,快速取数,快速做业务 ...

  9. 【C#表达式树 七】 反射在表达式树中的应用 ListInitExpression

    以下都是反射在表达式树中的应用 对象初始化 Expression.MemberInit 反射获取成员(字段 或者属性),绑定数据,然后生成 成员表达式节点 class Animal { public ...

  10. 【C#表达式树 一】Expressions 命名空间 38个类 2个接口 3个枚举

    注解 抽象类 Expression 提供用于为表达式树建模的类层次结构的根. 此命名空间中派生自的类 Expression (例如 MemberExpression 和 ParameterExpres ...