前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >操作系统原理:How Linux Works(三):Memory

操作系统原理:How Linux Works(三):Memory

原创
作者头像
RiboseYim
发布2018-01-12 22:27:49
2K0
发布2018-01-12 22:27:49
举报
文章被收录于专栏:睿哥杂货铺睿哥杂货铺
  • 经典内存异常:Out of Memory (OOM) Killer
  • 我的内存利用率为什么特别高?
  • Linux 内存的分类
  • Linux 内存的计算
  • Linux 进程的内存
  • Linux 应用内存分配

内存是计算机中与CPU进行沟通的桥梁,用于暂时存放CPU中的运算数据。Linux 内核的内存管理机制设计得非常精妙,对于 Linux 内核的性能有很大影响。在早期的 Unix 系统中,fork 启动新进程时,由于从父进程往子进程复制内存信息需要消耗一定的时间,因此启动多个进程时存在性能瓶颈。现在的 Linux 内核则通过“写时复制(copy-on-write)”等机制提高了创建进程的效率;也正是因为这个原因,关于 Linux 内存分配、计算、空闲判断有一些特别的地方需要注意。

内存异常: Out of Memory (OOM) Killer

最常见的内存管理异常就是 Out of memory 问题。通常是因为某个应用程序大量请求内存导致系统内存不足造成的,触发 Linux 内核里的 Out of Memory (OOM) killer,OOM killer 会杀掉某个进程以释放内存留给系统内核用。它实际上算一种保护机制,不致于让系统立刻崩溃,有些壮士断腕的意思。

内核检测到内存利用不足,就会选择并杀掉某个“bad”进程。如何判断和选择一个 “bad” 进程呢? 算法和思路其实非常朴素(简单):最 bad 的那个进程就是那个占用内存最多的进程。内核源代码详见 linux/mm/oom_kill.c 。

我的内存利用率为什么特别高?
  • 内存利用率(概括): free
  • 内存利用率(进程): top

实际情况是系统运行正常、不存在内存不足的情况,对于应用程序来说,“真实的” 内存空闲率是 73.4% 。如果要回答这个问题,必须了解内存管理的基础 —— 物理地址空间和逻辑地址空间。

按照用途,内存可以划分为“内核内存”和“用户内存”(用户进程及磁盘高速缓存),包括内核本身在内,程序在访问物理内存时,并不直接指定物理地址,而是指定逻辑地址。CPU 上搭载的硬件 MMU (Memory Management Unit)会参照物理-逻辑地址对应关系表实现对映射后物理地址上的数据访问。x86 架构中逻辑地址空间限制在 4GB ,在 x86_64 架构中则没有此限制。

Linux 内存的分类

用户内存的分类有两组概念比较重要:匿名内存和File-backed内存;Active 和 Inactive 。它们的区别如下:

  • 匿名内存:用来存储用户进程计算过程中间的数据,与物理磁盘的文件没有关系;
  • File-backed内存:用作磁盘高速缓存,其物理内存与物理磁盘上的文件是对应的;
  • Active : 刚被使用过的数据的内存空间;
  • Inactive : 包含有长时间未被使用过的数据的内存空间;

Shmem(shared memory)指的就是 tmpfs 所使用的内存 —— 一个基于内存的文件系统,提供可以接近零延迟的快速存储区域。Linux 可以将空闲内存用于缓存,并且在应用程序需要的时候收回。“­/+ buffers/cache”: 提供了关于内存利用率更加准确的数值。buffers: buffer cache,用于块设备I/O ; cached: page cache, 用于文件系统。例如:

  • 内存利用率(详细):cat /proc/meminfo
Linux 内存的计算

各类内存的计算公式如下:

Shmem = 磁盘高速缓存(buffers/cached)- Filed-backed内存(file)

= 匿名内存(anon)- AnonPages

用户内存 = Active(file) + Inactive(file) + Active(anon) + Inactive(anon) + Unevictable

= buffers + cached + AnonPages

内核内存 = Memtotal - (MemFree + Active + Inactive + Unevictable)

Linux 进程的内存

执行“ps aux” 后输出的各进程的 RSS (resident set size), 表示进程占用内存的大小,单位是KB。 需要注意的是,RSS 值实际上是基于 pmap 命令,表示“该进程正在使用的物理内存的总和”。pmap 提供了进程的内存映射,也可以支持多个进程的内存状态显示(pmap pid1 pid2 pid3)。与 ldd 命令类似,pmap 命令可以查看到程序调用的路径。如果查看一个已经运行,但是又不知道程序路径的程序,使用pmap更快捷。

/proc/PID/status 支持的选项有:

  • VmData: data段大小
  • VmExe: text段大小
  • Vmlib: 共享库的使用量
  • VmRSS: 物理内存使用量
  • VmSwap: 交换空间的使用量
Linux 应用内存分配

类似 Java 之类的虚拟机应用程序可以设置内存参数,例如:

Xms128m JVM初始分配的堆内存

Xmx512m JVM最大允许分配的堆内存

XX:PermSize=64M JVM初始分配的非堆内存

XX:MaxPermSize=128M JVM最大允许分配的非堆内存

如果该应用需要较大的内存空间,可以调整为 -Xmx1024m、-Xmx2048m 以保障应用程序的运行性能,XX:MaxPermSize 设置过小会导致内存溢出,java.lang.OutOfMemoryError: PermGen space。但是 需要特别注意 的是:Xmx 绝对不能超过最大物理内存,或者说需要保留一定的剩余内存空间,否则将有可能导致其它进程因为没有可用内存而阻塞,甚至无法登陆机器 。

正如摔跤游戏一样,内存管理的法则就是让进程在 留有余地 的前提下搏杀。

扩展阅读:Linux 操作系统

推荐:电子书《Linux Perf Master》

发表在GitBook平台,欢迎订阅、下载、批评指正: https://www.gitbook.com/book/riboseyim/linux-perf-master/details

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 内存异常: Out of Memory (OOM) Killer
  • 我的内存利用率为什么特别高?
  • Linux 内存的分类
  • Linux 内存的计算
  • Linux 进程的内存
  • Linux 应用内存分配
  • 扩展阅读:Linux 操作系统
  • 推荐:电子书《Linux Perf Master》
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档