简介: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 -mtotal       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: 疯狂使用swap2. 操作方法
# 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_caches0:不释放
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

6. 结语

如有纰漏欢迎指正。

我们是阿里云智能全球技术服务-SRE团队,我们致力成为一个以技术为基础、面向服务、保障业务系统高可用的工程师团队;提供专业、体系化的SRE服务,帮助广大客户更好地使用云、基于云构建更加稳定可靠的业务系统,提升业务稳定性。我们期望能够分享更多帮助企业客户上云、用好云,让客户云上业务运行更加稳定可靠的技术。

原文链接:https://developer.aliyun.com/article/781828?

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

Linux系统诊断实践-内存基础相关推荐

  1. linux性能评估-内存基础理解篇

    1.Linux内存是怎么工作的 1.内存映射: 2.虚拟内存空间分布 3.内存分配与回收 4.如何查看内存使用情况 小结 2.理解内存中的Buffer和Cache? 1.free 数据的来源 2.pr ...

  2. Linux系统诊断-内存基础

    简介: Linux系统诊断-内存基础 1. 背景 谈及linux内存,很多时候,我们会关注free,top等基础命令.当系统遇到异常情况时,内存问题的根因追溯,现场诊断时,缺乏深层次的debug能力. ...

  3. Linux IPC实践(8) --共享内存/内存映射

    概述 共享内存区是最快的IPC形式.一旦这样的内存映射到共享它的进程的地址空间,这些进程间数据传递不再涉及到内核,换句话说是进程不再通过执行进入内核的系统调用来传递彼此的数据(如图). 共享内存 VS ...

  4. Linux 基础知识(2)---Linux内核空间内存申请函数kmalloc、kzalloc、vmalloc的区别

    Linux内核空间内存申请函数kmalloc.kzalloc.vmalloc的区别 kzalloc与kmalloc区别    这个函数就是原来的两个函数的整合 , 即原来我们每次申请内存的时候都会这么 ...

  5. Linux课题实践一

    Linux课题实践一 20135318 刘浩晨 1.1应用安装 (1)掌握软件源的维护方法,配置系统使用软件源镜像  删除过期或者重复的软件包:进入"系统设置"-"软件和 ...

  6. linux跟踪内存检测原理,wooyun/Linux下基于内存分析的Rootkit检测方法.html at master · exitmsconfig/wooyun · GitHub...

    Linux下基于内存分析的Rootkit检测方法 - 路人甲 原文地址:http://drops.wooyun.org/tips/4731 0x00 引言 某Linux服务器发现异常现象如下图,确定被 ...

  7. Linux系统编程——进程基础知识

    Linux系统编程--进程基础知识 1.程序和进程 程序,是指编译好的二进制文件,在磁盘上,不占用系统资源(cpu.内存.打开的文件.设备.锁-) 进程,是一个抽象的概念,与操作系统原理联系紧密.进程 ...

  8. Linux技术研究-基础篇(raid与LVM,配额)

    Linux技术研究-基础篇(raid与LVM,配额) 创建RAID-5 若想建立新的md1设备 只在/dev下建立还不够 重启后会消失 固化的方法是 为了使udev自动产生/dev/md1, /dev ...

  9. Linux 操作系统原理 — 内存 — 基于局部性原理实现的内/外存交换技术

    目录 文章目录 目录 前文列表 基于局部性原理实现的内-外存交换技术 局部性原理 Swap 交换分区 前文列表 <Linux 操作系统原理 - 内存 - 物理存储器与虚拟存储器> < ...

最新文章

  1. OCP换考题了,052新考题及答案整理-第17题
  2. Python+pandas计算数据相关系数(person、Kendall、spearman)
  3. java正则 链接_Java正则表达式获取网址和链接文字解析
  4. SQL Server Profiler的一个小问题
  5. 笔记-JavaWeb学习之旅2
  6. 判断php图片是否存在,php判断远程图片是否存在
  7. linux upstart机制简介及封装应用
  8. 说说单节点集群里安装hive、3\5节点集群里安装hive的诡异区别(版本搭配)
  9. SPSS比较两组数据有无显著性差异 独立样本T检验
  10. 惠普电脑u盘重装系统步骤_惠普电脑u盘重装系统xp教程
  11. win10如何关闭自动更新及修改更新时间
  12. ROS中EKF(扩展卡尔曼跟踪)的使用
  13. CSS3第二日--2D转换
  14. 扇贝编程的python课怎么样_‎扇贝编程-人人能学会的python课 a l’App Store
  15. PyQt5之QDateTimeEdit编辑日期时间
  16. 球坐标系下的两点距离公式
  17. appinventor mysql_利用AppInventor实现登录功能(完整版).docx
  18. 启动不了argis的license manager
  19. 以手机为基础的移动互联网对我们生活的影响
  20. geojson转shp

热门文章

  1. 反射机制----Method,Field,Constructor
  2. 一代不如一代?别轻易给年轻人贴标签
  3. 给大家推荐一位我非常佩服的Python工程师 人生赢家
  4. python 量化交易_Quantsrat让R语言像Python一样进行策略回测和量化交易
  5. 计算机二级通app打不开,计算机二级通app
  6. c语言case后面多字符,多SWITCH-CASE结构时的C语言对象方式化解
  7. JSON数据格式:以及XML文件格式,YML文件格式,properties文件格式
  8. 计算机网络知识点总结(第六版,谢希仁)
  9. 使用vi/vim编辑时按ctrl-s后客户端假死解决方法
  10. java 线程之对象的同步和异步