共计 3788 个字符,预计需要花费 10 分钟才能阅读完成。
简介:Linux 系统诊断 - 内存根底
- 背景
======
谈及 linux 内存,很多时候,咱们会关注 free,top 等根底命令。当零碎遇到异常情况时,内存问题的根因追溯,现场诊断时,不足深层次的 debug 能力。本篇幅不做深层探讨,能把以后零碎的问题形容分明,是每个 SRE 应该具备的最根底能力。
- 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
- 虚拟内存
========
古代 x86 零碎,计算机可能应用的内存会大于其物理内存的下限,依附的就是虚拟内存机制。Linux 反对虚拟内存机制和实模式机制。
实模式下,计算机会间接申请物理内存,虚拟内存机制下,零碎会把磁盘当成内存的扩大,已减少可应用的内存大小。并通过映射 map 的机制,来保留和物理内存的实在对应关系。
在磁盘和内存之间传送 Page 的流动叫做 swapping 或者页面调度(paging),被用作虚拟内存的磁盘分区称为 swap。
能够通过在线增加 swap 的形式长期缓解内存不足的问题,但个别不能间接作在线缩小 swap 的操作,很有可能导致过程的 crash。具体 swap 配置形式见 5.1swap 相干配置。
- 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.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
6. 结语
如有纰漏欢送斧正。
作者:SRE 团队技术小编 - 小凌
原文链接
本文为阿里云原创内容,未经容许不得转载