Motivation
Avec un taux de signalisation de 480 Mbits / s, les périphériques USB 2.0 devraient pouvoir transmettre des données à 60 Mo / s maximum. Cependant, les appareils actuels semblent limités à 30-42 Mo / s lors de la lecture de [ Wiki: USB ]. Cela représente 30% de frais généraux.
L'USB 2.0 est un standard de facto pour les périphériques externes depuis plus de 10 ans. Le stockage portable est l’une des applications les plus importantes de l’interface USB. Malheureusement, l'USB 2.0 a rapidement constitué un goulot d'étranglement limitant la vitesse de ces applications exigeantes en bande passante. Un disque dur actuel est par exemple capable de lire plus de 90 Mo / s en lecture séquentielle. Compte tenu de la présence de longue date sur le marché et du besoin constant de bande passante supérieure, nous nous attendons à ce que le système éco USB 2.0 ait été optimisé au fil des ans et ait atteint une performance de lecture proche de la limite théorique.
Quelle est la bande passante maximale théorique dans notre cas? Chaque protocole a un surcoût, y compris USB et, conformément à la norme officielle USB 2.0, 53,248 Mo / s [ 2 , Tableau 5-10]. Cela signifie théoriquement que les périphériques USB 2.0 actuels pourraient être 25% plus rapides.
Une analyse
Pour vous rapprocher de la racine de ce problème, l’analyse suivante montrera ce qui se passe sur le bus lors de la lecture de données séquentielles à partir d’un périphérique de stockage. Le protocole est divisé couche par couche et nous nous intéressons plus particulièrement à la question de savoir pourquoi 53,248 Mo / s est le nombre théorique maximal de périphériques montants en vrac. Enfin, nous parlerons des limites de l’analyse qui pourraient nous donner des indices de frais généraux supplémentaires.
Remarques
Tout au long de cette question, seuls les préfixes décimaux sont utilisés.
Un hôte USB 2.0 est capable de gérer plusieurs périphériques (via des concentrateurs) et plusieurs terminaux par périphérique. Les points d'extrémité peuvent fonctionner dans différents modes de transfert. Nous limiterons notre analyse à un seul périphérique directement connecté à l'hôte et capable d'envoyer en continu des paquets complets sur un noeud final en vrac en mode haute vitesse.
Encadrement
La communication USB haute vitesse est synchronisée dans une structure de trame fixe. Chaque trame a une longueur de 125 us et commence par un paquet de début de trame (SOF). Elle est limitée par une séquence de fin de trame (EOF). Chaque paquet commence par SYNC et se termine par et End-Of-Packet (EOF). Ces séquences ont été ajoutées aux diagrammes pour plus de clarté. EOP est de taille variable et dépend des données de paquet. Pour SOF, il s'agit toujours de 5 octets.
Ouvrez l'image dans un nouvel onglet pour voir une version plus grande.
Transactions
USB est un protocole piloté par un maître et chaque transaction est initiée par l'hôte. L’intervalle de temps entre SOF et EOF peut être utilisé pour les transactions USB. Cependant, le calendrier des SOF et des EOF est très strict et l’hôte n’initie que des transactions pouvant être entièrement exécutées dans le créneau disponible.
La transaction qui nous intéresse est une transaction en bloc réussie. La transaction commence par un paquet de jetons IN, puis les hôtes attendent un paquet de données DATA0 / DATA1 et confirment la transmission avec un paquet de prise de contact ACK. L'EOP pour tous ces paquets est compris entre 1 et 8 bits, en fonction des données de paquet, nous avons supposé le cas le plus défavorable ici.
Entre chacun de ces trois paquets, nous devons tenir compte des temps d’attente. Celles-ci se situent entre le dernier bit du paquet IN provenant de l'hôte et le premier bit du paquet DATA0 du périphérique et entre le dernier bit du paquet DATA0 et le premier bit du paquet ACK. Nous n’avons pas à prendre en compte d’autres retards car l’hôte peut commencer à envoyer le prochain IN juste après l’envoi d’un ACK. Le temps de transmission par câble est défini à 18 ns au maximum.
Un transfert en masse peut envoyer jusqu'à 512 octets par transaction IN. Et l'hôte essaiera d'émettre autant de transactions que possible entre les délimiteurs de trame. Bien que le transfert en vrac ait une priorité basse, il peut prendre tout le temps disponible dans un créneau lorsqu'aucune autre transaction n'est en attente.
Pour garantir une récupération d’horloge correcte, les normes définissent un bourrage de bits d’appel de méthode. Lorsque le paquet nécessite une très longue séquence de la même sortie, un flanc supplémentaire est ajouté. Cela garantit un flanc après un maximum de 6 bits. Dans le pire des cas, la taille totale du paquet augmenterait de 7/6. L'EOP n'est pas sujet au bourrage.
Ouvrez l'image dans un nouvel onglet pour voir une version plus grande.
Calculs de bande passante
Une transaction en bloc IN a un temps système de 24 octets et une charge utile de 512 octets. C'est un total de 536 octets. La plage horaire comprise entre 7487 octets est large. Sans avoir besoin de bits, il reste de la place pour 13.968 paquets. Avec 8000 Micro-images par seconde, nous pouvons lire les données avec 13 * 512 * 8000 B / s = 53.248 Mo / s.
Pour des données totalement aléatoires, nous nous attendons à ce qu'un bourrage de bits soit nécessaire dans l'une des 2 ** 6 = 64 séquences de 6 bits consécutifs. C'est une augmentation de (63 * 6 + 7) / (64 * 6). En multipliant tous les octets sujets au bourrage sur les bits, vous obtenez une longueur totale de transaction de (19 + 512) * (63 * 6 + 7) / (64 * 6) + 5 = 537,38 octets. Ce qui donne 13.932 paquets par Micro-Frame.
Un autre cas particulier manque dans ces calculs. La norme définit un temps de réponse maximal du dispositif de 192 temps de bit [ 2 , chapitre 7.1.19.2]. Ceci doit être pris en compte pour décider si le dernier package s’intègre toujours dans la trame au cas où le dispositif aurait besoin du temps de réponse complet. Nous pourrions en tenir compte en utilisant une fenêtre de 7439 octets. La bande passante résultante est cependant identique.
Ce qui reste
La détection d'erreur et la récupération n'ont pas été couvertes. Peut-être que les erreurs sont assez fréquentes ou que la récupération d’erreur prend suffisamment de temps pour avoir un impact sur les performances moyennes.
Nous avons supposé une réaction instantanée de l'hôte et du périphérique après les paquets et la transaction. Personnellement, je ne vois pas le besoin de grosses tâches de traitement à la fin des paquets ou des transactions de part et d’autre et je ne vois donc aucune raison pour laquelle l’hôte ou le périphérique ne serait pas en mesure de répondre instantanément avec des implémentations matérielles suffisamment optimisées. Surtout en fonctionnement normal, la plupart des tâches de tenue de livre et de détection d'erreur peuvent être effectuées pendant la transaction et les paquets et la transaction suivants peuvent être mis en file d'attente.
Les transferts pour d'autres points de terminaison ou des communications supplémentaires n'ont pas été pris en compte. Peut-être que le protocole standard pour les périphériques de stockage nécessite une communication à canal latéral continu qui consomme un temps précieux.
Il peut y avoir une surcharge de protocole supplémentaire pour les périphériques de stockage pour le pilote de périphérique ou la couche de système de fichiers. (charge utile du paquet == données de stockage?)
Question
Pourquoi les implémentations actuelles ne sont-elles pas capables de diffuser en continu à 53 Mo / s?
Où est le goulot d'étranglement dans les implémentations d'aujourd'hui?
Et un suivi potentiel: pourquoi personne n’a-t-il tenté de supprimer un tel goulet d’étranglement?