Linux内存问题排查

通常,我们会遇到很多关于Linux内存异常的问题:

1、 为什么我们的内存使用偏高?

2、 谁用了我的内存?

3、 内存使用如何调优?

这里总结下排查思路:

  1. 通过free -m命令查看当前系统内存总体使用情况,引用大牛们的图一幅:

a)Used = 进程使用内存+Slab使用+pagetable+Buffer+Cache

b)-buffer/cache Used =进程使用内存+Slab使用+pagetable

那么,由于pagetable通常是内存页表的元数据,一般很小;

排查内存使用基本上排查三个地方:

1、buffer、cache是否偏高,为什么?

2、用户进程使用是否偏高,为什么?

3、Slab使用是否偏高,为什么?

针对问题1:

通过free -m即可看到buffer/cache的使用情况,如果buffer/cache偏高,我们就可以通过drop cache来进行释放了;

To
free pagecache:

echo
1 > /proc/sys/vm/drop_caches

To
free dentriesand inodes:

echo
2 > /proc/sys/vm/drop_caches

To
free pagecache,dentriesand inodes:

echo
3 > /proc/sys/vm/drop_caches

安全起见,先sync。

针对问题2:

top 命令, 通过shift+m,即可按照内存排序:

1.Virt: 虚拟内存

2.Res :  
物理内存(常驻内存)

3.Shr :  
共享内存

4.    实际使用内存是:RES。

Free中看到的used,不是virt的和,而是res的和

通过这个命令,则可以知道哪些进程内存占用率高;

然后,通过pmap -d  $pid查看内存分布情况:

通过这个命令,即可知道这个进程的内存具体分配到哪里了;

针对问题3:

如果buffer/cache、用户态进程都使用的很少,但是内存使用率很高,剩下的疑点就是slab了;

通过slabtop命令,能查明slab的使用情况;

t

排序标准

a:
sort by number of active objects

b:
sort by objects per slab

c:
sort by cache size

l:
sort by number of slabs

v:
sort by number of active slabs

n:
sort by name

o:
sort by number of objects

p:
sort by pages per slab

s:
sort by object size

u:
sort by cache utilization

通过按照cache size排序,就是到哪些slab消耗内存最大;

处理方法往往也是drop cache;

另外,如果使用了swap,建议关闭swap;

但是内存又不够,怎么办?如果是云服务器,建议直接弹性内存扩容;

如果是物理机,大致有这些调优方法:

1.降低swap的使用率:

sysctl-a | grepswappiness

vm.swappiness= 60

2.关闭Swap:swapoff

3.限制其他用户的内存使用

vim /etc/security/limits.conf

user1
hard as 1000 (用户user1所有累加起来,内存不超过1000kiB)

user1
soft as 800 (用户user1一次运行,内存不超过800kiB)

4.大量连续内存数据:

vim /etc/sysctl.conf

vm.nr_hugepage=20

5.调节page
cache(大量一样的请求 调大page
cache)

vm.lowmem_reserve_ratio= 256 256 32 (保留多少内存作为pagecache当前 最大 最小)

vm.vfs_cache_pressure=100(大于100,回收pagecache)

vm.page.cluster=3(一次性从swap写入内存的量为2的3次方页)

vm.zone_reclaim_mode=0/1(当内存危机时,是否尽量回收内存0:尽量回收1:尽量不回收)

min_free_kbytes:该文件表示强制Linux
VM最低保留多少空闲内存(Kbytes)。

6脏页

vm.dirty_background_radio=10(当脏页占内存10%,pdflush工作)

vm.dirty_radio=40(当进程自身脏页占内存40%,进程自己处理脏页,将其写入磁盘)

vm.dirty_expire_centisecs=3000(脏页老化时间为30秒3000/100=30秒)

vm.dirty_writeback_centisecs=500(每隔5秒,pdflush监控一次内存数量500/100=5秒)

时间: 2024-11-05 12:17:06

Linux内存问题排查的相关文章

内存问题排查手段及相关文件介绍

5.内存问题排查手段及相关文件介绍[重点] 对于内存问题排查,或者OOM问题排查,一般会涉及到如下文件,下面将如下文件的分析和设置介绍一下,这也是本文档的重点,后面排查内存信息还是要根据这些文件信息来排查.其实未必是有内存泄露,也可能是一些策略有问题,比如线程数目的增加,buffer的申请.释放时间交集等. 5.1 /proc/sys/vm/min_free_kbytes min_free_kbytes用来确定系统开始回收内存的阀值,控制系统的空闲内存.值越高,内核越早开始回收内存,空闲内存越高

linux内存管理

一.Linux 进程在内存中的数据结构 一个可执行程序在存储(没有调入内存)时分为代码段,数据段,未初始化数据段三部分:    1) 代码段:存放CPU执行的机器指令.通常代码区是共享的,即其它执行程序可调用它.假如机器中有数个进程运行相同的一个程序,那么它们就可以使用同一个代码段.     2) 数据段:存放已初始化的全局变量.静态变量(包括全局和局部的).常量.static全局变量和static函数只能在当前文件中被调用.     3) 未初始化数据区(uninitializeddata s

Linux内存管理机制

一.首先大概了解一下计算机CPU.Cache.内存.硬盘之间的关系及区别. 1.  CPU也称为中央处理器(CPU,Central Processing Unit)是一块超大规模的集成电路, 是一台计算机的运算核心(Core)和控制核心( Control Unit).它的功能主要是解释计算机指令以及处理计算机软件中的数据.中央处理器主要由三核心部件组成,运算器.控制器和总线(BUS),运算器又主要由算术逻辑单元(ALU)和寄存器(RS)组成. 2.Cache即高速缓冲存储器,是位于CPU与主内存

Linux内存机制以及手动释放swap和内存

哇,感觉好久没更新了,今天我们来谈谈Linux的内存机制. 首先我们理一下概念 一.什么是linux的内存机制? 我们知道,直接从物理内存读写数据要比从硬盘读写数据要快的多,因此,我们希望所有数据的读取和写入都在内存完成,而内存是有限的,这样就引出了物理内存与虚拟内存的概念. 物理内存就是系统硬件提供的内存大小,是真正的内存,相对于物理内存,在linux下还有一个虚拟内存的概念,虚拟内存就是为了满足物理内存的不足而提出的策略,它是利用磁盘空间虚拟出的一块逻辑内存,用作虚拟内存的磁盘空间被称为交换

Linux内存管理 【转】

转自:http://blog.chinaunix.net/uid-25909619-id-4491368.html Linux内存管理 摘要:本章首先以应用程序开发者的角度审视Linux的进程内存管理,在此基础上逐步深入到内核中讨论系统物理内存管理和内核内存的使用方法.力求从外到内.水到渠成地引导网友分析Linux的内存管理与使用.在本章最后,我们给出一个内存映射的实例,帮助网友们理解内核内存管理与用户内存管理之间的关系,希望大家最终能驾驭Linux内存管理. 前言 内存管理一向是所有操作系统书

攻城狮在路上(叁)Linux(二十五)--- linux内存交换空间(swap)的构建

swap的功能是应付物理内存不足的状况,用硬盘来暂时放置内存中的信息. 对于一般主机,物理内存都差不多够用,所以也就不会用到swap,但是对于服务器而言,当遇到大量网络请求时或许就会用到. 当swap被使用的时候,主机的硬盘灯就会闪烁不停. 本篇介绍两种方式:1.设置一个swap分区   2.创建一个虚拟内存的文件. 一.使用物理分区构建swap: 1.首先是分区: A.fdisk /dev/sda; <== 根据后续提示创建一个分区. B.修改分区的ID,因为fdisk默认将分区的ID作为文件

linux内存管理浅析

[地址映射](图:左中)linux内核使用页式内存管理,应用程序给出的内存地址是虚拟地址,它需要经过若干级页表一级一级的变换,才变成真正的物理地址.想一下,地址映射还是一件很恐怖的事情.当访问一个由虚拟地址表示的内存空间时,需要先经过若干次的内存访问,得到每一级页表中用于转换的页表项(页表是存放在内存里面的),才能完成映射.也就是说,要实现一次内存访问,实际上内存被访问了N+1次(N=页表级数),并且还需要做N次加法运算.所以,地址映射必须要有硬件支持,mmu(内存管理单元)就是这个硬件.并且需

启动期间的内存管理之初始化过程概述----Linux内存管理(九)

日期 内核版本 架构 作者 GitHub CSDN 2016-06-14 Linux-4.7 X86 & arm gatieme LinuxDeviceDrivers Linux内存管理 在内存管理的上下文中, 初始化(initialization)可以有多种含义. 在许多CPU上, 必须显式设置适用于Linux内核的内存模型. 例如在x86_32上需要切换到保护模式, 然后内核才能检测到可用内存和寄存器. 而我们今天要讲的boot阶段就是系统初始化阶段使用的内存分配器. 1 前景回顾 1.1

linux内存源码分析 - 内存压缩(同步关系)

本文为原创,转载请注明:http://www.cnblogs.com/tolimit/ 概述 最近在看内存回收,内存回收在进行同步的一些情况非常复杂,然后就想,不会内存压缩的页面迁移过程中的同步关系也那么复杂吧,带着好奇心就把页面迁移的源码都大致看了一遍,还好,不复杂,也容易理解,这里我们就说说在页面迁移过程中是如何进行同步的.不过首先可能没看过的朋友需要先看看linux内存源码分析 - 内存压缩(一),因为会涉及里面的一些知识. 其实一句话可以概括页面迁移时是如何进行同步的,就是:我要开始对这