Estoy respondiendo a la etiqueta de Linux . Mi respuesta es específica solo para Linux .
Sí, las páginas enormes son más propensas a la fragmentación. Hay dos vistas de memoria, la que obtiene su proceso (virtual) y la que administra el núcleo (real). Cuanto más grande sea una página, más difícil será agrupar (y mantener con) sus vecinos, especialmente cuando su servicio se ejecuta en un sistema que también tiene que admitir otros que, por defecto, asignan y escriben más memoria de la que ellos tienen. en realidad terminan usando.
La asignación del núcleo de direcciones (reales) otorgadas es privada. Hay una muy buena razón por la cual el espacio de usuario los ve como el núcleo los presenta, porque el núcleo debe poder comprometerse en exceso sin confundir el espacio de usuarios. Su proceso obtiene un espacio de direcciones "Disneyfied" agradable y contiguo en el que trabajar, ajeno a lo que el núcleo está haciendo realmente con esa memoria detrás de escena.
La razón por la que se ve el rendimiento sea menor en los servidores de larga ejecución es más probable porque los bloques asignados que no han sido bloqueados de forma explícita (por ejemplo mlock()
/ mlockall()
o posix_madvise()
) y no modificada desde hace tiempo se han paginado , lo que significa que sus patines de servicios en el disco cuando se tiene que leer ellos. La modificación de este comportamiento hace que su proceso sea un mal vecino , por lo que muchas personas colocan su RDBMS en un servidor completamente diferente a web / php / python / ruby / lo que sea. La única forma de arreglar eso, sensatamente, es reducir la competencia por los bloques contiguos.
La fragmentación solo es realmente notable (en la mayoría de los casos) cuando la página A está en la memoria y la página B se ha movido para intercambiar. Naturalmente, reiniciar su servicio parecería "curar" esto, pero solo porque el núcleo aún no ha tenido la oportunidad de distribuir el proceso "(ahora) bloques recientemente asignados dentro de los límites de su relación de sobrecompromiso.
De hecho, reiniciar (digamos) 'apache' bajo una carga alta probablemente enviará bloques propiedad de otros servicios directamente al disco. Entonces, sí, 'apache' mejoraría por un corto tiempo, pero 'mysql' podría sufrir ... al menos hasta que el núcleo los haga sufrir por igual cuando simplemente hay una falta de memoria física suficiente.
Agregue más memoria o divida a los malloc()
consumidores exigentes :) No es solo la fragmentación lo que debe estar observando.
Intenta vmstat
obtener una visión general de lo que realmente se está almacenando y dónde.