Free命令 - Linux系统诊断 - 内存基础

1 free

1.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 -cached free: 未使用的内存 memFreeswapFree 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 其他内存概念


RSSVSZPSSUSS


RSS(Resident Set Size):进程实际使用的物理内存大小,包括sharedMem。 VSZ(Virtual Memory Size):进程所有能够访问到的内存大小,包括因为缺页中断,被swap出去的内存大小,以及sharedMem。 PSS(Proportional Set Size):按照比例将内存的大小加到RSS中。 USS(Unique Set Size):进程独占的物理内存大小。

usedMem分为 activeinactive


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时就直接蓝屏。推荐设置为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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,053评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,527评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,779评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,685评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,699评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,609评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,989评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,654评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,890评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,634评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,716评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,394评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,976评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,950评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,191评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,849评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,458评论 2 342

推荐阅读更多精彩内容

  • 一、学习这个命令的背景 因为最近Gitlab服务器占用内存很多,也在下面的这篇博客里面写了怎么减少Gitlab占用...
    欧阳鹏阅读 805评论 0 1
  • linux下free命令详解 free 命令显示系统内存的使用情况,包括物理内存、交换内存(swap)和内核缓冲区...
    GoFighting_c2f1阅读 291评论 0 1
  • 1 内存寻址 1.1 物理地址、虚拟地址以及线性地址 物理地址: 物理内存的内存单元地址 虚拟地址: 程序员看到的...
    疯狂小王子阅读 2,787评论 3 21
  • 一、概述 1.1 内存指标概念 Item 全称 含义 等价 USSUnique Set Size物理内存进程独占的...
    tiger桂阅读 2,653评论 0 0
  • 今天感恩节哎,感谢一直在我身边的亲朋好友。感恩相遇!感恩不离不弃。 中午开了第一次的党会,身份的转变要...
    迷月闪星情阅读 10,548评论 0 11