【问题标题】:Linux memory overcommit detailsLinux 内存过量使用详情
【发布时间】:2013-10-09 12:11:57
【问题描述】:

我正在为嵌入式 Linux 开发软件,但我正在遭受系统挂起,因为 OOM Killer 不时出现。在超越之前,我想解决一些关于 Linux 内核如何分配动态内存的令人困惑的问题,假设 /proc/sys/vm/overcommit_memory 有 0 并且 /proc/sys/vm/min_free_kbytes 有 712,并且没有交换。

如果我编写这段代码,假设嵌入式 Linux 当前可用的物理内存为 5MB(5MB 的空闲内存并且没有可用的缓存或缓冲内存):

.....
#define MEGABYTE 1024*1024
.....
.....
void *ptr = NULL;
ptr = (void *) malloc(6*MEGABYTE); //Preserving 6MB
if (!prt) 
    exit(1);
memset(ptr, 1, MEGABYTE);
.....

我想知道当提交 memset 调用时,内核是否会尝试在物理内存空间中分配 ~6MB 或 ~1MB(或 min_free_kbytes 倍数)。

现在我的嵌入式设备中大约有 9MB,它有 32MB 的 RAM。我通过做检查它

# echo 3 > /proc/sys/vm/drop_caches 
# free
            total         used         free       shared      buffers
Mem:        23732        14184         9548            0          220
Swap:            0            0            0
Total:        23732        14184         9548

忘记最后一段 C 代码,我想知道当可用内存大约 >6MB 时是否可能出现 oom 杀手。 我想知道出现oom时系统是否内存不足,所以我想我有两个选择:

  • 查看可疑进程的 /proc/pid/status 中的 VmRSS 条目。

  • 设置 /proc/sys/vm/overcommit_memory = 2 和 /proc/sys/vm/overcommit_memory = 75 并查看是否有任何进程需要更多可用物理内存。

【问题讨论】:

  • 您的问题含糊不清,因为不清楚您所说的“分配”是什么意思。内核将保留 6MB,但它不会分配任何东西,因为进程可能永远不会访问内存。
  • 但是当 memset(ptr,1,MEGABYTE) 执行时,进程正在写入内存,不是吗?
  • 是的,然后操作系统必须实际分配一些。
  • 但是我的问题是分配 ~6MB 还是 ~1MB?
  • 它保留 6MB,然后分配其中的 1MB。

标签: memory-management out-of-memory embedded-linux low-memory


【解决方案1】:

我认为您可以阅读此document。 Is 为您提供了三个小型 C 程序,您可以使用它们来了解 /proc/sys/vm/overcommit_memory 的不同可能值会发生什么。

【讨论】:

    猜你喜欢
    • 2021-05-04
    • 1970-01-01
    • 2010-10-08
    • 2010-12-25
    • 2019-03-16
    • 2016-05-07
    • 2011-04-08
    • 1970-01-01
    相关资源
    最近更新 更多