Linux的free命令与OOM的简单总结
简介
查看操作系统配置最关键的几个命令是
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程序调试命令addr2line之入门简单介绍(本文先不聊gdb调试)
addr2line有什么作用呢? 可别小瞧它, 它能够定位到代码出错的位置. 以下, 我们来看看这个简单的代码: #include <stdio.h> int main() { int * ...
- Linux下chkconfig命令详解 这个简单明了啊
chkconfig命令主要用来更新(启动或停止)和查询系统服务的运行级信息.谨记chkconfig不是立即自动禁止或激活一个服务,它只是简单的改变了符号连接. 使用语法:chkconfig [--ad ...
- [Linux] 关于 history 命令的简单使用
1. 如果不想记录当前 会话操作的命令的话 可以使用命令 set +o history 但是这个命令有一个坏处, 他自己被记住了... 2. 还有一个办法 就是 在退出登录之前执行命令 history ...
- (转)Linux 系统设置 : dmesg 命令详解
原文:https://blog.csdn.net/yexiangCSDN/article/details/80683246 https://www.cnblogs.com/duanxz/p/34770 ...
- Linux下dmesg命令处理故障和收集系统信息的7种用法
目录: <syslog之一:Linux syslog日志系统详解> <syslog之二:syslog协议及rsyslog服务全解析> <syslog之三:建立Window ...
- Linux下history命令用法
如果你经常使用 Linux 命令行,那么使用 history(历史)命令可以有效地提升你的效率.本文将通过实例的方式向你介绍 history 命令的 15 个用法. 使用 HISTTIMEFORMAT ...
- 例解 Linux 下 Make 命令
Linux 下 make 命令是系统管理员和程序员用的最频繁的命令之一.管理员用它通过命令行来编译和安装很多开源的工具,程序员用它来管理他们大型复杂的项目编译问题.本文我们将用一些实例来讨论 make ...
- Linux下who命令之C语言实现
Linux下who命令之C语言实现 Step1:前期准备 首先要有一个清楚的认识:linux中一切皆文件 实现who命令,who命令也是Linux中的一个文件,那我们怎么找到它呢?我们可以" ...
- Linux下rz命令使用的实例详解
Linux中rz命令和sz命令都可用于文件传输,而rz命令主要用于文件的上传,下面将通过几个实例来给大家详细介绍下Linux下rz命令的用法,一起来学习下吧. rz命令可以批量上传文件,当然也可上传单 ...
- linux下tar命令详解
linux下tar命令详解 tar是Linux环境下最常用的备份工具之一.tar(tap archive)原意为操作磁带文件,但基于Linux的文件操作机制,同样也可适用于普通的磁盘文件.ta ...
随机推荐
- GaussDB(for MySQL)如何在存储架构设计上做到高可靠、高可用
摘要: GaussDB(for MySQL)通过ND算子下推解决存储节点和计算节点之间的传输速度,减少网络开销这个难题. 数据库作为高效稳定处理海量数据交易/分析的坚强数据底座,底层架构设计的重要性不 ...
- 开发的必杀技:Git 的分支管理
摘要:作为一名码农,Git的使用就像家常便饭,时时刻刻都要用到,那么Git分支管理也是必须要掌握的. Git 分支管理 几乎每一种版本控制系统都以某种形式支持分支.使用分支意味着你可以从开发主线上分离 ...
- 万字保姆级长文——Linkedin元数据管理平台Datahub离线安装指南
元数据管理平台Datahub最近的热度越来越高.已经更新到了0.8.40的版本,来咨询我的小伙伴也越来越多,特别是安装过程有很多问题. 考虑到有些企业部分数据服务是部署在内网的,那么离线安装D ...
- maven中引入CDH依赖包,Cannot resolve org.apache.hadoop:hadoop-hdfs:3.0.0-cdh6.3.2
POM文件加入仓库 cloudera https://repository.cloudera.com/artifactory/cloudera-repos/ 修改MAVEN配置文件 nexus-ali ...
- 火山引擎DataTester智能发布:助力产品降低功能迭代风险
更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 对企业而言,应用大规模AB实验,可以帮助企业提高决策效率.降低试错成本,而近期火山引擎AB测试 DataTes ...
- Kubernetes(K8S) 安装 Metrics-Server kubectl top (metrics-server) node NotFound
kubectl top (metrics-server) node NotFound components.yaml 网上的各种方法都有问题,找到了一个完整版的 yaml apiVersion: v1 ...
- SpringBoot yml 小格子 变 小叶子
SpringBoot yml 小格子 变 小叶子 一般添加十多个模块后会出现这样的情况,正常情况下,看POM 文件里的 spring 引用是否异常 一般把 idea 关了再打开试试,有几次我是关了再开 ...
- 股票数据爬虫进阶:免费、开源的股票爬虫Python库,实测真香
更多精彩内容,欢迎关注公众号:数量技术宅,也可添加技术宅个人微信号:sljsz01,与我交流. 免费.开源的股票爬虫Python库:Easyquotation 我们在此前的文章中,向大家分享了如何用P ...
- async await 异步下载 异步代码加锁 lock 异步缓存
async await 异步下载 异步代码加锁 lock 异步缓存 FTP异步下载代码: /// <summary> /// 异步下载文件 /// </summary> /// ...
- VScode 中 Code Runner 插件乱码问题
安装好,Code Runner 插件,可以很方便的运行多种语言的文本,但是提示和输出经常会报错 进入 File - > Preference -> setting, 然后在输入框搜索 se ...