Linux系统诊断之内存基础深入详解
1.背景
谈及linux内存,很多时候,我们会关注free,top等基础命令。当系统遇到异常情况时,内存问题的根因追溯,现场诊断时,缺乏深层次的debug能力。本篇幅不做深层讨论,能把当前系统的问题描述清楚,是每个SRE应该具备的最基础能力。
2.free
2.1free命令原理
free是通过查看/proc/meminfo来获取内存的使用情况。但是/proc/meminfo这个文件又是怎么来的?我们先了解下/proc目录:
- /proc是一个虚拟文件系统,该目录下的所有文件都是伪文件,该类文件只存在于内存中,并不占用空间——使用du-sh即可验证,该模具路下的磁盘占用都是0。
- /proc下的所有文件都是内核调用proc_create()接口来创建的虚拟条目。
- /proc中的文件,大多反馈系统信息的实时情况(进程、内存、cpu、设备信息等)。
结论:/proc/meminfo是/proc文件系统下保存你内存相关信息的"伪文件"。
2.2命令输出简介
每个发行版输出都有一定差异,我们以debian84.19.x发行版为例。
root@4f996feeb851:~#free-m totalusedfreesharedbufferscached Mem:19911909814155836 -/+buffers/cache:9171073 Swap:102311022
大部分的命令输出意思,大家可以在man文档中找到解析,这里不做赘述。
- used:已使用的内存used=total-free-buffers-cached
- free:未使用的内存memFree&swapFreein/proc/meminfo
- shared:tmpfs使用的内存shmemin/proc/meminfo
- buffers:被内核缓冲去使用的内存
- cached:被页缓存和slabs使用的内存
- buffers/cache:表示buffers和cache的总和
- swap:交换分区的使用量
2.3buffer和cache会使用内存吗?
答案是肯定的,先来了解下buffer和cache。
- cache(缓存)官方定义是用来弥补高速设备和低速设备之间的访问速度不匹配而预留的一段空间,用来加快资源的访问。简单讲就是读的更快。
- buffer(缓冲)是为了做资源写入整形,计算机遇到大量的“小规模IO”时,会将其整形为少量的“大规模IO”,降低写入次数。从而达到“写资源”合理利用的效果。
然而,free命令所展示的buffer和cache有点狭义的意思——free展示的buffer表示块设备所占用的缓存、free展示的cache表示普通文件占用的thepagecache(缓存页)。
总之,buffer和cache使用的内存都是用来加速Linux读写性能,如果有新的进程需要内存,系统会将buffer和cache占用的内存回收,并重新分配给进程使用。
2.4其他内存概念
RSS&VSZ&PSS&USS
- RSS(ResidentSetSize):进程实际使用的物理内存大小,包括sharedMem。
- VSZ(VirtualMemorySize):进程所有能够访问到的内存大小,包括因为缺页中断,被swap出去的内存大小,以及sharedMem。
- PSS(ProportionalSetSize):按照比例将内存的大小加到RSS中。
- USS(UniqueSetSize):进程独占的物理内存大小。
usedMem分为active&inactive
- active:表示这部分的内存正在被某个特定的进程使用,不太可能被收回。
- inactive:表示这部分内存是被分配到某个不在running状态的进程,有可能会被回收。
Linux会维护一个LRUList用来管理活动页和非活动页的回收。简单讲,越接近该List的末尾,该页面被回收的概率就越大,反之,越接近列首,则更不易被回收。linux内核会维护两类LRUList——activelist和inactivelist,刚访问过的页面放入activelist,长时间未访问的页面放入inactivelist,内核线程kswapd会定期将activelist中的页面移至 inactivelist中。
如果系统的inactive的内存过大,可以通过如下操作对其做回收。
sync;echo3>/proc/sys/vm/drop_caches
3.虚拟内存
现代x86系统,计算机能够使用的内存会大于其物理内存的上限,依靠的就是虚拟内存机制。Linux支持虚拟内存机制和实模式机制。
实模式下,计算机会直接申请物理内存,虚拟内存机制下,系统会把磁盘当成内存的扩展,已增加可使用的内存大小。并通过映射map的机制,来保存和物理内存的真实对应关系。
在磁盘和内存之间传送Page的活动叫做swapping或者页面调度(paging),被用作虚拟内存的磁盘分区称为swap。
可以通过在线添加swap的方式临时缓解内存不足的问题,但一般不能直接作在线减少swap的操作,很有可能导致进程的crash。具体swap配置方式见5.1swap相关配置。
4.OOM
1.WhatisOOM?
OutOfMemoryKiller是Linux的一种系统保护机制,在系统内存紧张时,kill掉某些进程防止系统卡死。系统通过打分机制,来实施对进程的杀死操作。默认机制是通过扫描所有进程的内存占用,cpu占用等因素,然后打分 (badness),分数越高,进程被kill的优先级就越高。
2.哪些行为会让系统对进程进行打分?
- 进程使用fork(2)调用,创建众多子进程时,会加分(+)
- 进程已经运行了很长时间,或者和使用了大量的CPU时间,会减分(-)
- 进程的nice值如果比较低,会加分(+)
- 进程如果是特权进程(privileged),会减分(-)
- 进程如果对硬件设备进行直接访问,会减分(-)
3.在哪儿可以看到进程的打分?
/proc/
4.手动调整分数
/proc//oom_adj该文件可以用于调整在oom发生时,哪些进程应该被kill,范围-16--+15,默认值为0,
特殊值-17:表示进程永远不会被kill。
5.我怎么知道系统有没有触发过OOM?
/var/log/messages、/var/log/syslog系统日志或者dmesg系统日志诊断工具等都能够找到
5.内存相关配置
5.1swap相关配置
通过调节系统参数,来告诉计算机使用swap分区的权重
1.简介 swappiness范围0-100,默认60 0:表示禁止使用swap 60:默认 100:疯狂使用swap 2.操作方法 #sysctlvm.swappiness=VALUE #sysctlvm.swappiness=20 或者 #echoVALUE>/proc/sys/vm/swappiness #echo30>/proc/sys/vm/swappiness
通过在线增加swap分区大小,临时控制内存泄露,内存不够用等异常。
1.需要root用户 2.创建存储文件 #ddif=/dev/zeroof=/home/swap2Gbs=1024count=2M 3.安全设置 #chownroot:root/home/swap2G #chmod0600/home/swap2G 4.创建liunx交换分区 #mkswap/home/swap2G 5.enable交换分区 #swapon/home/swap2G 6.更新fstab文件【注意:部分操作系统不需要】 #vim/etc/fstab /home/swap2Gnoneswapsw00 7.检查是否生效 #free-m 8.卸载swap分区 #swapoff/home/swap2G
5.2缓存相关
sync;echo3>/proc/sys/vm/drop_caches 0:不释放 1:释放页缓存 2:释放dentries和inodes 3:释放所有缓存
5.3OOM相关
- vm.panic_on_oom
- 是否在触发oom机制时触发kernelpanic。0表示关闭(推荐),1表示打开。kernelpanic是指计算机遇到了致命的错误,并且他不知道该怎么处理时的一种动作——可以类比windows的蓝屏。我们当然不希望每次计算机在oom时就直接蓝屏。推荐设置为0
- vm.overcommit_kbytes:
- 用于限制进程能够申请的最大内存,0表示不设置,如果设置其他数值,比如400,则进程能够申请到的最大内存为swap+400kBytes
- vm.overcommit_ratio:
- 定义了进程可以使用的最大内存(百分比模式),默认为50。表示配置50之后,进程不允许申请超过swap+50%*物理内存总量以上的内存
- vm.oom_kill_allocating_task(Linux2.6.24+支持)
- 这在内存不足的情况下启用或禁用杀死OOM触发任务。0表示禁用(默认),1表示启用。可以理解为oom机制的开关,默认为禁用——表示要让oom触发器正常执行。
- 其他有兴趣的话,可以自行manproc
到此这篇关于Linux系统诊断之内存基础深入详解的文章就介绍到这了,更多相关Linux系统诊断之内存基础内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。