这个进程的虚拟内存如何大于物理内存+交换?
How can this process' virtual memory be bigger than Physical memory + Swap?
据我了解,在此示例中,docker
的守护进程已从 OS 请求 1114MB 内存,并为其分配了一段虚拟地址 space,但是直到进程实际需要它时才会使用物理内存。没关系。
但是,OS 怎么能说 "sure, here's your 1.1GB" 无法满足该请求呢? malloc()
(或 docker
使用的任何东西)不应该立即失败吗?
如果它实际上是 "overselling" 内存 space,那么 malloc()
的 return 值有什么意义?
没有理性的 OS 会允许您在没有页面 space 备份的情况下分配虚拟内存。可悲的是,有 OS 是不合理的(或具有启用这种非合理行为的系统参数)。您的 OS 可能允许您的 malloc 调用成功地将页面映射到内存,然后在您尝试访问内存时失败。它使调试成为一场噩梦。某些系统将此称为 "overcommitment." 请注意,此术语在 OS 术语中通常用于完全不同的目的。
正如@user3344003 所说,发生这种情况是因为 Linux,默认情况下(至少在我的情况下)过度使用内存:
http://engineering.pivotal.io/post/virtual_memory_settings_in_linux_-_the_problem_with_overcommit/
/proc/sys/vm/overcommit_memory
This switch knows 3 different settings:
0: The Linux kernel is free to overcommit memory (this is the default), a heuristic algorithm is applied to figure out if enough memory is available.
1: The Linux kernel will always overcommit memory, and never check if
enough memory is available. This increases the risk of out-of-memory
situations, but also improves memory-intensive workloads.
2: The Linux kernel will not overcommit memory, and only allocate as much memory as defined in overcommit_ratio.
Debian 上的默认值为 0。这意味着 malloc 不会失败,当机器无法在任何地方分配新页面时,内核的 OOM 杀手将介入。
进一步阅读
据我了解,在此示例中,docker
的守护进程已从 OS 请求 1114MB 内存,并为其分配了一段虚拟地址 space,但是直到进程实际需要它时才会使用物理内存。没关系。
但是,OS 怎么能说 "sure, here's your 1.1GB" 无法满足该请求呢? malloc()
(或 docker
使用的任何东西)不应该立即失败吗?
如果它实际上是 "overselling" 内存 space,那么 malloc()
的 return 值有什么意义?
没有理性的 OS 会允许您在没有页面 space 备份的情况下分配虚拟内存。可悲的是,有 OS 是不合理的(或具有启用这种非合理行为的系统参数)。您的 OS 可能允许您的 malloc 调用成功地将页面映射到内存,然后在您尝试访问内存时失败。它使调试成为一场噩梦。某些系统将此称为 "overcommitment." 请注意,此术语在 OS 术语中通常用于完全不同的目的。
正如@user3344003 所说,发生这种情况是因为 Linux,默认情况下(至少在我的情况下)过度使用内存:
http://engineering.pivotal.io/post/virtual_memory_settings_in_linux_-_the_problem_with_overcommit/
/proc/sys/vm/overcommit_memory
This switch knows 3 different settings:
0: The Linux kernel is free to overcommit memory (this is the default), a heuristic algorithm is applied to figure out if enough memory is available.
1: The Linux kernel will always overcommit memory, and never check if enough memory is available. This increases the risk of out-of-memory situations, but also improves memory-intensive workloads.
2: The Linux kernel will not overcommit memory, and only allocate as much memory as defined in overcommit_ratio.
Debian 上的默认值为 0。这意味着 malloc 不会失败,当机器无法在任何地方分配新页面时,内核的 OOM 杀手将介入。
进一步阅读