92 votes

Quel est l'état des E / S asynchrones (AIO) POSIX?

Il y a des pages dispersée à travers le web qui décrivent POSIX AIO installations dans des quantités variables de détail. Aucun d'entre eux sont terriblement récente. Il n'est pas clair ce qui, exactement, ils les décrivent. Par exemple, le "officielle" (?) site web pour le noyau Linux asynchronous I/O support ici dit que les sockets ne fonctionnent pas, mais le "aio.h" les pages de manuel sur mon Ubuntu 8.04.1 poste de travail tous semblent indiquer qu'il fonctionne pour arbitraire des descripteurs de fichiers. Ensuite, il y a un autre projet qui semble fonctionner à la bibliothèque couche avec encore moins de la documentation.

Je voudrais savoir:

  • Quel est le but de POSIX AIO? Étant donné que l'exemple le plus évident de la mise en œuvre, je peux trouver, dit-il ne supporte pas les sockets, tout cela semble bizarre pour moi. Est-il juste pour async disk I/O? Si oui, pourquoi l'hyper-général de l'API? Si non, pourquoi est-disk I/O, la première chose qui les a attaqués?
  • Où sont-il par exemple de compléter POSIX AIO programmes que je peux regarder?
  • Personne ne l'utilisent vraiment, pour de vrai?
  • Quelles sont les plateformes de soutien POSIX AIO? Quelles parties prennent-ils en charge? Peut-on vraiment soutenir l'implicite "I/O pour tout FD," <aio.h> semble promettre?

Les autres mécanismes de multiplexage qui s'offrent à moi sont très bonnes, mais l'aléatoire des fragments d'information flottant autour de là-bas ont m'a rendu curieux.

68voto

Arvid Points 4344

Faire socket d'e/S de manière efficace a été résolu avec kqueue, epoll, IO ports d'achèvement et l'aime. Faire asynchrone fichier I/O est une sorte de fin de comer (à l'exception de windows overlapped I/O et solaris d'aide précoce posix AIO).

Si vous êtes à la recherche pour faire de la socket d'e/S, vous êtes probablement mieux d'utiliser un des mécanismes ci-dessus.

Le but principal de l'AIO est donc pour résoudre le problème de disque asynchrone I/O. C'est probablement pourquoi Mac OS X ne supporte AIO pour les fichiers réguliers, et pas de prises de courant (depuis kqueue n'est que tant mieux de toute façon).

Les opérations d'écriture sont généralement toujours mis en cache par le noyau et rincer à une date ultérieure. Par exemple, lorsque la tête de lecture du lecteur qui arrive à passer par l'endroit où le bloc est d'être écrite.

Toutefois, pour les opérations de lecture, si vous souhaitez que le noyau de hiérarchiser les priorités et l'ordre de votre lit, AIO est vraiment la seule option. Voici pourquoi le kernel peut (théoriquement) de le faire mieux que n'importe quel niveau de l'utilisateur de l'application:

  • Le noyau voit tous les I/O disque, et pas seulement vos applications disque emplois, et pouvez les commander à l'échelle mondiale
  • Le noyau (en mai), de savoir où le disque de la tête de lecture est, et peut reprendre la lecture d'emplois vous passer en ordre optimal, pour déplacer la tête de la distance la plus courte
  • Le noyau peut prendre avantage de native command queuing pour optimiser vos opérations de lecture supplémentaire
  • Vous pouvez être en mesure d'émettre de plus des opérations de lecture par système d'appel à l'aide de lio_listio() qu'avec readv(), surtout si votre lit ne sont pas (logiquement) contigus, l'enregistrement d'un tout petit peu de surcoût d'appels système.
  • Votre programme peut être légèrement plus simple avec AIO puisque vous n'avez pas besoin d'un coup de fil à bloc dans une lecture ou d'écriture d'appel.

Cela dit, posix AIO est assez maladroit de l'interface, par exemple:

  • Le seul efficace et bien supporté moyenne de rappels d'événements sont par l'intermédiaire de signaux, ce qui le rend difficile à utiliser dans une bibliothèque, puisqu'il signifie à l'aide du signal de numéros du processus du signal global de l'espace de noms. Si votre système d'exploitation ne prend pas en charge en temps réel des signaux, elle aussi signifie que vous avez à parcourir l'ensemble de vos demandes en suspens à comprendre que l'on fait terminé (c'est le cas pour Mac OS X par exemple, pas de Linux). La capture de signaux dans un environnement multi-thread fait aussi pour des problèmes de restrictions. Vous pouvez généralement pas réagir à l'événement à l'intérieur du gestionnaire de signal, mais vous avez à soulever un signal, écrire à un tuyau ou à l'utilisation signalfd() (sur linux).
  • lio_suspend() a les mêmes problèmes que select (), il ne pas très bien avec le nombre d'emplois.
  • lio_listio(), mis en application dispose d'assez peu de nombre d'emplois que vous pouvez passer, et il n'est pas trivial de trouver cette limite de façon portable. Vous devez appeler sysconf(_SC_AIO_LISTIO_MAX), qui peut échouer, dans ce cas vous pouvez utiliser le AIO_LISTIO_MAX définir, qui ne sont pas nécessairement définies, mais vous pouvez utiliser 2, qui est définie comme la garantie d'être pris en charge.

Comme pour les applications du monde réel à l'aide de posix AIO, vous pouvez prendre un coup d'oeil à lighttpd (lighty), qui a également posté une mesure de la performance lors de l'introduction d'un soutien.

La plupart des plateformes posix prend en charge la norme posix AIO (Linux, BSD, Solaris, AIX, tru64). Windows prend en charge via son superposées fichier I/O. Ma compréhension est que seulement Solaris, Windows et Linux supporte vraiment asynchrone. fichier I/O tout le chemin vers le pilote, tandis que les autres Systèmes d'exploitation émuler la async. I/O avec les threads du noyau. Linux étant l'exception, son posix AIO mise en œuvre dans la glibc, émule des opérations asynchrones avec des threads de niveau utilisateur, alors que son natif async interface I/O (io_submit (), etc.) sont vraiment asynchrone tout le chemin vers le pilote, en supposant que le pilote prend en charge.

Je crois que c'est assez commun parmi les Systèmes d'exploitation ne prennent pas en charge la norme posix AIO pour tout fd, mais de le restreindre à des fichiers normaux.

25voto

Zan Lynx Points 23100

Réseau I/O n'est pas une priorité pour AIO parce que tout le monde écrit POSIX serveurs de réseau utilise un événement, non-blocage de l'approche. L'ancien style Java "des milliards de blocage des threads" approche suce terriblement.

D'écriture sur le disque I/O est déjà amortie et de lecture du disque I/O peuvent être prefetched en mémoire tampon à l'aide des fonctions comme posix_fadvise. Qui laisse directe, sans mémoire tampon e/S de disque que la seule utilité de l'AIO.

Direct, sans tampon d'e/S n'est vraiment utile pour les bases de données transactionnelles, et ceux qui ont tendance à écrire leurs propres threads ou processus pour gérer leur e/s disque.

Ainsi, à la fin, qui laisse POSIX AIO dans la position de ne pas servir à toute fin utile. Ne l'utilisez pas.

11voto

Allen Points 3497

Un développeur de libtorrent fournit un rapport à ce sujet: http://blog.libtorrent.org/2012/10/asynchronous-disk-io/

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X