Ajuste del comportamiento de almacenamiento en caché de disco de Linux para un rendimiento máximo


12

Me encuentro con un problema de rendimiento máximo aquí y necesito algunos consejos sobre cómo ajustar mis mandos. Estamos ejecutando un servidor de archivos de 10 Gbit para la distribución de copias de seguridad. Es una configuración S-ATA2 de dos discos en un controlador LSI MegaRAID. El servidor también tiene 24 gig de memoria.

Tenemos la necesidad de reflejar nuestra última copia de seguridad cargada con el máximo rendimiento.

El RAID0 para nuestras copias de seguridad "activas" nos da alrededor de 260 MB / seg de escritura y 275 MB / seg de lectura. Un tmpfs probado con un tamaño de 20 GB nos da alrededor de 1 GB / seg. Este tipo de rendimiento es lo que necesitamos.

Ahora, ¿cómo puedo ajustar el subsistema de memoria virtual de Linux para almacenar en caché los últimos archivos cargados durante el mayor tiempo posible en la memoria sin escribirlos en el disco (o incluso mejor: escribir en el disco Y mantenerlos en la memoria)?

Configuré los siguientes sistemas, pero no nos dan el rendimiento que esperamos:

# VM pressure fixes
vm.swappiness = 20
vm.dirty_ratio = 70
vm.dirty_background_ratio = 30
vm.dirty_writeback_centisecs = 60000

En teoría, esto debería darnos 16 GB para el almacenamiento en caché de E / S y esperar algunos minutos hasta que se escriba en el disco. Aún así, cuando comparo el servidor, no veo ningún efecto en la escritura, el rendimiento no aumenta.

Se necesita ayuda o consejo.


¿No tendría más sentido comenzar a escribir lo antes posible? De lo contrario, alcanza el tamaño máximo de búfer y de repente se detiene. Si estuvo escribiendo todo el tiempo, te da más tiempo.
Zan Lynx

Tengo 20GB de memoria solo para buffers, ya que mis aplicaciones (base linux + vsftpd) usan menos de 4GB (24GB en total). Mis copias de seguridad son inferiores a 20 GB. Si puedo escribirlos en el búfer y luego escribirlos en el disco secuencialmente después de la ejecución de la copia de seguridad, esto reduciría significativamente el tiempo de inactividad de mi fuente de copia de seguridad (servidores virtuales). PD: El servidor puede detenerse después, no hay problema. Tenía 30 minutos para recuperarse :)
Peter Meyer

Parece que cualquier aplicación que esté utilizando para transferir los datos a través de la red los está sincronizando con el disco. Deberá hacer que no lo haga para que los datos puedan quedar en la memoria caché, aunque me pregunto por qué quiere poder reventar una gran cantidad de datos de esa manera más rápido de lo que los discos pueden mantener el ritmo. Eso apunta a una falla de diseño en alguna parte.
psusi

Eso parece un defecto: su solución de respaldo no debería requerir que el servidor se apague todo el tiempo.
psusi

1
@PeterMeyer: incluso si tiene mucha RAM, sigue siendo un error esperar a que comiencen las escrituras. El único momento que tiene sentido es si va a editar o eliminar archivos (como un archivo temporal) antes de que llegue al disco. Una copia de seguridad no hace eso. Desea comenzar a escribir en segundo plano lo antes posible. Establezca su background_ratio en 1 o 2.
Zan Lynx

Respuestas:


6

Por el aspecto de las variables que ha establecido, parece que le preocupa principalmente el rendimiento de escritura y no le importan las posibles pérdidas de datos debido a cortes de energía.

Solo obtendrá la opción de escritura diferida y el uso de un caché de reescritura con operaciones de escritura asincrónicas. Las operaciones de escritura síncrona requieren comprometerse en el disco y nunca se escribirán de manera diferida. Su sistema de archivos puede estar causando frecuentes descargas de páginas y escrituras sincrónicas (generalmente debido al registro diario, especialmente con ext3 en modo datos = diario). Además, incluso los enjuagues de la página "en segundo plano" interferirán con las lecturas sin caché y las escrituras sincrónicas , lo que los ralentizará.

En general, debe tomar algunas métricas para ver qué está sucediendo: ¿ve su proceso de copia en estado "D" esperando que el trabajo de E / S se realice mediante pdflush? ¿Ves actividad de escritura sincrónica en tus discos?

Si todo lo demás falla, puede optar por configurar un sistema de archivos tmpfs explícito donde copie sus copias de seguridad y simplemente sincronice los datos con sus discos después del hecho, incluso automáticamente usando inotify

Para el almacenamiento en caché de lectura, las cosas son significativamente más simples: existe la fadviseutilidad fcoretools que tiene el --willneedparámetro para aconsejar al núcleo que cargue el contenido del archivo en la memoria caché del búfer.

Editar:

vm.dirty_ratio = 70

En teoría, esto debería darnos 16 GB para el almacenamiento en caché de E / S y esperar algunos minutos hasta que se escriba en el disco.

Esto no habría influido mucho en su escenario de prueba, pero hay una idea errónea en su comprensión. El parámetro dirty_ratio no es un porcentaje de la memoria total de su sistema, sino más bien de la memoria libre de su sistema .

Hay un artículo sobre Ajuste para cargas de escritura pesada con información más detallada.


Sí, estoy después del rendimiento de escritura. El tiempo que lleva desplegar el respaldo a los esclavos de respaldo no es de mi incumbencia. También tengo un script para la retransmisión, en caso de que el servidor de respaldo primario falle y las copias de respaldo no lleguen a los esclavos de respaldo. PD Ya he leído el enlace y sintonizado en consecuencia. Perdón por el error sobre gratis vs amortiguado vs total.
Peter Meyer

3

O simplemente obtenga más discos ... La configuración de la matriz de unidades que tiene no es compatible con todo lo que necesita. Este es un caso en el que la solución debe ser rediseñada para satisfacer sus necesidades reales. Entiendo que esto es solo una copia de seguridad, pero tiene sentido evitar una solución incorrecta.


Convenido. No hay forma de que un par de unidades SATA ( ¿ SATA ? ¿En serio?) Sostengan 275 MB / s, y ni siquiera estamos hablando de los IOP abismales que obtendrás de ellos.
Adaptr

1
Puedo ver hacia dónde se dirige: dado que este es solo un destino de respaldo de datos, no le importa la posibilidad de la pérdida ocasional de datos debido a cortes de energía. Y quiere minimizar el tiempo necesario para una ventana de respaldo al proporcionar el máximo rendimiento disponible: 20 GB de datos podrían escribirse en menos de 30 segundos de esta manera. Si las copias de seguridad implican tiempo de inactividad o impacto en el servicio por alguna razón, 30 segundos son seguramente más fáciles de superar que 20 minutos.
the-wabbit

Totalmente correcto. Estoy sincronizando imágenes de máquinas virtuales (muy pequeñas para nodos informáticos) que están inactivas durante la sincronización. La aplicación funciona como alquitrán | ssh pero usando ftp. Y bueno, las simulaciones deben ejecutarse ... :)
Peter Meyer

1
No importa de qué raza SATA sean. Los discos 7200RPM no empresariales simplemente no pueden garantizar el rendimiento o la latencia.
Adaptr

1
@adaptr, una copia de seguridad será escritura secuencial.
psusi

1

El uso de la memoria caché puede implicar la pérdida de datos, ya que si algo sale mal, los datos que están en la memoria y no se guardan en los discos se perderán.

Dicho esto, hay que hacer ajustes a nivel de sistema de archivos.

Por ejemplo, si estaba usando ext4, podría probar la opción de montaje:

barrera = 0

Eso: "deshabilita el uso de barreras de escritura en el código jbd. Las barreras de escritura imponen el orden adecuado en el disco de las confirmaciones de diario, lo que hace que las memorias caché de escritura de discos volátiles sean seguras de usar, con alguna penalización de rendimiento. Si sus discos están respaldados por batería de una manera u otro, deshabilitar barreras puede mejorar el rendimiento de manera segura. Las opciones de montaje "barrera" y "nobarrier" también se pueden usar para habilitar o deshabilitar barreras, para mantener la coherencia con otras opciones de montaje ext4 ".

Más en: http://www.mjmwired.net/kernel/Documentation/filesystems/ext4.txt


Estoy usando un XFS muy afinado. Más sobre qué respecto está sintonizado en el comentario anterior :)
Peter Meyer

El sistema de archivos se creó con mkfs.xfs -l lazy-count = 1, version = 2, size = 256m -i attr = 2 -d sunit = 512, swidth = 1024 y está montado con: rw, noatime, logbufs = 8, logbsize = 256k, osyncisdsync, delaylog, attr2, nobarrier, allocsize = 256k
Peter Meyer
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.