Pregunta

Hay páginas dispersas alrededor de la web que describen POSIX AIO instalaciones en cantidades variables de detalle.Ninguno de ellos son muy recientes.No está claro cuál es, exactamente, lo que estamos describiendo.Por ejemplo, la "oficial" (?) sitio web para el kernel de Linux e/S asincrónica apoyo aquí dice que los enchufes no funcionan, pero el "aio.h" páginas de manual en mi Ubuntu 8.04.1 estación de trabajo todos parecen implicar que funciona arbitrarias de descriptores de archivo.Luego hay otro proyecto que parece trabajar en la biblioteca de la capa de incluso con menos documentación.

Me gustaría saber:

  • ¿Cuál es el propósito de POSIX AIO?Dado que el ejemplo más obvio de una aplicación que puedo encontrar, dice que no es compatible con los sockets, todo parece extraño para mí.Es sólo para asincrónico e/S de disco?Si es así, ¿por qué el hyper-general de la API?Si no, ¿por qué es la e/S de disco, el primero que consiguió atacado?
  • Dónde hay ejemplo completa POSIX AIO programas que puedo mirar?
  • ¿Alguien realmente se utilicen, para la real?
  • Qué compatibilidad de plataformas POSIX AIO?Qué partes de él ¿son compatibles?¿Alguien realmente apoyo la implícita "Cualquier I/O a cualquier FD" que <aio.h> parece que la promesa?

El otro multiplexación de los mecanismos disponibles para mí son buenas, pero los fragmentos aleatorios de información flotando por ahí me han hecho curioso.

¿Fue útil?

Solución

Red de e/S no es una prioridad para el AIO porque todo el mundo de la escritura POSIX servidores de red utiliza un evento sin fines de bloqueo de enfoque.El viejo estilo de Java "miles de millones de bloqueo de roscas" enfoque chupa horriblemente.

De escritura de disco I/O ya está en el búfer y de lectura de disco I/O puede ser prefetched en búfer el uso de funciones como posix_fadvise.Que deja directa, sin e/S de disco como el único propósito útil para AIO.

Directo, sin búfer de e/S sólo es realmente útil para bases de datos transaccionales, y de aquellos que tienden a escribir sus propios subprocesos o procesos para gestionar su disco I/O.

Así, en la final que deja POSIX AIO en la posición de que no sirve cualquier propósito útil.No lo use.

Otros consejos

Haciendo encaje de e/S de manera eficiente ha sido resuelto con kqueue, epoll, finalización de e / s puertos y los gustos.Haciendo asincrónica e/S de archivo es una especie de finales de comer (aparte de windows' de e/S superpuesta y solaris de apoyo temprano para posix AIO).

Si usted está buscando para hacer encaje de e/S, usted está probablemente mejor usar alguno de los mecanismos mencionados.

El propósito principal de AIO es, por tanto, resolver el problema de la asincrónico de disco I/O.Esto es probablemente por qué Mac OS X sólo admite AIO para archivos regulares, y no sockets (desde kqueue hace que sea mucho mejor, de todos modos).

Las operaciones de escritura son normalmente almacenados en caché por el núcleo y se vacían en un momento posterior.Por ejemplo, cuando la cabeza de lectura de la unidad pasa por la ubicación donde el bloque es para ser escrito.

Sin embargo, para las operaciones de lectura, si desea que el núcleo de dar la prioridad y orden de sus lecturas, AIO es realmente la única opción.He aquí por qué el kernel puede (teóricamente) ¿que mejor que cualquier nivel de usuario de la aplicación:

  • El núcleo ve todas las e/S de disco, no sólo de sus aplicaciones en el disco puestos de trabajo, y puede ordenar a un nivel global
  • El kernel (que) saber donde está el disco de la cabeza de lectura es, y puede recoger la lectura de los trabajos pasan en óptima de la orden, a mover la cabeza, la distancia más corta
  • El núcleo puede tomar ventaja de la cola de comandos nativos para optimizar sus operaciones de lectura más
  • Usted puede ser capaz de emitir más operaciones de lectura por el sistema de llamada con lio_listio() que con readv(), especialmente si sus lecturas no (lógicamente) contiguos, el ahorro de un poco de sistema de la sobrecarga de la llamada.
  • El programa podría ser ligeramente más sencillo con AIO ya que no necesitan un extra de hilo para bloquear en una lectura o escritura de llamada.

Dicho esto, posix AIO tiene una muy torpe de la interfaz, por ejemplo:

  • La única eficiente y bien apoyado media de evento devoluciones de llamada a través de señales, lo que hace difícil su uso en una biblioteca, ya que significa que el uso de la señal de los números en el proceso global de la señal de espacio de nombres.Si su sistema operativo no admite señales en tiempo real, también significa que usted tiene un bucle a través de todas sus solicitudes pendientes de averiguar lo que realmente terminado (este es el caso de Mac OS X por ejemplo, no Linux).La captura de las señales en un entorno multiproceso también hace que para algunos difícil de restricciones.Normalmente, usted puede no reaccionar ante el evento dentro del manejador de señal, pero tienes que subir una señal, escribir en una tubería o uso signalfd() (en linux).
  • lio_suspend() tiene los mismos problemas que seleccione() no, no escala muy bien con el número de puestos de trabajo.
  • lio_listio(), como se ha implementado bastante limitado número de trabajos que puede pasar, y no es trivial encontrar este límite en un portátil.Usted tiene que llamar a sysconf(_SC_AIO_LISTIO_MAX), que puede fallar, en cuyo caso se puede utilizar el AIO_LISTIO_MAX definir, que no son necesariamente definido, pero entonces usted puede utilizar 2, que se define como garantizados para ser admitidos.

Como para la aplicación en el mundo real utilizando posix AIO, puedes echar un vistazo a lighttpd (dis), que también publicó una la medición del desempeño cuando la introducción de apoyo.

La mayoría de las plataformas posix compatible posix AIO por ahora (Linux, BSD, Solaris, AIX, tru64).Windows admite a través de su superpuesta de file I/O.Mi entendimiento es que sólo Solaris, Windows y Linux verdaderamente apoya de forma asincrónica.e/S de archivos de todo el camino hacia abajo para el conductor, mientras que los otros sistemas operativos emular el asíncrono.I/O con hilos del kernel.Linux es la excepción, su posix AIO aplicación en glibc emula las operaciones asincrónicas con nivel de usuario de los hilos, mientras que su nativo async interfaz de e/S (io_submit (), etc.) son verdaderamente asincrónica todo el camino hacia abajo para el conductor, suponiendo que el controlador admite.

Creo que es bastante común entre los sistemas operativos a la no compatibilidad posix AIO para cualquier fd, pero restringir a los archivos normales.

Un libtorrent developer proporciona un informe sobre esto: http://blog.libtorrent.org/2012/10/asynchronous-disk-io/

Hay aio_write implementado en glibc;primera convocatoria de la aio_read o aio_write función genera un número de modo de usuario hilos, aio_write o aio_read peticiones post de ese hilo, el hilo no pread/pwrite y cuando se ha acabado la respuesta es enviado de vuelta a la bloqueados subproceso de llamada.

Hay también 'real' aio - apoyado por el nivel de kernel (necesidad libaio para que, ver el io_submit llamada http://linux.die.net/man/2/io_submit );también necesitan O_DIRECT para que (también pueden no ser compatibles con todos los sistemas de archivos, pero los mayores lo hacen de soporte de ti)

ver aquí:

http://lse.sourceforge.net/io/aio.html

http://linux.die.net/man/2/io_submit

Diferencia entre POSIX AIO y libaio en Linux?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top