Linux系统诊断之内存基础深入详解

1.背景

谈及linux内存,很多时候,我们会关注free,top等基础命令。当系统遇到异常情况时,内存问题的根因追溯,现场诊断时,缺乏深层次的debug能力。本篇幅不做深层讨论,能把当前系统的问题描述清楚,是每个SRE应该具备的最基础能力。

2. free

2.1 free命令原理

free是通过查看 /proc/meminfo 来获取内存的使用情况。但是 /proc/meminfo 这个文件又是怎么来的?我们先了解下 /proc 目录:

  • /proc 是一个虚拟文件系统,该目录下的所有文件都是伪文件,该类文件只存在于内存中,并不占用空间——使用 du -sh 即可验证,该模具路下的磁盘占用都是0。
  • /proc 下的所有文件都是内核调用proc_create() 接口来创建的虚拟条目。
  • /proc 中的文件,大多反馈系统信息的实时情况(进程、内存、cpu、设备信息等)。

结论: /proc/meminfo 是 /proc 文件系统下保存你内存相关信息的"伪文件"。

2.2 命令输出简介

每个发行版输出都有一定差异,我们以debian8 4.19.x发行版为例。

root@4f996feeb851:~# free -m
  total used free shared buffers cached
Mem:  1991 1909  81  4 155 836
-/+ buffers/cache: 917 1073
Swap:  1023  1 1022

大部分的命令输出意思,大家可以在man文档中找到解析,这里不做赘述。

  • used: 已使用的内存 used = total - free -buffers -cached
  • free: 未使用的内存 memFree & swapFree in /proc/meminfo
  • shared: tmpfs使用的内存 shmem in /proc/meminfo
  • buffers:被内核缓冲去使用的内存
  • cached: 被页缓存和slabs使用的内存
  • buffers/cache: 表示buffers和cache的总和
  • swap: 交换分区的使用量

2.3 buffer和cache会使用内存吗?

答案是肯定的,先来了解下buffer和cache。

  • cache(缓存)官方定义是用来弥补高速设备和低速设备之间的访问速度不匹配而预留的一段空间,用来加快资源的访问。 简单讲就是读的更快。
  • buffer(缓冲)是为了做资源写入整形,计算机遇到大量的“小规模IO”时,会将其整形为少量的“大规模IO”,降低写入次数。从而达到“写资源”合理利用的效果。

然而,free命令所展示的buffer和cache 有点狭义的意思——free展示的buffer表示 块设备所占用的缓存 、free展示的cache表示普通文件占用的the page cache(缓存页) 。

总之,buffer和cache使用的内存都是用来加速Linux读写性能,如果有新的进程需要内存,系统会将buffer和cache占用的内存回收,并重新分配给进程使用。

2.4 其他内存概念

RSS & VSZ & PSS & USS

  • RSS(Resident Set Size):进程实际使用的物理内存大小,包括sharedMem。
  • VSZ(Virtual Memory Size):进程所有能够访问到的内存大小,包括因为缺页中断,被swap出去的内存大小,以及sharedMem。
  • PSS(Proportional Set Size):按照比例将内存的大小加到RSS中。
  • USS(Unique Set Size):进程独占的物理内存大小。

usedMem分为 active & inactive

  • active:表示这部分的内存正在被某个特定的进程使用,不太可能被收回。
  • inactive:表示这部分内存是被分配到某个不在running状态的进程,有可能会被回收。

Linux会维护一个LRU List用来管理活动页和非活动页的回收。 简单讲, 越接近该List的末尾,该页面被回收的概率就越大,反之,越接近列首,则更不易被回收。 linux内核会维护两类LRUList——active list和inactive list,刚访问过的页面放入active list,长时间未访问的页面放入inactive list,内核线程kswapd会定期将active list中的页面移至 inactive list中。

如果系统的inactive的内存过大,可以通过如下操作对其做回收。
sync; echo 3 > /proc/sys/vm/drop_caches

3. 虚拟内存

现代x86系统,计算机能够使用的内存会大于其物理内存的上限,依靠的就是虚拟内存机制。Linux支持虚拟内存机制和实模式机制。

实模式下,计算机会直接申请物理内存, 虚拟内存机制下,系统会把磁盘当成内存的扩展,已增加可使用的内存大小。并通过映射map的机制,来保存和物理内存的真实对应关系。

在磁盘和内存之间传送Page的活动叫做swapping或者页面调度(paging),被用作虚拟内存的磁盘分区称为swap。

可以通过在线添加swap的方式临时缓解内存不足的问题,但一般不能直接作在线减少swap的操作,很有可能导致进程的crash。具体swap配置方式见5.1swap相关配置。

4. OOM

1.What is OOM?

Out Of Memory Killer 是 Linux 的一种系统保护机制,在系统内存紧张时,kill掉某些进程防止系统卡死。系统通过打分机制,来实施对进程的杀死操作。默认机制是通过扫描所有进程的内存占用,cpu占用等因素,然后打分  (badness),分数越高,进程被kill的优先级就越高。

2.哪些行为会让系统对进程进行打分?

  • 进程使用fork(2)调用,创建众多子进程时,会加分(+)
  • 进程已经运行了很长时间,或者和使用了大量的CPU时间,会减分(-)
  • 进程的nice值如果比较低,会加分(+)
  • 进程如果是特权进程(privileged),会减分(-)
  • 进程如果对硬件设备进行直接访问,会减分(-)

3.在哪儿可以看到进程的打分?

/proc/<pid>/oom_score

4.手动调整分数

/proc//oom_adj 该文件可以用于调整在oom发生时,哪些进程应该被kill,范围-16 -- +15 ,默认值为0,  

特殊值-17:表示进程永远不会被kill。

5.我怎么知道系统有没有触发过OOM?

/var/log/messages 、 /var/log/syslog 系统日志或者 dmesg 系统日志诊断工具等都能够找到

5. 内存相关配置

5.1 swap相关配置

通过调节系统参数,来告诉计算机使用swap分区的权重

1. 简介
swappiness范围0-100,默认60
0: 表示禁止使用swap
60: 默认
100: 疯狂使用swap

2. 操作方法
# sysctl vm.swappiness=VALUE
# sysctl vm.swappiness=20
或者
# echo VALUE > /proc/sys/vm/swappiness
# echo 30 > /proc/sys/vm/swappiness

通过在线增加swap分区大小,临时控制内存泄露,内存不够用等异常。

1. 需要root用户
2. 创建存储文件
# dd if=/dev/zero of=/home/swap2G bs=1024 count=2M
3. 安全设置
# chown root:root /home/swap2G
# chmod 0600 /home/swap2G
4. 创建liunx交换分区
# mkswap /home/swap2G
5. enable 交换分区
# swapon /home/swap2G
6. 更新fstab文件【注意: 部分操作系统不需要】
# vim /etc/fstab
/home/swap2G none swap sw 0 0
7. 检查是否生效
#free -m
8. 卸载swap分区
# swapoff /home/swap2G

5.2 缓存相关

sync; echo 3 > /proc/sys/vm/drop_caches

0:不释放
1:释放页缓存
2:释放 dentries 和 inodes
3:释放所有缓存

5.3 OOM相关

  • vm.panic_on_oom
  • 是否在触发 oom 机制时触发 kernel panic。0表示关闭(推荐),1表示打开。 kernel panic是指计算机遇到了致命的错误,并且他不知道该怎么处理时的一种动作——可以类比windows的蓝屏。 我们当然不希望每次计算机在oom时就直接蓝屏。推荐设置为0
  • vm.overcommit_kbytes:
  • 用于限制进程能够申请的最大内存,0表示不设置,如果设置其他数值,比如400,则进程能够申请到的最大内存为 swap+400kBytes
  • vm.overcommit_ratio:
  • 定义了进程可以使用的最大内存(百分比模式),默认为50。表示配置50之后,进程不允许申请超过 swap + 50% * 物理内存总量 以上的内存
  • vm.oom_kill_allocating_task (Linux 2.6.24+支持)
  • 这在内存不足的情况下启用或禁用杀死OOM触发任务。0表示禁用(默认),1表示启用。可以理解为oom机制的开关,默认为禁用——表示要让oom触发器正常执行。
  • 其他有兴趣的话,可以自行man proc

到此这篇关于Linux系统诊断之内存基础深入详解的文章就介绍到这了,更多相关Linux系统诊断之内存基础内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Linux 下如何检查内存使用率

    在排查系统问题,或者应用变慢,或者不明原因问题时,第一件事就是要检查系统的内存使用率. 本文讲解如何在 Linux 中使用不同的几个命令来检查 RAM 内存使用率. 一.free 命令 free命令是检查一个 Linux 系统中内存使用率最常用的命令.它显示关于内存总量,已经使用的内存以及空闲内存的相关信息. 通常, free 运行时加上-h选项,意味着以人类可读的格式打印输出: free -h total used free shared buff/cache available Mem: 3

  • 解决Linux下php-fpm进程过多导致内存耗尽问题

    最近,发现个人博客的Linux服务器,数据库服务经常挂掉,导致需要重启,才能正常访问,极其恶心,于是决心开始解决问题,解放我的时间和精力(我可不想经常出问题,然后人工重启,费力费时). 分析问题 发现问题以后,首先使用 free -m 指令查看当前服务器执行状况: 可以看到我的服务器内存是2G的,但是目前可用内存只剩下70M,内存使用率高达92%,很有可能是内存使用率过高导致数据库服务挂断. 继续看详细情况,使用 top 指令: 然后再看指令输出结果中详细列出的进程情况,重点关注第10列内存使用

  • Linux系统查看CPU、机器型号、内存等信息

    系统维护时随时可能有需要查看 CPU 使用率,并根据相应信息分析系统状况的需要.在 linux 中,可以通过 top 命令来查看 CPU 使用状况.关于 top 命令的详细说明请参看 使用top命令分析linux系统性能的详解 这篇文章. top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器:不过这里我们主要是介绍一下 linux 系统如何查看CPU信息.机器型号.内存信息等. 系统 # uname -a # 查看内核/操作系统/

  • jmeter在linux系统下运行及本地内存调优的方法详解

    1.在linux系统下安装跨系统传输文件工具 root用户下 根目录输入 yum -y install lrzsz 2.把apache-jmeter-4.0zip包 用rz命令上传到linux系统的根目录下 解压 3.配置jmeter环境变量 vim /etc/profile 添加 export PATH=/apache-jmeter-4.0/bin/:$PATH 注意路径 4.使用 rz命令上传jdk1.8 linux 64位版本 解压到 usr/local 目录下 下载jdk安装包 下载地址

  • Linux系统诊断之内存基础深入详解

    1.背景 谈及linux内存,很多时候,我们会关注free,top等基础命令.当系统遇到异常情况时,内存问题的根因追溯,现场诊断时,缺乏深层次的debug能力.本篇幅不做深层讨论,能把当前系统的问题描述清楚,是每个SRE应该具备的最基础能力. 2. free 2.1 free命令原理 free是通过查看 /proc/meminfo 来获取内存的使用情况.但是 /proc/meminfo 这个文件又是怎么来的?我们先了解下 /proc 目录: /proc 是一个虚拟文件系统,该目录下的所有文件都是

  • Linux常用ls, alias基础命令详解

    ls命令 作用:列举目录文件信息( list directory content ) 格式:ls [option] [file] 1,命令不跟任何选项与目录,表示列举当前目录的文件信息 ghostwu@dev:~$ ls Desktop examples.desktop linux Pictures python Videos Documents git_test Music project software Downloads info php Public Templates 2,ls -l

  • Linux网络设置之基础操作命令详解

    目录 查看网络配置 查看网络接口信息---ifconfig 查看路由表---route 查看网络连接情况---netstat 获取 socket 统计信息---ss 测试网络连接 测试网络连通性------ping 测试DNS域名解析------nslookup 设置网络地址参数 使用命令修改(临时配置) 修改网卡的地址.状态------ifconfig 添加.删除静态路由记录---route 修改配置文件(固定设置) 网络接口配置文件 路由配置文件 域名解析配置文件 本地主机映射文件 host

  • Linux C字符串替换函数实例详解

    Linux C字符串替换函数实例详解 最近学习linux 的基础编程知识,字符串替换函数,在网上找下资料,觉得这篇文章写的不错,记录下来,和大家分享一下: 实例代码: #include <stdio.h> #include <string.h> #include <stdlib.h> /** * * @author: cnscn@163.com * @reference: lovesnow1314@http://community.csdn.net/Expert/Top

  • Docker基础命令详解

    docker基本概念 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上. Docker是一个重新定义了程序开发测试.交付和部署过程的开放平台,Docker则可以称为构建一次,到处运行,这就是docker提出的"Build once,Run anywhere" 创建镜像 创建镜像的方法有三种: 基于已有的容器创建 基于本地模板导入 基于dockerfile 基于已有的容器创建 主要使用docker

  • Linux消息队列实现进程间通信实例详解

    Linux消息队列实现进程间通信实例详解 一.什么是消息队列 消息队列提供了一种从一个进程向另一个进程发送一个数据块的方法.  每个数据块都被认为含有一个类型,接收进程可以独立地接收含有不同类型的数据结构.我们可以通过发送消息来避免命名管道的同步和阻塞问题.但是消息队列与命名管道一样,每个数据块都有一个最大长度的限制. Linux用宏MSGMAX和MSGMNB来限制一条消息的最大长度和一个队列的最大长度. 二.在Linux中使用消息队列 Linux提供了一系列消息队列的函数接口来让我们方便地使用

  • Linux中对MySQL优化实例详解

    Linux中对MySQL优化实例详解 vim /etc/my.cnf以下只列出my.cnf文件中[mysqld]段落中的内容,其他段落内容对MySQL运行性能影响甚微,因而姑且忽略. [mysqld] port = 3306 serverid = 1 socket = /tmp/mysql.sock skip-locking 避免MySQL的外部锁定,减少出错几率增强稳定性. skip-name-resolve 禁止MySQL对外部连接进行DNS解析,使用这一选项可以消除MySQL进行DNS解析

  • linux下安装solr的教程详解

    安装Solr 第一步:将solr的压缩包上传到Linux系统 第二步:解压tomcat tar -zvxf apache-tomcat-7.0.47.tar.gz [root@localhost ~]# tar -zxvf apache-tomcat-7.0.47.tar.gz 第三步:在/usr/local/新建目录solr 第四步:将tomcat拷贝在/usr/local/solr/目录下,并命名为tomcat 第五步 解压solr [root@localhost ~]# tar -zvxf

  • java语言注解基础概念详解

    1.RetentionPolicy.SOURCE:注解只保留在源文件,当Java文件编译成class文件的时候,注解被遗弃: 2.RetentionPolicy.CLASS:注解被保留到class文件,但jvm加载class文件时候被遗弃,这是默认的生命周期: 3.RetentionPolicy.RUNTIME:注解不仅被保存到class文件中,jvm加载class文件之后,仍然存在: 这3个生命周期分别对应于:Java源文件(.java文件)--->.class文件--->内存中的字节码.

  • VirtualBox软件下载安装及Linux环境安装部署图文教程详解

    一.VirtualBox软件下载及安装 首先进入VirtualBox官方网站进行软件下载, https://www.virtualbox.org/,目前VirtualBox最新的版本为6.1,详细如下图: 点击"Downloads"按钮,即跳转自"VirtualBox 6.1.4 platform packages"下载页面 选择"Windows hosts",即进行VirtualBox软件下载 双击"VirtualBox-6.1.4-

随机推荐