¿Cómo funciona vm.overcommit_memory?

Pregunta:

Cuando uso la configuración predeterminada:

vm.overcommit_memory = 0
vm.overcommit_ratio = 50

Puedo leer estos valores del archivo /proc/meminfo :

CommitLimit:     2609604 kB
Committed_AS:    1579976 kB

Pero cuando cambio vm.overcommit_memory de 0 a 2 , no puedo iniciar el mismo conjunto de aplicaciones que podía iniciar antes del cambio, especialmente amarok. Tuve que cambiar vm.overcommit_ratio a 300 , para que se pudiera aumentar el límite. Ahora, cuando inicio amarok, /proc/meminfo muestra lo siguiente:

CommitLimit:     5171884 kB
Committed_AS:    3929668 kB

Esta máquina solo tiene 1GiB de RAM, pero amarok funciona sin problemas cuando vm.overcommit_memory se establece en 0. Pero en el caso de establecerlo en 2 , amarok necesita asignar más de 2GiB de memoria. ¿Es un comportamiento normal? Si es así, ¿alguien podría explicar por qué, por ejemplo, firefox (que consume de 4 a 6 veces más memoria que amarok) funciona de la misma manera antes y después del cambio?

Respuesta:

Puede encontrar la documentación en man 5 proc ( o en kernel.org ):

/proc/sys/vm/overcommit_memory This file contains the kernel virtual memory accounting mode. Values are: 0: heuristic overcommit (this is the default) 1: always overcommit, never check 2: always check, never overcommit In mode 0, calls of mmap(2) with MAP_NORESERVE are not checked, and the default check is very weak, leading to the risk of getting a process "OOM-killed". In mode 2 (available since Linux 2.6), the total virtual address space that can be allocated (CommitLimit in /proc/mem‐ info) is calculated as CommitLimit = (total_RAM - total_huge_TLB) * overcommit_ratio / 100 + total_swap

La respuesta simple es que establecer overcommit en 1, preparará el escenario para que cuando un programa llame a algo como malloc() para asignar un trozo de memoria ( man 3 malloc ), siempre tendrá éxito independientemente de si el sistema sabe que no tendrá toda la memoria que se está pidiendo.

El concepto subyacente a comprender es la idea de memoria virtual . Los programas ven un espacio de direcciones virtuales que puede, o no, estar asignado a la memoria física real. Al deshabilitar la comprobación de sobreasignación, le indica al sistema operativo que asuma que siempre hay suficiente memoria física para hacer una copia de seguridad del espacio virtual.

Ejemplo

Para resaltar por qué esto a veces puede ser importante, eche un vistazo a las guías de Redis sobre por qué vm.overcommit_memory debe establecerse en 1 para ello.

Leave a Comment

Your email address will not be published.

Scroll to Top

istanbul avukat

-

web tasarım