Linux的free命令与OOM的简单总结

linux,free,命令,oom,简单,总结 · 浏览次数 : 498

小编点评

**lscpu 和 free 的疑惑点** lscpu 显示 CPU 信息,而 free 显示内存使用情况。 * free 的 free 值可能很小,因为当系统分配内存给进程时,虚拟内存可能处于活动状态,但这些虚拟内存被换回物理内存中。 * free -m 可以简单的以 MBytes 为单位展示系统的内存使用情况,但它可能不准确,因为 free 会考虑虚拟内存。 **vm.overcommit_memory 参数** `vm.overcommit_memory` 参数控制内核如何处理内存不足时对进程的处理。以下是一些值: * 0:表示内核将检查是否有足够的可用内存供应用进程使用;如果有足够的可用内存,内存申请允许;否则,内存申请失败,并把错误返回给应用进程。 * 1:表示内核允许分配所有的物理内存,而不管当前的内存状态如何。 * 2:表示内核允许分配超过所有物理内存和交换空间总和的内存。 **vm.swappiness 参数** `vm.swappiness` 参数控制内核如何使用 swap 文件来满足内存需求。以下是一些值: * 0:表示最大限度使用物理内存,然后使用swapvm.swappiness=100:表示积极的使用swap分区。 * 60:默认值OOM的产生因为linux支持可以overcommit所以会导致应用服务器生产的内存超过总数。系统为了保证稳定性,不得已就会杀掉部分内存大的程序就会产生OOM查看的方法:dmesg |grep -i oom如果有 很明显就可以看到。 **其他参数** 除了 `vm.overcommit_memory` 和 `vm.swappiness` 之外,还有其他参数可以用于控制内存管理,例如 `vm.dirty_ratio`、`vm.dirty_background_ratio`、`vm.dirty_writeback_centisecs`、`vm.dirty_expire_centisecs`、`vm.drop_caches` 和 `vm.swappiness`。

正文

简介

查看操作系统配置最关键的几个命令是
lscpu 查看CPU信息
以及free 查看内存信息.
不过free信息有一个疑惑点 
他的 free的值可能很小. 会让搭建产生误解. 
这里简单说明一下.

free

free -m 
可以简单的以 MBytes 为单位展示系统的内存使用情况. 
free -m
              total        used        free      shared  buff/cache   available
Mem:          31867        9502        9110         241       13254       21670
Swap:         16127           0       16127

# Mem 指代是物理内存. Swap指代的是虚拟内存或者称之为在磁盘上通过换页出去的内存.
# 需要注意 Swap 与虚拟内存系统完全不一样. Swap里面的内存使用时会出现pageout的中断
# 使用Swap会导致严重的性能衰退. 访问延迟会从 120nm 升级到 10ms, 出现多个数量级的差距.

# total 全部安装的内存, 一般会比2的n次方小一点.有部分保留内存. 
# used  一般可以理解内 所有的程序commited 的内存数据量.
# free 就可以程序随后可以使用的量. 
# shared 共享的内存 
# buff/cache 是一个关键, 他一般指的 page cache,inodes缓存dentries缓存 三部分.
# available 是可以给空闲使用的内存数据量, 基本上等于free+buff/cache

清理buffer/cache

可以使用 sync &&  echo 3 >/proc/sys/vm/drop_caches 的方式进行buff/cache的清理
可以查看解释
To free pagecache:
* echo 1 > /proc/sys/vm/drop_caches
To free dentries and inodes:
* echo 2 > /proc/sys/vm/drop_caches
To free pagecache, dentries and inodes:
* echo 3 > /proc/sys/vm/drop_caches
## pagecache 可以理解为一开始说的 读缓存和写buffer. linux最新系统已经将两者进行了合并. 
## inodes 指的是file 文件的缓存信息
## dentries 指的是文件系统目录的缓存信息. 

注意为了防止数据丢失 最好是先使用 sync 执行一下再进行相应的 echo 操作. 

内存over-commited的处理

Linux允许内存提交的数量比实际内存数量要高
有时候机器内存比较小,启动服务报错时可以临时处理一下.
但是不建议生产如此出现, 容易导致OOM
修改方法: 
1. 永久生效: 
   vi /etc/sysctl.conf ,改vm.overcommit_memory=1,然后sysctl -p 生效
2. 临时处理:
   sysctl  vm.overcommit_memory=1 或
   sysctl  -w  vm.overcommit_memory=1              
   echo 1 > /proc/sys/vm/overcommit_memory         

参数的含义为:
0: 表示内核将检查是否有足够的可用内存供应用进程使用;如果有足够的可用内存,
    内存申请允许;否则,内存申请失败,并把错误返回给应用进程。
1: 表示内核允许分配所有的物理内存,而不管当前的内存状态如何。
2: 表示内核允许分配超过所有物理内存和交换空间总和的内存。              

减少缓存的使用

buff/cache 其实对系统的性能能够产生正向的效果.
他将缓慢磁盘里的数据暂存到内存中, 可以极大的提高系统的性能.
尤其是小白开发开发的程序写入大量日志时,能够减少IO导致的开销,提高系统性能.

但是他使用的过多, 也对java程序进行heap区域malloc产生异常. 
所以也需要进行优化与调整. 

可以在/etc/sysctl.conf中添加如何内容,禁止使用缓存
vm.dirty_ratio = 1
vm.dirty_background_ratio=1
vm.dirty_writeback_centisecs=2
vm.dirty_expire_centisecs=3
vm.drop_caches=3
vm.swappiness =100
vm.vfs_cache_pressure=163
vm.overcommit_memory=2
vm.lowmem_reserve_ratio=32 32 8
kern.maxvnodes=3

Study From https://blog.51cto.com/bronte/1220005
# 注意可以swapoff -a 关闭虚拟内存, 可以避免使用swap造成性能下降
# 但是会极大的提高OOM产生的概率.
vm.swappiness=0:表示最大限度使用物理内存,然后使用swap
vm.swappiness=100:表示积极的使用swap分区。
vm.swappiness=60:默认值

OOM的产生

因为linux支持可以overcommit 所以会导致应用服务器生产的内存超过总数.
系统为了保证稳定性,不得已就会杀掉部分内存大的程序就会产生OOM
查看的方法:
dmesg |grep -i oom
如果有 很明显就可以看到. 

Linux对大部分申请内存的请求都回复"yes",以便能跑更多更大的程序。
因为申请内存后,并不会马上使用内存。这种技术叫做 Overcommit。
当linux发现内存不足时,会发生OOM killer(OOM=out-of-memory)。
它会选择杀死一些进程(用户态进程,不是内核线程),以便释放内存。
 
当oom-killer发生时,linux会选择杀死哪些进程?选择进程的函数是oom_badness函数
(在mm/oom_kill.c中),该 函数会计算每个进程的点数(0~1000)。
点数越高,这个进程越有可能被杀死。
每个进程的点数跟oom_score_adj有关,而且 oom_score_adj可以被设置(-1000最低,1000最高)。
Study From https://blog.csdn.net/qq_42303254/article/details/88390730

如何防止OOM

如果用户将该进程的 oom_score_adj 设定成 -1000,表示禁止OOM killer 杀死该进程
注意不能随便这样设置, 会导致自己的服务器核心服务挂起,导致宕机.
不过你的服务绝对重要, 开发又不是很差, 你可以尝试一下. 

修改方法为:
echo -1000 > /proc/$pid/oom_score_adj

注意这个数值是可以修改的 -1000 表示最重要. 他会影响. oom_score的数值.
具体可以参考:
https://www.jianshu.com/p/bbaeff371019

与Linux的free命令与OOM的简单总结相似的内容:

Linux的free命令与OOM的简单总结

简介 查看操作系统配置最关键的几个命令是 lscpu 查看CPU信息 以及free 查看内存信息. 不过free信息有一个疑惑点 他的 free的值可能很小. 会让搭建产生误解. 这里简单说明一下. free free -m 可以简单的以 MBytes 为单位展示系统的内存使用情况. free -m

[转帖]Linux系统中的Page cache和Buffer cache

Free命令显示内存 首先,我们来了解下内存的使用情况: Mem:表示物理内存统计 total:表示物理内存总量(total = used + free) used:表示总计分配给缓存(包含buffers 与cache )使用的数量,但其中可能部分缓存并未实际使用。 free:未被分配的内存。 sh

Linux的访问权限详解

题目 解读访问权限 rw-r--r--分别代表什么东西 r:代表可读 w:可写 e:可执行 方便起见进行拆分 rw- 代表文件所属用户的权限 r-- 代表同组用户的权限 r-- 代表其他用户的权限 同时我们可以用2进制来表示: r:4 w:2 e:1 也即是3位二进制数则可以表示 chmod 命令

[转帖]linux系统目录结构介绍

linux的目录结构 Linux系统各个目录的作用 /: 根目录。有且只有一个根目录。所有的东西都是从根目录开始。举个例子:当你在终端里输入“/home”,你其实是在告诉服务器,先从/(根目录)开始,再进入到home目录。 /root: 这是系统管理员(root user)的目录。对于系统来说,系统

彻底理解Linux的DISPLAY变量的作用

背景 最近遇到个两年前遇到的问题,使用virt-manager提示(virt-manager:873): Gtk-WARNING **: 14:53:28.147: cannot open display: :1,当时专门运维的同事帮忙临时调了下DISPLAY变量,好像是将:1改成了SSH用户本地I

适用于linux的bilibiliB站直播间弹幕爬虫脚本

适用于linux的bilibiliB站直播间弹幕爬虫脚本,命令行运行之,输入到命令行,部分内容参考自网络,代码底部可见原始代码出处 BUFF:然而,经测试,每次爬只能读取10条弹幕记录,这就使得在(sleeptime*10)(每秒)<弹幕新增量(每秒)时出现弹幕丢失的情况,此时需要调短sleepti

[转帖]Linux Shell 脚本的 10 个有用的“面试问题和解答”

http://blog.itpub.net/31545813/viewspace-2926667/ Linux 的浩瀚无垠,使人总能每次都提交与众不同的内容。这些内容不仅对他们的职业生涯很有用,同时也让他们增长知识。在此,我们就尝试这么去做,至于能取得多大的成功,就由我们的读者朋友们来判断吧。 在此

[转帖]linux 下 {}大括号的用法

我们平时使用Linux的时候经常遇到这样一个问题,举例有这样一种情况:执行命令 $ cp /etc/apt/sources.list /etc/apt/sources.list.bak 这里面有个问题,明明 /etc/apt/sources 这几个字都是一样的,为什么要打两遍?这样的还算短了,要是更

[转帖]linux的硬链接和软连接的区别

Linux中有两种链接文件: 1)软链接(符号链接symbol),等同于Windows中快捷方式 ln -s 源文件名 符号链接文件名,源文件名和符号链接文件名是主从关系,源被删了,符号链接也就失效了 eg: ln -s src.c linker.c (linker.c就是src.c的一个符号链接文

[转帖]Linux的tmpfs和ramfs

tmpfs tmpfs是一种虚拟内存文件系统, 它的存储空间在VM里面,现在大多数操作系统都采用了虚拟内存管理机制, VM(Virtual Memory) 是由Linux内核里面的VM子系统管理. VM的大小由RM(Real Memory)和swap组成, RM就是物理内存, swap是通过硬盘虚拟