El vaciado de fondo en Linux ocurre cuando hay demasiados datos escritos pendientes (ajustables a través de / proc / sys / vm / dirty_background_ratio) o se alcanza un tiempo de espera para las escrituras pendientes (/ proc / sys / vm / dirty_expire_centisecs). A menos que se alcance otro límite (/ proc / sys / vm / dirty_ratio), se pueden almacenar en caché más datos escritos. Otras escrituras bloquearán.
En teoría, esto debería crear un proceso en segundo plano escribiendo páginas sucias sin perturbar otros procesos. En la práctica, perturba cualquier proceso de lectura sin caché o escritura sincrónica. Mal. Esto se debe a que el vaciado de fondo en realidad escribe al 100% de la velocidad del dispositivo y cualquier otra solicitud de dispositivo en este momento se retrasará (porque todas las colas y cachés de escritura en el camino están llenas).
¿Hay alguna forma de limitar la cantidad de solicitudes por segundo que realiza el proceso de lavado o de otra manera priorizar efectivamente las E / S de otros dispositivos?
fuente
Respuestas:
Después de mucho benchmarking con sysbench, llego a esta conclusión:
Para sobrevivir (en cuanto al rendimiento) una situación donde
simplemente volcar todos los ascensores, colas y cachés de páginas sucias. El lugar correcto para las páginas sucias es en la RAM de ese caché de escritura de hardware.
Ajuste dirty_ratio (o new dirty_bytes) lo más bajo posible, pero vigile el rendimiento secuencial. En mi caso particular, 15 MB fueron óptimos (
echo 15000000 > dirty_bytes
).Esto es más un truco que una solución porque los gigabytes de RAM ahora se usan solo para el almacenamiento en caché de lectura en lugar de la caché sucia. Para que el caché sucio funcione bien en esta situación, el enjuague de fondo del kernel de Linux necesitaría promediar a qué velocidad el dispositivo subyacente acepta solicitudes y ajustar el enjuague de fondo en consecuencia. No es fácil.
Especificaciones y puntos de referencia para la comparación:
Probado mientras
dd
usaba ceros en el disco, sysbench mostró un gran éxito , al aumentar 10 escrituras de fsync a 16 kB de 33 a 700 IOPS (límite de inactividad: 1500 IOPS) y un solo hilo de 8 a 400 IOPS.Sin carga, los IOPS no se vieron afectados (~ 1500) y el rendimiento se redujo ligeramente (de 251 MB / sa 216 MB / s).
dd
llamada:para sysbench, el test_file.0 se preparó para no analizarse con:
sysbench llama para 10 hilos:
sysbench llama para un hilo:
Los tamaños de bloque más pequeños mostraron números aún más drásticos.
--file-block-size = 4096 con 1 GB dirty_bytes:
--file-block-size = 4096 con 15 MB dirty_bytes:
--file-block-size = 4096 con 15 MB dirty_bytes en el sistema inactivo:
sysbench 0.4.12: punto de referencia de evaluación del sistema de subprocesos múltiples
Sistema de prueba:
En resumen, ahora estoy seguro de que esta configuración funcionará bien en situaciones inactivas, de alta carga e incluso de carga completa para el tráfico de la base de datos que de lo contrario se habría visto afectado por el tráfico secuencial. El rendimiento secuencial es superior al que dos enlaces de gigabit pueden entregar de todos modos, por lo que no hay problema en reducirlo un poco.
fuente
dirty_bytes
debe ser apenas lo suficientemente alto como para no detener las CPU mientras los procesos están escribiendo si el proceso está escribiendo en promedio con el rendimiento del dispositivo. Si el código de su aplicación realiza ciclos de gran cálculo seguidos de una gran cantidad de datos, será muy difícil de optimizar porque los promedios de tiempo corto difieren mucho de los promedios de tiempo largo. La solución correcta sería ajustar ladirty_bytes
configuración específica del proceso , pero Linux no es compatible hasta donde yo sé.Aunque ajustar los parámetros del kernel detuvo el problema, en realidad es posible que sus problemas de rendimiento sean el resultado de un error en el controlador Adaptec 5405Z que se corrigió en una actualización de firmware del 1 de febrero de 2012. Las notas de la versión dicen "Se solucionó un problema por el cual el firmware podía bloquearse durante un alto estrés de E / S". Quizás extender la E / S como lo hizo fue suficiente para evitar que se active este error, pero eso es solo una suposición.
Aquí están las notas de la versión: http://download.adaptec.com/pdfs/readme/relnotes_arc_fw-b18937_asm-18837.pdf
Incluso si este no fuera el caso para su situación particular, pensé que esto podría beneficiar a los usuarios que se encuentren con esta publicación en el futuro. Vimos algunos mensajes como el siguiente en nuestra salida de dmesg que finalmente nos llevaron a la actualización del firmware:
Estos son los números de modelo de los controladores RAID Adaptec que se enumeran en las notas de la versión para el firmware que tiene la alta corrección de bloqueo de E / S: 2045, 2405, 2405Q, 2805, 5085, 5405, 5405Z, 5445, 5445Z, 5805, 5805Q, 5805Z, 5805ZQ, 51245, 51645, 52445.
fuente
Un núcleo que incluye "WBT":
WBT no requiere cambiar a la nueva capa de bloque blk-mq. Dicho esto, no funciona con los programadores de E / S CFQ o BFQ. Puede usar WBT con los programadores de fecha límite / mq-fecha límite / noop / none. Creo que también funciona con el nuevo planificador de E / S "kyber".
Además de escalar el tamaño de la cola para controlar la latencia, el código WBT limita el número de solicitudes de reescritura en segundo plano como una proporción del límite de cola calculado.
La configuración de tiempo de ejecución está en
/sys/class/block/*/queue/wbt_lat_usec
.Las opciones de configuración de compilación a buscar son
El autor de WBT confirmó su declaración del problema al 100%. Bien hecho :-).
fuente
¿Cuál es su promedio para Dirty en / proc / meminfo? Esto normalmente no debe exceder su / proc / sys / vm / dirty_ratio. En un servidor de archivos dedicado, tengo dirty_ratio configurado en un porcentaje muy alto de memoria (90), ya que nunca lo excederé. Su dirty_ration es demasiado baja, cuando la golpea, todo se cae, levántala.
fuente