简介:Linux系统诊断-内存基础
谈及linux内存,很多时候,我们会关注free,top等基础命令。当系统遇到异常情况时,内存问题的根因追溯,现场诊断时,缺乏深层次的debug能力。本篇幅不做深层讨论,能把当前系统的问题描述清楚,是每个SRE应该具备的最基础能力。
free是通过查看 /proc/meminfo 来获取内存的使用情况。但是 /proc/meminfo 这个文件又是怎么来的?我们先了解下 /proc 目录:
结论: /proc/meminfo 是 /proc 文件系统下保存你内存相关信息的"伪文件"。
每个发行版输出都有一定差异,我们以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文档中找到解析,这里不做赘述。
答案是肯定的,先来了解下buffer和cache。
然而,free命令所展示的buffer和cache 有点狭义的意思——free展示的buffer表示 块设备所占用的缓存 、free展示的cache表示普通文件占用的the page cache(缓存页) 。
总之,buffer和cache使用的内存都是用来加速Linux读写性能,如果有新的进程需要内存,系统会将buffer和cache占用的内存回收,并重新分配给进程使用。
RSS & VSZ & PSS & USS
usedMem分为 active & inactive
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相关配置。
1.What is OOM?
Out Of Memory Killer 是 Linux 的一种系统保护机制,在系统内存紧张时,kill掉某些进程防止系统卡死。系统通过打分机制,来实施对进程的杀死操作。默认机制是通过扫描所有进程的内存占用,cpu占用等因素,然后打分 (badness),分数越高,进程被kill的优先级就越高。
2.哪些行为会让系统对进程进行打分?
3.在哪儿可以看到进程的打分?/proc/
4.手动调整分数
/proc//oom_adj 该文件可以用于调整在oom发生时,哪些进程应该被kill,范围-16 -- +15 ,默认值为0,
特殊值-17:表示进程永远不会被kill。
5.我怎么知道系统有没有触发过OOM?
/var/log/messages 、 /var/log/syslog 系统日志或者 dmesg 系统日志诊断工具等都能够找到
网图如下:
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
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
sync; echo 3 > /proc/sys/vm/drop_caches
0:不释放
1:释放页缓存
2:释放 dentries 和 inodes
3:释放所有缓存
是否在触发 oom 机制时触发 kernel panic。0表示关闭(推荐),1表示打开。 kernel panic是指计算机遇到了致命的错误,并且他不知道该怎么处理时的一种动作——可以类比windows的蓝屏。 我们当然不希望每次计算机在oom时就直接蓝屏。推荐设置为0
用于限制进程能够申请的最大内存,0表示不设置,如果设置其他数值,比如400,则进程能够申请到的最大内存为 swap+400kBytes
定义了进程可以使用的最大内存(百分比模式),默认为50。表示配置50之后,进程不允许申请超过 swap + 50% * 物理内存总量 以上的内存
这在内存不足的情况下启用或禁用杀死OOM触发任务。0表示禁用(默认),1表示启用。可以理解为oom机制的开关,默认为禁用——表示要让oom触发器正常执行。
如有纰漏欢迎指正。
我们是阿里云智能全球技术服务-SRE团队,我们致力成为一个以技术为基础、面向服务、保障业务系统高可用的工程师团队;提供专业、体系化的SRE服务,帮助广大客户更好地使用云、基于云构建更加稳定可靠的业务系统,提升业务稳定性。我们期望能够分享更多帮助企业客户上云、用好云,让客户云上业务运行更加稳定可靠的技术。
原文链接:https://developer.aliyun.com/article/781828?
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。