Desactive el intercambio de proceso único y la sobrecompromiso

Desactive el intercambio de proceso único y la sobrecompromiso

Dos preguntas:

  1. ¿Hay alguna forma de desactivar el intercambio para un proceso determinado, es decir, es posible eliminar un determinado proceso si utiliza toda la memoria principal disponible del sistema?

  2. ¿Cómo desactivo la sobrecompromiso de memoria en un sistema Linux?

Contexto:

Estoy ejecutando una aplicación distribuida y me gustaría finalizar un proceso una vez que el sistema se quede sin memoria primaria. El proceso requiere bastante comunicación con el disco duro, por lo que considero razonable comprobar el uso de la memoria.programáticamente, como:

std::ifstream statm("/proc/self/statm");
size_t mem_virt, mem_rss, mem_shared;
statm >> mem_virt >> mem_rss >> mem_shared;
if (mem_virt == MAX_SYSTEM_PRIMARY_MEMORY) {
    // kills current process
}

Pero si hubiera algún conjunto de líneas de comando capaces de desactivar el intercambio para un proceso determinado, definitivamente sería mejor.

Sin embargo, todavía no sé cómo desactivar el compromiso excesivo. ¿Algunas ideas?

Respuesta1

Puede no permitir el intercambio en su aplicación llamando a mlockall(MCL_CURRENT|MCL_FUTURE), consulte la página de manual.

Puede desactivar la sobrecompromiso:

$ sysctl vm.overcommit_memory=2    # policy number 2
$ sysctl vm.overcommit_ratio=0     # ratio = 0%

Ejecutar sin swap es generalmente una idea terrible. Ahora todos los mmaps anónimos deberán estar respaldados por RAM, incluso si no se utilizan. Unix necesita intercambio, incluso si en realidad no se intercambia nada.

información relacionada