Linux系统诊断-内存基础

简介: 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 -mtotal       used       free     shared    buffers     cached
Mem:          1991       1909         81          4        155        836
-/+ buffers/cache:        917       1073
Swap:         1023          1       1022

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

  • used: 已使用的内存 used = total - free -buffers -cached
  • free: 未使用的内存 memFree & swapFree 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 其他内存概念

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,默认60
0: 表示禁止使用swap
60: 默认
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=2M
3. 安全设置
# chown root:root /home/swap2G
# chmod 0600 /home/swap2G
4. 创建liunx交换分区
# mkswap /home/swap2G
5. enable 交换分区
# swapon /home/swap2G
6. 更新fstab文件【注意: 部分操作系统不需要】
# vim /etc/fstab
/home/swap2G none swap sw 0 0
7. 检查是否生效
#free -m
8. 卸载swap分区
# swapoff /home/swap2G

5.2 缓存相关

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

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

6. 结语

如有纰漏欢迎指正。

作者:SRE团队技术小编-小凌

原文链接

本文为阿里云原创内容,未经允许不得转载

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/514254.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深度剖析:Redis 分布式锁到底安全吗?看完这篇文章彻底懂了!

作者 | Kaito 来源 | 水滴与银弹阅读本文大约需要 20 分钟。大家好&#xff0c;我是 Kaito。这篇文章我想和你聊一聊&#xff0c;关于 Redis 分布式锁的「安全性」问题。Redis 分布式锁的话题&#xff0c;很多文章已经写烂了&#xff0c;我为什么还要写这篇文章呢&#xff1f;因…

Spring Boot 微服务性能下降九成!使用 Arthas 定位根因

简介&#xff1a; 接收到公司业务部门的开发反馈&#xff0c;应用在升级公司内部框架后&#xff0c;UAT&#xff08;预生产&#xff09;环境接口性能压测不达标。 背景 接收到公司业务部门的开发反馈&#xff0c;应用在升级公司内部框架后&#xff0c;UAT&#xff08;预生产&a…

python计算最大回撤_Python做量化投资评价策略风险 如何计算最大回撤?

2021年FRM主要时间节点2020年12月第一阶段报名时间&#xff1a;2020/12/01 - 2021/01/31首次注册&#xff1a;$1000 USD / 非首次注册&#xff1a;$590 USD2021年02月第二阶段报名时间&#xff1a;2021/02/01 - 2021/03/31首次注册&#xff1a;$1200 USD / 非首次注册&#xff…

阿里研究员:线下环境为何不稳定?怎么破

简介&#xff1a; 为什么线下环境的不稳定是必然的&#xff1f;我们怎么办&#xff1f;怎么让它尽量稳定一点&#xff1f; 这篇文章想讲两件事&#xff1a; 为什么线下环境[1]的不稳定是必然的&#xff1f;我们怎么办&#xff1f;怎么让它尽量稳定一点&#xff1f; 此外&#…

谁说技术男不浪漫!90后程序员2天做出猫咪情绪识别软件

整理 | 王晓曼出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;9月1日&#xff0c;一则关于#程序员2天做出猫咪情绪识别软件#的话题登上微博热搜&#xff0c;参与阅读的人数达到了8218.1万&#xff0c;讨论次数1.3万&#xff0c;引发网友们的热议。高手在民间&#…

闲鱼如何一招保证推荐流稳如泰山

简介&#xff1a; 风雨不动安如山 背景 近几年互联网的快速发展中&#xff0c;互联网业务发展越来越复杂&#xff0c;业务也被拆分得越来越细&#xff0c;阿里内部业务也发生着翻天覆地的变化&#xff0c;从最初的单体应用&#xff0c;到后面的分布式集群&#xff0c;再到最近…

echarts 树图样式美化_echarts2 tree树图自定义显示缩放大小、位置

<>看到网上关于echarts tree的资料有点少&#xff0c;做项目恰巧遇到这个&#xff0c;把一些获得分享给大家。从echarts、官方API中我们似乎只能定义根节点的位置&#xff0c;并不能指定树图整体的大小以及其整体在dom显示的位置&#xff0c;在tree生成过程中只是以根节点…

电商直播平台如何借助容器与中间件实现研发效率提升100%?

简介&#xff1a; 经过实际场景验证及用户的综合评估&#xff0c;电商直播平台借助全面的云原生容器化能力和中间件产品能力&#xff0c;大幅提升开发部署运维效率达50%~100%&#xff0c;极大地提升了用户体验&#xff0c;为业务持续发展打下了坚实的基础。 前言 直播带货是近…

在游戏运营行业,Serverless 如何解决数据采集分析痛点?

简介&#xff1a; 众所周知&#xff0c;游戏行业在当今的互联网行业中算是一棵常青树。在疫情之前的 2019 年&#xff0c;中国游戏市场营收规模约 2884.8 亿元&#xff0c;同比增长 17.1%。2020 年因为疫情&#xff0c;游戏行业更是突飞猛进。玩游戏本就是中国网民最普遍的娱乐…

字节大战腾讯元宇宙;Docker 自己定制镜像;VMware 云桌面助力秦皇岛市第一医院;微软开源 Cloud Katana;...

NEWS本周新闻回顾字节大战腾讯元宇宙&#xff1a;布局社交产品Pixsoul&#xff0c;上线游戏“重启世界”字节投资的代码乾坤&#xff0c;已于近日正式上线了元宇宙游戏《重启世界》。就在两个月前&#xff0c;被称为“元宇宙第一股”的Roblox登陆国内&#xff0c;由腾讯改名为《…

standard python venv module_python 在venv中报错 ModuleNotFoundError: No module named 'MySQLdb'

环境Win7&#xff0c;Python 3.6.5,情况脚本中有import MySQLdb 直接执行可以执行&#xff0c;但是在创建的venv 中执行&#xff0c;执行失败提示ModuleNotFoundError: No module named MySQLdb。运行pip install MySQLdb 报错提示&#xff1a;(prod) D:\mysite\crawler>pyt…

从 RxJS 到 Flink:如何处理数据流?

简介&#xff1a; 前端开发的本质是什么&#xff1f;响应式编程相对于 MVVM 或者 Redux 有什么优点&#xff1f;响应式编程的思想是否可以应用到后端开发中&#xff1f;本文以一个新闻网站为例&#xff0c;阐述在前端开发中如何使用响应式编程思想&#xff1b;再以计算电商平台…

Spring RSocket:基于服务注册发现的 RSocket 负载均衡

简介&#xff1a; RSocket 作为通讯协议的后起之秀&#xff0c;核心是二进制异步化消息通讯&#xff0c;是否也能和 Spring Cloud 技术栈结合&#xff0c;实现服务注册发现、客户端负载均衡&#xff0c;从而更高效地实现面向服务的架构&#xff1f;这篇文章我们就讨论一下 Spri…

双非院校计算机系毕业的学生能进大厂吗?

谈到大厂&#xff0c;我们常常会主动匹配与之对应的高学历。其实不论是大厂还是小公司&#xff0c;都是会筛简历的&#xff0c;这个毋庸置疑。从大厂招聘的结果上看&#xff0c;高学历人才的数量占据大头&#xff0c;而那些成功进入BAT、网易等大厂的专科生、二本三本学生&…

python如何提高程序可读性_提高Python的可读性?

我最近一直很喜欢Python编程.我来自对C语言编码的强烈热爱的背景,其中一切都可能比它应该更复杂(但至少把头发放在胸前).因此,从C转换到Python以获得不需要大量速度的更复杂的事情,这对于编写项目来说更是一种福音.然而,就肉眼可以看到的来自括号和圆括号和结构的土地,我遇到了…

Python - 深夜数据结构与算法之 Heap Binary Heap

目录 一.引言 二.堆与二叉堆介绍 1.Heap 堆 2.Binary Heap 二叉堆 3.HeapifyUp 添加节点 4.HeapifyDown 删除节点 5.Heap 时间复杂度 6.Insert & Delete 代码实现 三.经典算法实战 1.Smallest-K [M14] 2.Sliding-Window-Max [239] 3.Ugly-Number [264] 4.Top-…

如何 0 改造,让单体/微服务应用成为 Serverless Application

简介&#xff1a; 随着 2013 年以 Docker 为代表的容器技术、CNCF 基金会以及 K8s 的发展等&#xff0c;云原生开始被广大开发者所熟知。云原生时代之前还有两个阶段&#xff1a;一是自建 IDC 机房&#xff0c;二是简单地把原有的应用搬迁到云上。自建 IDC 机房很难获得高可用、…

一文了解阿里一站式图计算平台GraphScope

简介&#xff1a; 随着大数据的爆发&#xff0c;图数据的应用规模不断增长&#xff0c;现有的图计算系统仍然存在一定的局限。阿里巴巴拥有全球最大的商品知识图谱&#xff0c;在丰富的图场景和真实应用的驱动下&#xff0c;阿里巴巴达摩院智能计算实验室研发并开源了全球首个一…

c++如何禁用指定的键盘布局_Karabiner Elements for Mac 键盘键位自定义改键工具

文章来源于&#xff1a;风云社区Karabiner Elements for Mac 12.5Karabiner Elements&#xff08;早期是Karabiner&#xff0c;更早是KeyRemap4MacBook&#xff09;是功能强大且稳定的macOS键盘定制器。上【风云社区】&#xff0c;搜索软件名字&#xff0c;即可查看下载特征&am…

Docker Desktop 向大公司宣告收费,网友大呼:是时候弃用了!

作者 | 苏宓 出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09; 在容器引擎 Docker 诞生的 8 年间&#xff0c;其与开源的容器编排 Kubernetes 共同推动容器技术在云计算领域的应用&#xff0c;也让自身在全球范围内受到了广泛的关注。可以说&#xff0c;做过云计算开…