Linux 重启内存不足

jof*_*fox 5 linux out-of-memory

我有一台带有 Intel(R) Atom(TM) CPU D525 和 1 GB 内存的服务器。我注意到服务器大约每 7 天就会关闭并自动重启一次。

我查看了内存使用情况,发现当内存使用率达到90%时,内核会重新启动。当我检查内核登录/var/log/messages文件时,我没有发现任何有关内核关闭的信息,只是一条有关内核启动的消息。我检查了文件/proc/sys/vm/min_free_kbytes,值为“3765”。


我猜当可用内存非常低,但没有达到系统开始回收内存的数量时。然后内核不能做任何事情,所以它然后重新启动。

你能给我一些见解吗?

Tho*_*man 18

在一些按需分页虚拟内存系统上,操作系统拒绝分配匿名页面(即包含没有文件系统源的数据的页面,例如运行时数据、程序堆栈等),除非有足够的交换空间来换出页面以便释放物理内存。这种严格核算的优点是保证每个进程都可以访问它们分配的尽可能多的虚拟内存,但这也意味着可用的虚拟内存量基本上受交换空间大小的限制。

在实践中,程序倾向于分配比它们使用的更多的内存。例如,Java 虚拟机在启动时分配了大量虚拟内存,但不会立即使用它。Linux 内核中的内存记帐试图通过跟踪进程实际使用的内存量来弥补这一点,并过量使用虚拟内存量。换句话说,内核分配的虚拟内存量可以超过系统上物理内存和交换空间的总和。虽然这样可以更好地利用物理内存和交换空间,但缺点是当使用的内存量超过可用的物理内存和交换空间量时,内核必须以某种方式释放内存资源以满足内存分配承诺。

用于回收内存以填补过量使用的内核机制称为内存不足杀手(OOM-killer)。通常,该机制将开始杀死占用内存的“流氓”进程,为其他进程释放内存。但是,如果vm.panic_on_oomsysctl 设置非零,则当系统内存不足时,内核会崩溃。

vm.panic_on_oom设置的可能值如下:

  • 0 (默认)当出现内存不足的情况时,OOM-killer 将杀死一个流氓进程。

  • 1内核通常会发生恐慌,但如果进程已达到使用mbind(MPOL_BIND)或设置的内存分配限制cpuset,则该进程将被终止。

  • 2 内核总是在内存不足的情况下恐慌。

OOM-killer 使用的启发式可以通过vm.oom_kill_allocating_tasksysctl 设置进行修改。可能的值如下:

  • 0 (默认)OOM-killer 将扫描任务列表并选择一个占用大量内存的任务流氓任务来杀死。

  • 1 (非零)OOM-killer 将终止触发内存不足情况的任务。

可以使用vm.overcommit_memorysysctl 设置调整内核内存记帐算法。可能的值如下:

  • 0 (默认)带有弱检查的启发式过量使用。

  • 1 总是过量使用,没有检查。

  • 2严格记账,在这种模式下,虚拟地址空间限制由vm.overcommit_ratio根据以下公式设置的值确定:

    virtual memory = (swap + physical memory * (overcommit_ratio / 100))
    
    Run Code Online (Sandbox Code Playgroud)

当使用严格的内存计算时,内核将不再分配匿名页面,除非它有足够的空闲物理内存或交换空间来存储页面。这意味着必须为系统配置足够的交换空间

可以在运行时使用sysctl命令检查或修改 sysctl 设置。要使更改永久化,可以将设置写入/etc/sysctl.conf. 上述设置也可通过/proc/sys/vm界面进行。对应的文件是:

  • /proc/sys/vm/panic_on_oom

  • /proc/sys/vm/oom_kill_allocating_task

  • /proc/sys/vm/overcommit_memory

  • /proc/sys/vm/overcommit_ratio


Edw*_*hen 1

  • 我认为你应该找出该进程消耗了大量内存。也许该程序存在内存泄漏错误。你应该修复它。
  • 如果没有足够的内存,Linux将关闭一些消耗大量内存的进程,或者重新启动自己。因为内核必须使用一些内存。
  • 不同的行为是由配置决定的。但我认为你应该修复内存泄漏错误。