Hemos estado ejecutando un servidor en una VM en una empresa de alojamiento, y acabamos de suscribirnos a un host dedicado (AMD Opteron 3250, 4 núcleos, 8 GB de RAM, 2 x 1 TB en RAID de software, ext3).
Al ejecutar pruebas de rendimiento, notamos que algunas transiciones SQLite (combinación de inserciones, eliminaciones y / o actualizaciones) demoraban entre 10 y 15 veces más que en mi MacBook Pro 2010.
Después de mucho googlear y leer, pudimos ver las opciones de montaje, que fueron:
data=ordered,barrier=1
Experimentamos un poco y obtuvimos el mejor rendimiento con
data=writeback,barrier=0
He leído sobre estos y entiendo los conceptos básicos de lo que están haciendo, pero no tengo un buen sentido / sensación de si es una buena idea que corramos así.
Preguntas
¿Es razonable considerar la configuración anterior para un servicio alojado?
Si tuvimos un corte de energía, o un colapso, entonces podríamos terminar con la pérdida de datos o la corrupción de los archivos. Si tomáramos instantáneas de la base de datos cada 15 minutos, eso podría mitigar la situación, pero la base de datos podría no sincronizarse cuando se toma la instantánea. ¿Cómo deberíamos (podemos) asegurarnos de la integridad de tal instantánea?
¿Hay otras opciones que deberíamos considerar?
Gracias
Respuestas:
Primer consejo
Si no puede permitirse perder ningún dato (quiero decir, una vez que un usuario ingresó nuevos datos, si eso no se puede perder en los próximos segundos) y debido a que no tiene algo como un UPS, entonces no eliminaría la barrera de escritura, tampoco cambiaría a reescritura.
Eliminación de barreras de escritura
Si elimina la barrera de escritura, entonces, en caso de bloqueo o pérdida de energía, el sistema de archivos necesitará hacer un fsck para reparar la estructura del disco (tenga en cuenta que incluso con la barrera activada, la mayoría de los sistemas de archivos de registro diario aún funcionarían) aunque la repetición de la revista debería haber sido suficiente). Al eliminar la barrera de escritura, es recomendable eliminar cualquier almacenamiento en caché de disco (en el hardware) si es posible, esto ayuda a minimizar el riesgo. Sin embargo, debe comparar el impacto de dicho cambio. Puede probar este comando (si su hardware lo admite)
hdparm -W0 /dev/<your HDD>
.Tenga en cuenta que ext3 usa 2 barreras para el cambio de metadatos, mientras que ext4 usa solo una cuando usa la opción de montaje
journal_async_commit
.Aunque Ted T'so explicó por qué ocurrieron algunos pocos daños en los datos en los primeros días de ext3 (las barreras estaban DESACTIVADAS de forma predeterminada hasta Kernel 3.1 ), el diario se coloca de una manera que a menos que ocurra un ajuste de registro del diario (el diario es un registro cíclico) los datos se escriben en el disco en un orden seguro , primero en el diario, segundo en los datos, incluso con el disco duro admite el reordenamiento de las escrituras.
Básicamente, sería desafortunado que se produzca un bloqueo del sistema o una pérdida de energía cuando se ajusta el registro del diario. Sin embargo, debes mantenerte
data=ordered
. Intenta hacer un benchmark condata=ordered,barrier=0
además.Si puede permitirse perder unos segundos de datos, puede activar ambas opciones
data=writeback,barrier=0
pero luego intentar experimentar con elcommit=<nrsec>
parámetro también. Consulte el manual de este parámetro aquí . Básicamente, le das una cantidad de segundos, que es un período en que el sistema de archivos ext3 sincronizará sus datos y metadatos.También puede intentar tocar el violín y comparar con algunos parámetros ajustables del núcleo con respecto a las páginas sucias (aquellas que necesitan escribirse en el disco), aquí hay un buen artículo que explica todo acerca de estos parámetros ajustables y cómo jugar con ellos.
Resumen sobre barreras
Debe comparar algunas combinaciones más de sintonizables:
data=writeback,barrier=0
en conjunto conhdparm -W0 /dev/<your HDD>
data=ordered,barrier=0
data=writeback,barrier=0
junto con la otra opción de montajecommit=<nrsec>
y pruebe diferentes valores para nrsecdata=ordered,barrier=1
, pero pruebe otros sintonizables: especialmente el elevador del sistema de archivos (CFQ, Deadline o Noop) y sus respetables sintonizables.Considerar pasar a ext4 y compararlo
Como se dijo, ext4 requiere menos barrera que ext3 para una escritura. Además, ext4 admite extensiones que para archivos grandes pueden brindar un mejor rendimiento. Por lo tanto, es una solución que vale la pena explorar, especialmente porque es fácil migrar de una ext3 a una ext4 sin reinstalar: documentación oficial ; Lo hice en un sistema pero usando esta guía de Debian . Ext4 es realmente estable desde el kernel 2.6.32, por lo que es seguro de usar en producción.
Última consideración
Esta respuesta está lejos de ser completa, pero le brinda suficientes materiales para comenzar a investigar. Esto depende tanto de los requisitos (a nivel del usuario o del sistema) que es difícil tener una respuesta directa, lo siento.
fuente
ext3
en él. Da una explicación quizás más fácil de entender (o simplificada) de lo que intenté abordar en mi respuesta. 2. sqlite.1065341.n5.nabble.com/… podría intentar mantener los valores predeterminados seguros de ext3 (ordenados + barrera) pero elimine la sincronización en SQLite. Pronto actualizaré mi respuesta con respecto a este segundo aspecto.Advertencia: puede haber imprecisiones a continuación. He estado aprendiendo sobre muchas de estas cosas a medida que avanzo, así que tómalo con una pizca de sal. Esto es bastante largo, pero puedes leer los parámetros con los que estábamos jugando y luego saltar a la conclusión al final.
Hay varias capas en las que puede preocuparse por el rendimiento de escritura de SQLite:
Observamos los resaltados en negrita. Los parámetros particulares fueron
Lea más sobre las opciones de ext3 en la documentación de ext3 .
Realicé pruebas de rendimiento en varias combinaciones de estos parámetros. La ID es un número de escenario, mencionado a continuación.
Comencé ejecutando con la configuración predeterminada en mi máquina como escenario 1. El escenario 2 es lo que supongo que es el "más seguro", y luego probé varias combinaciones, según corresponda / solicitada. Esto es probablemente más fácil de entender con el mapa que terminé usando:
Escribí un script de prueba que ejecutaba muchas transacciones, con inserciones, actualizaciones y eliminaciones, todo en tablas con INTEGER, TEXT (con columna de identificación) o mixto. Ejecuté esto varias veces en cada una de las configuraciones anteriores:
Los dos escenarios inferiores son # 6 y # 17, que tienen "pragma synchronous = off", tan sorprendente que fueron los más rápidos. El siguiente grupo de tres son # 7, # 11 y # 19. Estos tres están resaltados en azul en el "mapa de configuración" anterior. Básicamente, la configuración es caché de escritura en disco activada, barrera = 0 y conjunto de datos en algo diferente a 'diario'. Cambiar la confirmación entre 5 segundos (# 7) y 60 segundos (# 11) parece hacer poca diferencia. En estas pruebas, no parecía haber mucha diferencia entre datos = ordenados y datos = reescritura, lo que me sorprendió.
La prueba de actualización mixta es el pico medio. Hay un grupo de escenarios que son claramente más lentos en esta prueba. Todos estos son con data = journal . De lo contrario, no hay mucho entre los otros escenarios.
Tuve otra prueba de tiempo, que hizo una mezcla más heterogénea de inserciones, actualizaciones y eliminaciones en las diferentes combinaciones de tipos. Estos tomaron mucho más tiempo, por lo que no lo incluí en el diagrama anterior:
Aquí puede ver que la configuración de reescritura (# 19) es un poco más lenta que las ordenadas (# 7 y # 11). Esperaba que la reescritura fuera un poco más rápida, pero tal vez depende de sus patrones de escritura, o tal vez todavía no he leído lo suficiente en ext3 :-)
Los diversos escenarios eran algo representativos de las operaciones realizadas por nuestra aplicación. Después de elegir una lista breve de escenarios, realizamos pruebas de tiempo con algunas de nuestras suites de pruebas automatizadas. Estaban en línea con los resultados anteriores.
Conclusión
Gracias a @Huygens por varios consejos y sugerencias.
fuente