【问题标题】:Find exact physical memory usage in Ubuntu/Linux在 Ubuntu/Linux 中查找准确的物理内存使用情况
【发布时间】:2020-07-05 03:09:43
【问题描述】:

(我是 Linux 新手)

假设我有 1300 MB 内存,在 Ubuntu 机器上。操作系统和其他默认程序消耗 300 MB 内存,而我自己的应用程序可以免费使用 1000 MB。

我安装了我的应用程序,我可以将其配置为在应用程序启动时使用 700 MB 内存。

但是我无法验证它的实际内存使用情况。即使我禁用了交换空间。

VIRT”值显示出巨大的价值和“RES”、“SHR”、“ %MEM" 显示出非常较少的价值

很难找到实际的物理内存使用情况,类似于 Windows 中的“资源监视器”,它会说我的应用程序正在使用 700 MB 内存。

有没有办法在 Ubuntu/Linux 中找到实际的物理内存?

【问题讨论】:

  • 大部分内存信息可以通过cat /proc/meminfo获得。把它和一粒盐一起吃。所有应用程序都使用“虚拟”内存,因此在任何给定时间点使用的“物理”RAM 量就是您所追求的衡量标准。虚拟内存管理比注释可以包含的要复杂得多,但即使在应用程序级别,也不是所有保留的内存都在使用中。 What does Virtual memory size in top mean? 是一个很好的起点。

标签: linux memory ram


【解决方案1】:

TL;DR - 虚拟内存很复杂。

Linux 进程当前物理内存使用情况的最佳衡量标准是RES

RES 值表示当前驻留在物理内存中的所有进程页面的总和。它包括常驻代码页和常驻数据页。它还包括当前驻留在 RAM 中的共享页面 (SHR),尽管这些页面不能完全归属于 >>this

VIRT 值实际上是所有名义上为进程分配的页面的总和,它包括当前驻留在 RAM 中的页面、当前交换到磁盘的页面。

请参阅https://stackoverflow.com/a/56351211/1184752 以获得其他解释。


请注意,RES 为您提供(大致)瞬时 RAM 使用量。这就是你问的...

随着时间的推移,“实际”内存使用会更加复杂,因为操作系统的虚拟内存子系统通常会根据需要将页面换入和换出。因此,例如,您的应用程序的某些页面最近可能没有被访问,然后操作系统可能会将它们换出(以交换空间)以释放 RAM 用于您的应用程序所需的其他页面......或其他东西。

VIRT 值实际上表示虚拟地址空间,是对总(虚拟)内存使用量的一个很好的近似值。但是,这可能是高估了:

  • 进程地址空间中的某些页面在多个进程之间共享。这包括只读代码段、vforkexec 之间的父进程和子进程共享的页面,以及使用mmap 创建的共享内存段。

  • 某些页面可能被设置为非法访问(例如,对于堆栈红色区域),并且可能不受 RAM 或交换设备页面的支持。

  • 某些状态下的地址空间的某些页面可能尚未提交到 RAM 或磁盘……取决于虚拟内存系统的实现方式。 (考虑一个进程请求一个巨大的内存段并且既不读取也不写入它的情况。虚拟内存实现可能不会分配 RAM 页面,直到第一次读取或写入页面。如果你使用 @ 987654322@,交换页也不会被提交。但要注意你可能会遇到延迟交换保留的麻烦。)

VIRT 也可能被低估,因为操作系统通常为所有页面保留交换空间......无论它们当前是换入还是换出。因此,如果您将给定页面的 RAM 和交换版本视为单独的存储单元,VIRT 通常会低估使用的总存储空间。


最后,如果您的真正目标是限制您的应用程序最多使用 700 MB(虚拟地址空间)然后您可以使用ulimit -v ... 来执行此操作。如果应用程序尝试请求超出其限制的内存,则请求失败。

【讨论】:

  • VIRT 很少能很好地衡量总内存使用情况。这包括整个保留的虚拟地址空间 - 这是一个很好的答案,来自 apaning 提到:stackoverflow.com/a/56351211/1184752
  • 这取决于你所说的记忆。如果您的意思是虚拟内存,那么这是一个很好的衡量标准。上下文是 OP 谈论他配置应用程序使用的“内存”,以及它实际使用的“物理内存”。鉴于非 root 用户无法控制进程的物理内存使用情况,我合理假设 OP 使用“内存”来表示“虚拟内存”。
  • 他们提到了“实际的物理内存使用”,这在几乎所有情况下都与 VIRT 非常不同。否则会让人很困惑。
  • 他们提到“将其配置为使用 700 MB 内存”,这必须是虚拟内存,因为无法配置物理 RAM 的使用。请阅读我的全部答案,不要挑选句子并断章取意。
  • 请注意,我已经将答案更改为 “VIRT 值是总(虚拟)内存使用量的最佳度量。”
猜你喜欢
  • 2010-12-12
  • 1970-01-01
  • 2014-04-11
  • 1970-01-01
  • 1970-01-01
  • 2017-06-17
  • 2012-12-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多