Uso de O_DIRECT en Linux

Si esta pregunta está demasiado orientada a los progtwigdores, házmelo saber. Me pregunto si hay personas familiarizadas con el indicador O_DIRECT para la llamada al sistema open () en Linux 2.6. Linus lessprecia su uso, sin embargo, la escritura de files de alto performance parece indicar su uso. Me gustaría saber de cualquier experiencia y recomendaciones del mundo real.

Más información: la aplicación que estoy usando mantiene su propio caching y, al hacerlo, obtiene un promedio de aceleración de 5x o más. Al escribir en un file, el contenido de la memory caching debe escribirse en la memory caching del sistema de files, lo que parece networkingundante y preocupa el performance.

Ok, pides experiencias, esto hace que la pregunta sea un tanto subjetiva y argumentativa, pero pasable.

Linus dijo que refiriéndose a los usos que las personas suelen atribuir a O_DIRECT, y para esos usos, IMO Linus es en su mayoría correcta. Incluso si dirige la E / S, no puede transferir datos a / desde dispositivos directamente a las instrucciones de su progtwig, necesita un búfer que esté lleno (por el progtwig o el dispositivo) y transferido a través de una llamada del sistema al otro extremo. Además, para que sea eficiente, no querrás volver a leer algo que ya leíste, en caso de que lo necesites nuevamente. Entonces necesitas algún tipo de caching … ¡y es exactamente eso lo que proporciona el kernel sin O_DIRECT, un caching de página! ¿Por qué no usar eso? También viene con beneficios si más processs quieren acceder al mismo file al mismo time, sería un desastre con O_DIRECT.

Una vez dicho esto, O_DIRECT tiene sus usos: si por alguna razón necesita get datos directamente del dispositivo de bloque. No tiene nada que ver con el performance.

Las personas que usan O_DIRECT para el performance generalmente provienen de sistemas con algorithms de caching de página erróneos, o sin mecanismos de asesoramiento POSIX, o incluso personas repitiendo sin pensar lo que otras personas han dicho. Para evitar estos problemas, O_DIRECT era una solución. Linux, OTOH, tiene la filosofía de que debe solucionar el problema subyacente real, y el problema subyacente fueron los sistemas operativos que hicieron un mal trabajo con el almacenamiento en caching de la página.

Usé O_DIRECT para una implementación simple de cat para encontrar un error de memory en mi máquina. Este es un uso válido para O_DIRECT. Eso no tiene nada que ver con el performance.

En realidad, O_DIRECT es necesario para evitar cualquiera de

  • Contaminación de caching : a veces usted sabe que no tiene sentido usar el caching en la cabeza, por ejemplo, cuando se trata de files realmente grandes, digamos 64 GiB cuando solo hay 2 GiB de RAM. El file Torrent de 32 GiB que un usuario decidió verificar no parece ser un buen candidato para el almacenamiento en caching. Es solo una actividad extra con sus propios gastos generales. Y puede hacer que algunos datos realmente útiles sean eliminados de la memory caching.
  • doble caching – por ejemplo, algunos RDBMS (mencionar MySQL) permite definir su propia memory caching. Las bases de datos supuestamente saben mejor cómo almacenar en caching y qué, que la memory virtual del kernel que no sabe nada acerca de la planificación SQL, etc.

– que no es bueno, como parece. Y O_DIRECT no significa ser más rápido, a menudo no lo es .

Tenga en count que es O_DIRECT que el uso de O_DIRECT falle en los núcleos más nuevos con los filesystems más nuevos. Vea este informe de error por ejemplo. Entonces, no solo el uso es a menudo dudoso, probablemente no funcionará en la próxima generación de distribuciones de Linux. Así que no apostaría el performance de mi código, incluso si puede demostrar que podría tener un beneficio.

En relación a lo que ya dijo @Juliano.

Checkout posix_fadvise si el problema real es la mala conducta del algorithm de caching del sistema de files subyacente, puedes intentar darle consejos, cómo vas a usar el sistema de files. Para fs muy bien implementado, debería boost el performance. (Aquí hay un enlace a otro tema tocando consideraciones similares https://stackoverflow.com/a/3755818/544721 )

Tiene mucho que ver con el performance.

Un ejemplo interesante es en mongodb usando el motor mmap. O_DIRECT se usa mejor, como han dicho otros, donde es poco probable que los datos se lean durante un time. En mongodb, el diario de la database está escrito usando O_DIRECT mientras que el mecanismo de caching de página maneja las escrituras de índices e índices (pdflush) porque, aunque O_DIRECT ofrece less ancho de banda, también significa less latencia y por lo tanto networkinguce la pérdida de datos en el caso de interrupción inesperada (pánico del kernel, falla de disco o energía). Tenga en count que todavía hay almacenamiento en búfer antes de que una escritura O_DIRECT se confirme en el almacenamiento no volátil, esto solo networkinguce la pérdida de datos.

Otra característica importante de O_DIRECT es que proporciona más control sobre la secuencia de escrituras. De nuevo, no garantiza el order de las escrituras (a less que tenga un controller de disco de caching no volátil y esté utilizando el progtwigdor fifo, pero estas tienen sus propias complicaciones). Por lo tanto, aunque mysql usa O_DIRECT para sus datos / índices, así como también para el diario, puede esperar que este último se comprometa primero.

Pero es importante recordar que O_DIRECT rompe la equidad en la asignación de resources. Una de las razones por las que su aplicación se acelera es que está ralentizando otras cosas.