共计 3973 个字符,预计需要花费 10 分钟才能阅读完成。
这篇文章主要讲解了“Linux 内存基础知识点有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着丸趣 TV 小编的思路慢慢深入,一起来研究和学习“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 内存基础知识点有哪些这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是丸趣 TV,丸趣 TV 小编将为大家推送更多相关知识点的文章,欢迎关注!