在 Ubuntu/Linux 中查找确切的物理内存使用情况
Find exact physical memory usage in Ubuntu/Linux
(我是 Linux 的新手)
假设我在 Ubuntu 机器上有 1300 MB 内存。 OS 和其他默认程序占用 300 MB 内存,1000 MB 可供我自己的应用程序免费使用。
我安装了我的应用程序,我可以将其配置为在应用程序启动时使用 700 MB 内存。
但是我无法验证它的实际内存使用情况。即使我禁用了交换 space.
“VIRT”值显示巨大值和“RES”,“ SHR", "%MEM" 显示非常更少的值。
很难找到实际的物理内存使用情况,类似于 Windows 中的“资源监视器”,它会说我的应用程序正在使用 700 MB 内存。
有什么方法可以找到 Ubuntu/Linux 中的实际物理内存吗?
TL;DR - 虚拟内存很复杂。
Linux 进程 当前 物理内存使用率的最佳度量是 RES
。
RES
值表示当前驻留在物理内存中的所有进程页面的总和。它包括常驻代码页和常驻数据页。它还包括当前驻留在 RAM 中的共享页面 (SHR
),尽管这些页面不能完全归因于 >>this<< 进程。
VIRT
值实际上是该进程所有名义分配页面的总和,它包括当前驻留在 RAM 中的页面、当前交换到磁盘的页面。
另见 的解释。
请注意,RES
为您提供(大致)瞬时 RAM 使用率。那就是你问的...
随着时间的推移,“实际”内存使用情况更加复杂,因为 OS 的虚拟内存子系统通常会根据需要换入换出页面。因此,例如,您的应用程序的某些页面最近可能未被访问,然后 OS 可能会将它们换出(交换 space)以释放 RAM 用于您的应用程序所需的其他页面。 .. 或其他东西。
VIRT
值实际上表示虚拟地址 space,是总(虚拟)内存使用量的一个很好的近似值。但是,这可能是一个高估:
进程地址 space 中的某些页面在多个进程之间共享。这包括只读代码段、vfork
和 exec
之间父子进程共享的页面,以及使用 mmap
.
创建的共享内存段
某些页面可能被设置为具有非法访问权限(例如,对于堆栈红色区域)并且可能不受 RAM 或交换设备页面的支持。
某些状态下地址 space 的某些页面可能尚未提交到 RAM 或磁盘...取决于虚拟内存系统的实现方式。 (考虑一个进程请求一个巨大的内存段并且既不读取也不写入的情况。虚拟内存实现可能不会分配 RAM 页面,直到第一次读取或写入页面。如果你使用 lazy swap reservation,交换页也不会被提交。但要注意,惰性交换保留可能会遇到麻烦。)
VIRT
也可能被低估,因为 OS 通常为所有页面保留交换 space ...无论它们当前是换入还是换出。因此,如果您将给定页面的 RAM 和交换版本计算为单独的存储单元,VIRT
通常会低估使用的总存储量。
最后,如果您的真正目标是限制您的应用程序最多使用
700 MB(虚拟地址 space),然后您可以使用 ulimit -v ...
来执行此操作。如果应用程序尝试请求超出其限制的内存,请求将失败。
(我是 Linux 的新手)
假设我在 Ubuntu 机器上有 1300 MB 内存。 OS 和其他默认程序占用 300 MB 内存,1000 MB 可供我自己的应用程序免费使用。
我安装了我的应用程序,我可以将其配置为在应用程序启动时使用 700 MB 内存。
但是我无法验证它的实际内存使用情况。即使我禁用了交换 space.
“VIRT”值显示巨大值和“RES”,“ SHR", "%MEM" 显示非常更少的值。
很难找到实际的物理内存使用情况,类似于 Windows 中的“资源监视器”,它会说我的应用程序正在使用 700 MB 内存。
有什么方法可以找到 Ubuntu/Linux 中的实际物理内存吗?
TL;DR - 虚拟内存很复杂。
Linux 进程 当前 物理内存使用率的最佳度量是 RES
。
RES
值表示当前驻留在物理内存中的所有进程页面的总和。它包括常驻代码页和常驻数据页。它还包括当前驻留在 RAM 中的共享页面 (SHR
),尽管这些页面不能完全归因于 >>this<< 进程。
VIRT
值实际上是该进程所有名义分配页面的总和,它包括当前驻留在 RAM 中的页面、当前交换到磁盘的页面。
另见
请注意,RES
为您提供(大致)瞬时 RAM 使用率。那就是你问的...
随着时间的推移,“实际”内存使用情况更加复杂,因为 OS 的虚拟内存子系统通常会根据需要换入换出页面。因此,例如,您的应用程序的某些页面最近可能未被访问,然后 OS 可能会将它们换出(交换 space)以释放 RAM 用于您的应用程序所需的其他页面。 .. 或其他东西。
VIRT
值实际上表示虚拟地址 space,是总(虚拟)内存使用量的一个很好的近似值。但是,这可能是一个高估:
进程地址 space 中的某些页面在多个进程之间共享。这包括只读代码段、
创建的共享内存段vfork
和exec
之间父子进程共享的页面,以及使用mmap
.某些页面可能被设置为具有非法访问权限(例如,对于堆栈红色区域)并且可能不受 RAM 或交换设备页面的支持。
某些状态下地址 space 的某些页面可能尚未提交到 RAM 或磁盘...取决于虚拟内存系统的实现方式。 (考虑一个进程请求一个巨大的内存段并且既不读取也不写入的情况。虚拟内存实现可能不会分配 RAM 页面,直到第一次读取或写入页面。如果你使用 lazy swap reservation,交换页也不会被提交。但要注意,惰性交换保留可能会遇到麻烦。)
VIRT
也可能被低估,因为 OS 通常为所有页面保留交换 space ...无论它们当前是换入还是换出。因此,如果您将给定页面的 RAM 和交换版本计算为单独的存储单元,VIRT
通常会低估使用的总存储量。
最后,如果您的真正目标是限制您的应用程序最多使用
700 MB(虚拟地址 space),然后您可以使用 ulimit -v ...
来执行此操作。如果应用程序尝试请求超出其限制的内存,请求将失败。