RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1060671
Accepted
Andrej Levkovitch
Andrej Levkovitch
Asked:2020-12-19 17:40:09 +0000 UTC2020-12-19 17:40:09 +0000 UTC 2020-12-19 17:40:09 +0000 UTC

进程虚拟内存使用情况

  • 772

该top命令的输出显示一列Virt- 虚拟内存消耗,但我不太明白虚拟内存是什么类型,为什么它的数量超过了实际消耗的 RAM 数量?Tobish,我有一个应用程序(微服务),它在运行时会消耗:

  • 2.4G 内存
  • 5.4G GPU显存(cuda)
  • 14.1G虚拟内存

同时在主机上:

  • 6G内存
  • 8G 显存
  • 21G磁盘存储
  • 没有交换

实际上:这个数字在 14.1G 中是什么意思?为什么它是最大数量的特工(特别是考虑到它swap失踪了)?

linux
  • 2 2 个回答
  • 10 Views

2 个回答

  • Voted
  1. Best Answer
    Fat-Zer
    2020-12-20T03:37:54Z2020-12-20T03:37:54Z

    原则上什么是“虚拟内存”以及为什么需要它,在Wikipedia中有适当的描述,在 Tanenbaum 的“计算机体系结构”中描述得更好(在 Google 上很容易找到共享软件版本)。所以我允许自己跳过严格的定义,我将尝试“在手指上”解释它。

    对于内存的每个请求,处理器使用特殊表¹(取决于系统并由操作系统管理)将虚拟地址( VA ) 转换为物理地址。每个进程都有自己的此类表,并且虚拟地址空间( AP ) 的大小通常比计算机上的实际内存大得多,因此并非所有 VA 在任何给定时间都在 RAM 中具有相应的地址。此外,可以将完全不同的实体连接到进程 AP:

    • 映射到物理内存的实际页面。
    • 请求但未使用的内存页。
    • 内存页刷新到交换区。
    • 程序和库的静态数据和代码。
    • 普通的内存映射文件(请参阅 参考资料mmap)。
    • 设备内存(对于 nix 系统,这些实际上是内存映射的设备文件)。

    因此,当处理器检测到对当前不在 RAM 中的地址进行了访问时,就会发生页面错误(page fault),然后控制权从进程转移到 OS 内核。然后操作系统内核确定请求的地址指的是什么:

    • 如果它是一个空的、以前未使用的页面,则内核分配一个新页面。
    • 如果页面处于交换状态,则内核将其从磁盘加载到内存中。
    • 如果它是内存映射文件,则内核将文件读入磁盘缓存。
    • 如果它是设备文件的映射内存的一部分,那么它会被外包给它的驱动程序。
    • 如果内存不属于任何已知映射,则向进程发送信号SIGSEGV。

    在相应的页面加载到 RAM 后,控制从分页处理程序返回,处理器将尝试执行它之前偶然发现的相同指令。

    为什么它的数量超过了实际消耗的 RAM 数量?

    这实际上是设计使然,但您仍然可以注意到关键特性:

    • 当进程请求内存时,在访问特定内存页之前不会分配物理内存。那些。过程可以做

      char *foo = malloc(1<<30);
      

      这VSZ将增加一个千兆字节,但RSS在填充之前不会改变:

      memset(foo, 0, 1<<30);
      
    • 虚拟内存,除了“程序内存”,还包括各种内存映射文件。

    • 一些库和程序做这些事情之一是完全正常的,所以VSZ ps'a 或 ' a 列Virt htop中的大值是可以的。

    ¹ 为清楚起见,在 linux 中,与大多数架构上的大多数现代操作系统一样,使用了分页内存。此外,我们将只谈论她。

    • 2
  2. Evgeniy Shubin
    2020-12-20T01:32:02Z2020-12-20T01:32:02Z

    首先,分配大量虚拟内存是完全正常的行为,并且取决于应用程序的编写方式以及它如何使用这些内存。

    Linux 中虚拟内存的分配由一个名为vm.overcommit_memory(您可以使用命令查看当前值sysctl vm.overcommit_memory)的策略来调节,并且可以激活 3 个工作场景之一:

    0- 内核启发式控制的虚拟内存分配策略,可以分配比 RAM+swap 更多的虚拟内存(但不是任意数量)。此策略通常默认设置。但它有一个缺点:当物理内存不足时,可以使用 OOM_KILLED 标志终止认为正在访问自己的合法地址空间的进程。

    1- 内核不跟踪进程请求的地址空间量的策略,并允许分配与进程请求一样多的地址空间。它对于可以为自己分配数 TB 虚拟内存的各种 java 程序很有用。与 OOM_KILLED 相关的缺点也在这里。

    2- 可以控制虚拟内存大小的策略。vm.overcommit_ratio在这种情况下,通过根据公式调整核心来调节体积:

    CommitLimit = (total_RAM - total_huge_TLB) * overcommit_ratio / 100 + total_swap

    那些。例如,在您的情况下,安装时vm.overcommit_ratio = 50 ,如果您不使用大页面,则分配的最大虚拟内存量可以是:6Gb * 50 / 100 + 0 = 3Gb

    PS 可以看到当前huge_pages的数量grep HugePages_Total /proc/meminfo

    • 0

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    根据浏览器窗口的大小调整背景图案的大小

    • 2 个回答
  • Marko Smith

    理解for循环的执行逻辑

    • 1 个回答
  • Marko Smith

    复制动态数组时出错(C++)

    • 1 个回答
  • Marko Smith

    Or and If,elif,else 构造[重复]

    • 1 个回答
  • Marko Smith

    如何构建支持 x64 的 APK

    • 1 个回答
  • Marko Smith

    如何使按钮的输入宽度?

    • 2 个回答
  • Marko Smith

    如何显示对象变量的名称?

    • 3 个回答
  • Marko Smith

    如何循环一个函数?

    • 1 个回答
  • Marko Smith

    LOWORD 宏有什么作用?

    • 2 个回答
  • Marko Smith

    从字符串的开头删除直到并包括一个字符

    • 2 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5