二维码
微世推网

扫一扫关注

当前位置: 首页 » 快闻头条 » 经验 » 正文

Linux系统诊断_内存基础

放大字体  缩小字体 发布日期:2022-01-02 12:24:16    作者:李诗琪    浏览次数:300
导读

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

简介: 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 cachedMem: 1991 1909 81 4 155 836-/+ buffers/cache: 917 1073Swap: 1023 1 1022

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

used: 已使用得内存 used = total - free -buffers -cachedfree: 未使用得内存 memFree & swapFree in /proc/meminfoshared: tmpfs使用得内存 shmem in /proc/meminfobuffers:被内核缓冲去使用得内存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,默认600: 表示禁止使用swap60: 默认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=2M3. 安全设置# chown root:root /home/swap2G# chmod 0600 /home/swap2G4. 创建liunx交换分区# mkswap /home/swap2G5. enable 交换分区# swapon /home/swap2G6. 更新fstab文件【注意: 部分操作系统不需要】# vim /etc/fstab/home/swap2G none swap sw 0 07. 检查是否生效#free -m8. 卸载swap分区# swapoff /home/swap2G

5.2 缓存相关

sync; echo 3 > /proc/sys/vm/drop_caches0:不释放1:释放页缓存2:释放 dentries 和 inodes3:释放所有缓存

5.3 OOM相关

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

6. 结语

如有纰漏欢迎指正。

:SRE团队技术小编-小凌

感谢为阿里云来自互联网内容,未经允许不得感谢

 
(文/李诗琪)
免责声明
• 
本文仅代表发布者:李诗琪个人观点,本站未对其内容进行核实,请读者仅做参考,如若文中涉及有违公德、触犯法律的内容,一经发现,立即删除,需自行承担相应责任。涉及到版权或其他问题,请及时联系我们删除处理邮件:weilaitui@qq.com。
 

Copyright©2015-2025 粤公网安备 44030702000869号

粤ICP备16078936号

微信

关注
微信

微信二维码

WAP二维码

客服

联系
客服

联系客服:

24在线QQ: 770665880

客服电话: 020-82301567

E_mail邮箱: weilaitui@qq.com

微信公众号: weishitui

韩瑞 小英 张泽

工作时间:

周一至周五: 08:00 - 24:00

反馈

用户
反馈