11
votes

L'état de Linux Async io?

Je demande ici depuis que Google vous mène sur un joyeux voyage autour des archives sans indice de quoi l'état actuel est. Si vous allez par Google, il semble que Async io était toute la rage en 2001 à 2003, et d'ici 2006, des trucs similaires comme Epoll et libaïio se tournaient; Kevent est apparu mais semble avoir disparu, et autant que je puisse dire, il n'y a toujours pas bonne moyen de mélanger la signalisation basée sur les acheminées et à la base de l'emploi, async Envoyer - Est-ce que même possible? - et tout le reste dans une boucle d'événement à un seul fileté.

Alors s'il vous plaît dites-moi que je me trompe et que tout est rose! - et, surtout, quelles API à utiliser.

Comment Linux est-il comparable à FreeBSD et à d'autres systèmes d'exploitation à cet égard?


2 commentaires

MM, peut-être que vous devriez mettre votre costume flamme et demander à LKML.


Voir blog.libtorrent.org/2012/10/ASYNCHRONOUS-DISK-IO < / a>


4 Réponses :


3
votes

disque asynchrone io est en vie et de frapper ... il est effectivement soutenu et fonctionne raisonnablement bien maintenant, mais a des limitations importantes (mais avec suffisamment de fonctionnalités que certains des principaux utilisateurs peuvent l'utiliser - par exemple, l'innoDB de MySQL fait dans le dernière version).

Disque asynchrone IO est la possibilité d'appeler des opérations de disque io de manière non bloquante (dans un seul fil) et d'attendre qu'ils se terminent. Cela fonctionne bien, http://lse.sourceforge.net/io/aio.html a plus d'informations.

AIO suffit pour une application typique (serveur de base de données) pour pouvoir l'utiliser. L'AIO est une bonne alternative à la création de beaucoup de threads faisant synchrones IO ou d'utiliser Scatter / Rassembler dans la famille PaRV d'appels système qui existent maintenant.

Il est possible de faire une "liste d'achats" emploi synchrone IO utilisant le nouvel appel PaRevv où le noyau ira et obtiendra une bande de pages de différents compensations dans un fichier. Ceci est correct tant que vous n'avez qu'un seul fichier à lire. (NB: La fonction d'écriture équivalente existe).

Sondage, Epoll, etc., sont simplement des façons de faire de la sélection () qui souffrent de moins de limitations et de problèmes d'évolutivité - ils peuvent ne pas être en mesure d'être mélangés avec le disque AIO facilement, mais dans une application réelle, vous pouvez probablement Voyez-vous autour de cela assez trivialement en utilisant des threads (certains serveurs de base de données ont tendance à effectuer ce type d'opérations dans des threads distincts de toute façon). Le sondage est bon, Epoll est préférable, pour un grand nombre de descripteurs de fichiers. Select () est aussi ok pour un petit nombre de descripteurs de fichiers (ou spécifiquement, les numéros de descripteur de fichiers faibles).


3 commentaires

alors où est-ce que cela stand? Stackoverflow.com/Questtions/1825621/...


(Je pensais que le sondage et le sélection étaient symétriques et o (n), alors que l'époll est O (1)


Le sondage est meilleur que SELECT, car cela fonctionne beaucoup mieux avec un ensemble de descripteurs de fichiers, disons que vous souhaitez interdire 10 FDS sur 10000 ouverts, vous n'avez pas besoin d'un tableau de 10000 entrées à être initialisées avec des zéros. Epoll est meilleur parce que vous n'avez besoin que d'enregistrer les nouveaux FDS qui vous intéresse, ne pas passer dans tous ceux que vous regardiez déjà.



2
votes

La plupart de ce que j'ai appris sur les E / S asynchrones à Linux se trouvaient sur le source LightPD Source . Il s'agit d'un serveur Web à une seule-filetage qui gère de nombreuses connexions simultanées à l'aide de ce qu'elle croit est le meilleur de tout mécanisme d'E / S asynchrone disponible sur le système d'exécution. Jetez un coup d'œil à la source, il prend en charge Linux, BSD et (je pense) quelques autres systèmes d'exploitation.


0 commentaires

6
votes

AIO en tant que telle est encore un peu limité et une vraie douleur pour commencer avec, mais ce genre d'œuvres pour la plupart, une fois que vous avez creusé à travers elle.

Il a quelques-uns à mon avis sérieux bugs, mais ce sont vraiment caractéristiques. Par exemple, lors de la présentation d'une certaine quantité de commandes ou de données, votre fil de soumission bloquera. Je ne me rappelle pas la justification exacte de cette fonction, mais la réponse que je suis arrivé à l'époque était quelque chose comme « oui bien sûr, le noyau a une limite sur la taille de la file d'attente, qui est comme prévu ». Ce qui est acceptable si vous soumettez quelques milliers de demandes ... de toute évidence, il doit y avoir une part limite. Il peut être judicieux d'un point de vue DoS aussi (sinon un programme malveillant pourrait forcer le noyau à manquer de mémoire en affichant un milliard de demandes). Mais encore, il est quelque chose que vous pouvez rencontrer de façon réaliste avec des chiffres « normaux » (une centaine) et il te frappera de façon inattendue, ce qui est pas bon. De plus, si vous ne soumettez une demi-douzaine de demandes et ils sont un peu plus grand (quelques méga-octets de données), la même chose peut arriver, apparemment parce que les pauses du noyau-les dans les sous-requêtes. Ce qui, encore une fois, une sorte de sens de marques, mais de voir comment les documents ne vous disent pas, il faut attendre qu'il ne fait aucune différence (en dehors de prendre plus de temps) si vous avez lu 500 octets ou 50 méga-octets de données.

En outre, il semble y avoir aucun moyen de faire tampon AIO, au moins sur l'un de mes systèmes Debian et Ubuntu (bien que je l'ai vu d'autres gens se plaignent du contraire, à savoir en fait écrit unbuffered passant par les tampons) . D'après ce que je peux voir sur mes systèmes, AIO n'est vraiment asynchrone avec mise en mémoire tampon désactivé, ce qui est une honte (c'est pourquoi j'utilise actuellement une construction laide autour de la cartographie de la mémoire et un thread de travail à la place).

Une question importante avec tout asynchrone est d'être capable de epoll_wait () sur elle, ce qui est important si vous faites quoi que ce soit d'autre part à partir du disque IO (tels que la réception du trafic réseau). Bien sûr, il est io_getevents, mais il est pas souhaitable / utile, car il ne fonctionne que pour une chose singulière.

Dans les noyaux récents, il y a un soutien pour eventfd . A première vue, il paraît inutile, car il est pas évident comment il peut être utile de quelque façon. Cependant, à votre secours, il y a la fonction non documentée io_set_eventfd qui vous permet de AIO associer à une eventfd, qui est epoll_wait () - mesure. Vous devez fouiller dans les en-têtes pour savoir à ce sujet, mais il est bien là, et il fonctionne très bien.


8 commentaires

Je suppose que cela fait référence au noyau AIO par opposition à POSIX AIO?


@Janustroelsen: Oui, comme la question, cela fait référence au noyau AIO ( libaïio ). POSIX AIO n'est pas tellement une fonctionnalité Linux, mais une fonction de bibliothèque implémentée dans Librt à l'aide d'un pool de threads et d'E / S synchrones standard. Étonnamment, cela fonctionne Beaucoup mieux que la mise en œuvre du noyau, à tous égards.


@DAMON: POSIX AIO est plus facile, mais quelle est votre preuve qu'il "fonctionne beaucoup meilleur"? Ma compréhension est que, en supposant que cela soit utilisé correctement ( o_direct sur les systèmes de fichiers qui le prennent en charge), le noyau AIO est plus rapide avec une utilisation plus faible des ressources (principalement parce qu'il n'a pas besoin de créer et de gérer une piscine de fil) . Bien sûr, Posix Aio est plus portable, mais lorsque vous utilisez une technique, vous vous souciez généralement de la performance et de l'utilisation des ressources avant tout, et le noyau AIO est censé être meilleur pour cela.


@Shadowranger: Le point de l'AIO est asynchrone sans blocage. POSIX AIO fournit exactement que le noyau AIO ne fonctionne pas (et que Windows n'est pas non plus, à la manière!). Être "plus rapide" n'est pas une priorité de l'AIO car elle n'est généralement pas plus rapide, mais plus lente. Il y a des exceptions notables, par exemple Lire une fois de première fois séquentielle, lire des lecteurs optiques, dans ce cas, l'AIO est en effet beaucoup plus rapide. Dans chaque cas "normal", c'est des ordres de grandeur plus lentement. C'est bon, puisque asynchrone est ce qui est souhaité et important, pas rapide . Maintenant, Kernel Aio Blocs à des moments inappropriés, ....


... tandis que Posix Aio n'est pas, ce qui est beaucoup mieux. De plus, il utilise le cache tampon et est donc (dans le cas normal, moyen) beaucoup plus rapidement. Donc, dans l'ensemble, même si POSIX est une "mise en œuvre de l'embarras" avec des threads faisant des lectures / écritures normales simples, il est néanmoins beaucoup mieux. Si la prise en charge du cache tampon l'a fait dans le noyau (la proposition a été sortie depuis une décennie ou donc, mais à ma connaissance n'est toujours pas acceptée), cela pourrait être à la vitesse de vitesse.


@DAMON "Si la prise en charge du cache tampon l'a fait dans le noyau [...]" J'hésite parce que vous avez eu des expériences amères d'E / S Linux Async (et que vos espoirs se précipitaèrent avant) mais peut-être io_uring (introduit dans le noyau 5.1) offre un rayon d'espoir pour l'avenir de l'AIO Linux?


@Anon: a l'air génial, n'a besoin que d'une distribution maintenant où je n'ai pas à construire le noyau de la source. Je suppose que 1 à 2 ans, je suppose ... mais improv improviste. Merci pour l'information.


La file d'attente peut bloquer, mais vous pouvez spécifier le nombre de événements maximum souhaité à enquacer avec io_SetUp (). Tant que vous savez ce que ce nombre est et que vous n'essayez jamais d'en faire plus que ce nombre d'événements, tout ira bien. Voir man 3 io_setup .