Cómo mejorar el rendimiento io del disco del servidor Linux
Aproveche los sistemas de archivos existentes para la optimización:
El kernel de Linux y los sistemas de archivos individuales utilizan una variedad de métodos de optimización para mejorar las velocidades de acceso al disco. Sin embargo, estas optimizaciones deben incorporarse al diseño de nuestro servidor para aprovecharlas al máximo.
Caché del sistema de archivos
El kernel de Linux proporciona una gran parte de la memoria disponible para el sistema de archivos virtual como caché de archivos, conocida como caché de páginas. Cuando ve la memoria mediante el comando gratuito, la parte que aparece como caché es el caché del archivo.
Cómo optimizar de manera específica:
lru no es un buen algoritmo de eliminación. La mayor ventaja de lru es que tiene buena universalidad y se puede utilizar en varios escenarios de uso. ejercer un efecto determinado. Si puede encontrar las características estadísticas de los archivos a los que se accede en el escenario de uso actual y escribir un algoritmo de eliminación específico, puede mejorar significativamente la tasa de aciertos del caché de archivos. Para los agentes de reenvío http, un buen algoritmo de eliminación puede utilizar 1 GB de memoria para lograr el efecto de almacenamiento en caché del algoritmo lru con 100 GB de memoria. Si no va a escribir un nuevo algoritmo de eliminación, generalmente no necesita crear otro programa de caché de archivos en la capa de aplicación para el almacenamiento en caché.
Asignación mínima:
Cuando un archivo se expande y es necesario asignar espacio en disco, la mayoría de los sistemas de archivos no asignan solo el espacio en disco que se necesita actualmente, sino que asignan más espacio en disco. De esta manera, la próxima vez que se expanda el archivo, se podrá utilizar el espacio ya asignado en lugar de tener que asignar nuevo espacio con frecuencia.
Por ejemplo, en ext3, cada vez que se asigna espacio en disco, la asignación mínima es de 8 KB.
Un efecto secundario de la asignación mínima es que se desperdicia algo de espacio en disco (asignado pero no utilizado)
Cómo optimizar esto:
Agregando min en reiserfs Al aumentar la asignación de 8 KB a 128 K, mejoramos el rendimiento del disco io en un 30 %. Si su escenario de uso actual tiene muchos archivos pequeños, cambiar la preasignación a un tamaño mayor desperdiciará mucho espacio en disco, por lo que este valor debe establecerse de acuerdo con su escenario de uso actual. Parece que el código fuente debe modificarse directamente para que surta efecto. No lo recuerdo. Lo modifiqué en 2009. Si está interesado, puede buscarlo en Google.
Programación de acceso IO:
Cuando hay múltiples accesos IO al mismo tiempo, el kernel de Linux puede fusionar y ordenar estos accesos IO según LBA, de modo que cuando se mueva el cabezal del disco , puede "Por cierto, leer los datos durante el movimiento.
Los discos como SATA incluso tienen una funcionalidad de clasificación de IO incorporada para mejorar aún más el rendimiento, lo que a menudo requiere una configuración en la placa base para habilitar la funcionalidad de clasificación de IO incorporada. La clasificación io de Linux se basa en LBA, pero LBA es una dirección lineal unidimensional y no refleja completamente el disco circular bidimensional, por lo que la clasificación io incorporada en el disco puede lograr mejores resultados.
Cómo realizar una optimización dirigida:
La programación de acceso a IO puede mejorar significativamente el rendimiento de IO, siempre que la capa de aplicación deba iniciar suficientes accesos de IO para que Linux pueda programarlos al mismo tiempo.
¿Cómo iniciar múltiples accesos io desde la capa de aplicación al kernel al mismo tiempo?
La opción 1 es utilizar aio_read para iniciar múltiples solicitudes de lectura y escritura de archivos de forma asincrónica.
La opción 2 es utilizar un grupo de subprocesos de disco para iniciar múltiples solicitudes de lectura/escritura de archivos simultáneamente.
Para nuestro proxy de reenvío http, el uso de 16 subprocesos para leer y escribir en el disco mejora el rendimiento aproximadamente 2,5 veces. La cantidad específica de subprocesos/procesos que se abrirán se puede determinar en función del escenario de uso específico.
Consejo:
Cuando configura el identificador de archivos como sin bloqueo, el proceso seguirá inactivo y esperará a que se realice la E/S del disco, y la función sin bloqueo no tendrá efecto para la lectura de archivos y escribiendo.
En circunstancias normales, leer un archivo solo introducirá una docena de milisegundos de suspensión, por lo que no será demasiado obvio, pero cuando el disco io es muy grande, leer un archivo hará que el proceso entre en suspensión durante más de diez segundos;
Leer con anticipación:
El kernel de Linux puede predecir nuestras "solicitudes de lectura futuras" y leer los datos por adelantado. La lectura anticipada reduce la cantidad de lecturas de io y reduce la latencia de las solicitudes de lectura.
Cómo optimizar esto:
La precisión de la predicción de la captación previa es limitada, por lo que no podemos confiar en la captación previa, sino abrir un búfer más grande y leerlo todo de una vez. y luego procéselo lentamente; al mismo tiempo, intente no abrir un búfer más pequeño y leer/procesar el archivo en un bucle.
Aunque la "lectura anticipada" y la "asignación diferida" funcionan de manera similar, es mejor ampliar el búfer de lectura/escritura usted mismo.
Asignación diferida:
Cuando un archivo se expande y es necesario asignar espacio en disco, en lugar de asignarlo inmediatamente, se puede almacenar en la memoria y luego agregarlo en múltiples solicitudes de espacio en disco en uno va a distribuir.
Otro propósito de la asignación retrasada es reducir el número de asignaciones, reduciendo así la discontinuidad de archivos.
La asignación retrasada tiene algunos efectos secundarios:
1. Si la aplicación fuerza una actualización a través de interfaces como fsync después de cada escritura de datos, la asignación retrasada no funcionará
2. La asignación retrasada puede introducir de forma intermitente grandes retrasos de E/S en el disco (debido a que es necesario escribir una gran cantidad de datos en el disco a la vez)
Solo unos pocos sistemas de archivos más nuevos admiten esta función
Cómo optimizar esto:
Si no necesita una gran cantidad de datos para garantizar la seguridad (ya sea que la pérdida esté permitida o no), puede almacenar en caché los datos directamente en la aplicación y luego almacenarlos en caché. cuando los datos alcancen Escriba nuevamente cuando se alcance un cierto tamaño, lo cual es mucho mejor que la asignación retrasada del sistema de archivos. Si los requisitos de seguridad son extremadamente altos, se recomienda utilizar fsync para forzar la actualización con frecuencia.
Desfragmentación de disco online:
Ext4 proporciona una herramienta de desfragmentación llamada e4defrag, que incluye tres funciones principales:
1. Hacer que cada archivo se almacene de forma continua
2. Intente que cada directorio de archivos se almacene continuamente
3. Haga que la siguiente asignación sea menor
4. Haga que todos los archivos se almacenen continuamente
5. Hacer que la siguiente asignación sea menor
6. Hacer que la siguiente asignación sea menor
7. Hacer que la siguiente asignación sea menor
p>
8. Hacer que la siguiente asignación sea menor