Tengo un anfitrión de producción, a continuación:
El sistema está utilizando 1 GB de intercambio, mientras mantiene casi 40 GB de espacio de memoria libre y sin usar. ¿Debería preocuparme por esto o es sobre todo normal?
centos
performance
memory
swap
MrDuk
fuente
fuente
free -m
. Los gráficos son difíciles de leer.Respuestas:
Esto no es un problema y es probable que sea normal. Se usa mucho código (y posiblemente datos) muy raramente, por lo que el sistema lo cambiará para liberar memoria.
El intercambio es principalmente un problema si la memoria se intercambia dentro y fuera continuamente. Es ese tipo de actividad que mata el rendimiento y sugiere un problema en otras partes del sistema.
Si desea monitorear su actividad de intercambio, puede hacerlo con varias utilidades, pero
vmstat
generalmente es bastante útil, por ejemploIgnore la primera línea ya que es actividad desde que se inició el sistema. Tenga en cuenta las columnas
si
yso
debajo---swap--
; En general, deberían ser cifras bastante pequeñas, si no 0 para la mayoría de las veces.También vale la pena mencionar que este intercambio preventivo se puede controlar con una configuración de kernel. El archivo en
/proc/sys/vm/swappiness
contiene un número entre 0 y 100 que le dice al kernel qué tan agresivamente cambiar la memoria. Cat el archivo para ver en qué está configurado. De manera predeterminada, la mayoría de las distribuciones de Linux lo establecen en 60, pero si no desea ver ningún intercambio antes de que se agote la memoria, haga eco de un 0 en el archivo de esta manera:Esto puede hacerse permanente agregando
a
/etc/sysctl.conf
.fuente
echo 0 >/proc/sys/vm/swappiness
. Esto puede hacerse permanente agregandovm.swappiness = 0
a /etc/sysctl.conf.swappiness=7
o algo, las páginas no utilizadas a largo plazo se intercambian. Hay una gran diferencia entreswappiness=0
y cualquier otro valor, incluso valores bajos. El valor predeterminado del kernelswappiness=60
generalmente es bueno para los servidores, y es solo para uso interactivo de escritorio donde un intercambio bajo es bueno. Pero establecerlo en 7 o algo no debería doler mucho. (Pero no lo he comprobado, no soy un administrador del sistema).swappiness
funciona muy bien. Con la presión, verá queswappiness=7
priva al caché del archivo casi por completo durante un período prolongado de tiempo, mientras queswappiness=60
liquida mucho caché, pero también comienza a intercambiarse en segundos. Sigue siendo el caché el que recibe la paliza, pero de una manera mucho más equilibrada.Linux escribirá páginas de forma preventiva en el disco si no tiene nada mejor que hacer. Sin embargo, eso no significa que expulse esas páginas de la memoria. Es solo que en caso de que deba desalojar esas páginas en algún momento en el futuro, no necesita esperar a que se escriban en el disco, porque ya están allí.
Después de todo, la razón por la que se está quedando sin memoria, probablemente sea porque su máquina ya está trabajando duro, no desea cargarla adicionalmente con el intercambio. Es mejor hacer el intercambio cuando la máquina no está haciendo nada.
Por una razón similar, tu memoria siempre debe estar llena. Páginas de memoria, caché del sistema de archivos
tmpfs
, hay tantas cosas que podrían guardarse en la memoria. Realmente, deberías preocuparte si tu memoria está vacía; después de todo, pagaste mucho dinero por ello (al menos en comparación con la misma cantidad de espacio en disco), ¡así que será mejor que lo uses!fuente
El intercambio utilizado no es malo, pero hay mucha actividad de intercambio
El intercambio de columnas no es un problema en absoluto. Los valores distintos de cero en las columnas si y so son mortales para el rendimiento del servidor. Especialmente los que tienen mucha RAM.
Es mejor deshabilitar el intercambio en máquinas con varios GB de RAM:
Esto no deshabilitará el intercambio. Solo le indicará a Linux que use el intercambio como medida de último recurso. Esto desperdiciará unos pocos MB de programas que no necesitan estar en la RAM ... Pero es preferible intercambiar las colas de acceso al disco.
Edición 1: por qué el valor predeterminado de intercambio no es óptimo
Recordemos hace dos décadas que un gran 486 tenía solo 32Mb de RAM. Los algoritmos de intercambio se desarrollaron cuando toda la RAM se podía mover al disco en una pequeña fracción de segundo. Incluso con los discos más lentos de esa época. Es por eso que las políticas de intercambio predeterminadas son tan agresivas. RAM fue el cuello de botella en esos días. Desde entonces, el tamaño de RAM aumentó más de 10,000 veces y las velocidades de disco menos de 10 veces. Esto cambió el cuello de botella al ancho de banda del disco.
Edición 2: ¿por qué si la actividad es mortal para los servidores?
Si y así, la actividad en máquinas con toneladas de RAM es mortal porque significa que el sistema está luchando consigo mismo por la RAM. Lo que sucede es que los discos, incluso los grandes almacenes son demasiado lentos en comparación con las RAM. El intercambio agresivo favorece la memoria caché del disco del núcleo sobre los datos de la aplicación y es la fuente más común de lucha por la RAM. Dado que el sistema operativo tendrá que liberar el caché de disco en cada si , el tiempo de vida del caché adicional que proporciona el intercambio es demasiado bajo para ser útil de todos modos. El resultado es que está tomando el ancho de banda del disco para almacenar la memoria caché que probablemente no se usará y pausando sus programas esperando las páginas si . Lo que significa que consume muchos recursos críticos con poco o ningún beneficio para las aplicaciones.
Tenga en cuenta el título de la respuesta "mucha actividad de intercambio en servidores con mucha RAM". Esto no se aplica a máquinas con actividad ocasional. Esto puede no aplicarse en el futuro si se desarrollan algoritmos de intercambio más inteligentes en los sistemas operativos.
Edición 3: páginas "frías"
La gente idealiza el algoritmo de intercambio. Algunos dicen "se necesitan páginas menos usadas de la RAM", pero esto no es lo que hace el núcleo. Lo que es difícil de entender sobre el intercambio es que el núcleo no sabe qué es una "página en frío". El núcleo no tiene una buena métrica para determinar si la página se usa o es probable que se use en el futuro cercano. Para evitar que el kernel ponga páginas en el intercambio más o menos al azar y las páginas que no son necesarias se quedan allí. El problema de ese algoritmo es que las páginas deben ir al intercambio para saber si las aplicaciones las necesitan. Y esto significa que muchas páginas "populares" irán al intercambio. El problema es que los discos son demasiado lentos en comparación con la RAM.
Construí mi propio punto de referencia que es un escenario realista muy común para muchas aplicaciones con un volumen decente. De mis pruebas, no vi beneficios en el rendimiento o la latencia cuando se usan swaps. Lejos de ahi. Cuando comienza el intercambio, ralentiza tanto el rendimiento como la latencia al menos en un orden de magnitud.
Voy un poco más al respecto: entiendo que el intercambio no es para procesar. Los swaps son solo para emergencias. Esos momentos en los que se ejecutan demasiadas aplicaciones al mismo tiempo y obtienes un pico de memoria. Sin intercambio, esto causaría errores de falta de memoria. Considero que el uso de intercambio es un fracaso de los equipos de desarrollo y producción. Esta es solo una opinión que va mucho más allá de lo que discutimos aquí, pero es lo que creo. Por supuesto, mis aplicaciones tienen una excelente administración de memoria por sí mismas.
fuente
si
más mortal para su servidor quebi
? Ambos significan que algún programa está esperando que se lean 4096 bytes del disco a la memoria. Elbi
archivo es de cualquier archivo ysi
de una categoría específica de archivos (pero sus bytes se mueven igual de rápido a través de la misma ruta).swappiness=0
Parece totalmente inapropiado para los servidores. Puede considerarlo para un sistema de escritorio interactivo (pero incluso así,swappiness=1
es una mejor opción para eventualmente intercambiar páginas realmente frías). Ver comentarios sobre otra respuesta .swappiness=7
o algo reducirá drásticamente la actividad de intercambio sin fijar páginas frías en la RAM hasta OOM, y vale la pena considerarlo si cree que60
es demasiado intercambiable para un servidor específico.si
es peor quebi
. La mayoría del software de servidor está diseñado en el supuesto de que la E / S del disco puede ser lenta y utiliza subprocesos, E / S asíncrona o alguna otra técnica para mantener la capacidad de respuesta en general mientras se espera la E / S. Un fallo de página podría suceder en cualquier lugar. En el peor de los casos, podría ocurrir un error de página lenta después de bloquear, bloqueando el acceso de todos los otros hilos a esa sección crítica durante ~ 10 ms (con intercambio en almacenamiento de rotación lenta). Eso podría ser plausible si una sección crítica copia datos de una estructura de datos compartida a una página potencialmente fría.Esta no es una respuesta a su pregunta; sino más bien, solo información adicional para ayudarlo a tomar una decisión informada.
Si desea saber qué procesos están utilizando específicamente cuánto intercambio, aquí hay un pequeño script de shell:
También debo agregar que tmpfs también se intercambiará. Esto es más común en los sistemas Linux modernos que usan systemd que crean superposiciones de espacio de usuario / tmp usando tmpfs.
fuente
awk '/Swap/ {sw += $2} FNR==1 { /*first line of a new file */ find the command somehow, maybe still fork/exec ps;} END { print totals }' /proc/[0-9]*/smaps
. Eso ejecuta cut y ps para cada proceso, y grep + awk varias veces para cada proceso en el sistema.He notado que la replicación de MySQL Cluster se ralentiza o falla cuando los agentes están intercambiando mucho. Tal vez a algunas aplicaciones no les importe o tal vez incluso se beneficien de un intercambio, pero las bases de datos realmente parecen sufrirlo. Sin embargo, muchas discusiones que he visto en foros discuten el intercambio descontextualizado de la discusión de la carga de trabajo específica.
En el mundo de DBA, el consenso parece ser que "es de sentido común que cuando se ejecuta MySQL (o realmente cualquier otro DBMS) no desea ver ninguna E / S en su espacio de intercambio. Escalar el tamaño de la caché (usando innodb_buffer_pool_size en el caso de MySQL) es una práctica estándar para asegurarse de que hay suficiente memoria libre, por lo que no es necesario el intercambio.
Pero, ¿qué sucede si comete algún error o error de cálculo y se produce el intercambio? ¿Cuánto impacta realmente el rendimiento? Esto es exactamente lo que me propuse investigar. "
Espero que los lectores encuentren los siguientes enlaces a propósito.
https://www.percona.com/blog/2017/01/13/impact-of-swapping-on-mysql-performance/
https://www.percona.com/blog/2010/01/18/why-swapping-is-bad-for-mysql-performance/
fuente