Je pars de loin. L'hiver dernier, il m'est arrivé de fabriquer un périphérique USB avec un noyau hébergé dans le FPGA. Bien sûr, je voulais vraiment vérifier la bande passante réelle de ce bus. Après tout, dans le contrôleur - il y a trop à faire. Vous pouvez toujours dire qu'il y a un retard, ou là-bas. Dans le cas des FPGA, je vois un bloc de données de pompage, alors il m'a dit qu'il y avait des données dedans. Mais j'ai défini que tout a été traité et je suis prêt à accepter une nouvelle portion (en même temps, il reçoit déjà des données dans le deuxième tampon du même point de terminaison). Très bien, définissez la préparation dès la toute première mesure et voyez ce qui se passe lorsque l'USB peut «marteler» sans s'arrêter.

Mais cela s'avère une chose incroyable. Si le périphérique USB 2.0 est coincé dans le connecteur «bleu» (qui est USB 3.0), la vitesse est de un. Si en "noir" - un autre. Voici mon graphique de la vitesse d'enregistrement USB en fonction de la longueur des données. USB3 et USB2 sont le type de connecteur; l'appareil est toujours USB 2.0 HS.

J'ai essayé sur différentes machines. Le résultat est proche. Personne ne pouvait m'expliquer ce phénomène. Plus tard, j'ai trouvé la raison la plus probable. Et la raison est très simple. Voici les propriétés du contrôleur USB 2.0:

Les contrôleurs contrôlant le connecteur «bleu» ne le font pas. Et la différence n'est que d'environ 20%.
Nous en concluons que les limitations de bande passante ne sont pas toujours déterminées par les propriétés physiques du bus. Parfois, d'autres choses se superposent. Nous passons avec cette connaissance ces jours-ci.
Expérience primaire
Alors. Tout a commencé assez banal. Il y avait une vérification d'un programme. Le processus d'écriture simultanée des données sur plusieurs disques a été vérifié. Le matériel est simple: il y a une carte mère avec quatre slots PCIe. Des cartes absolument identiques avec des contrôleurs AHCI sont insérées dans tous les emplacements, chacun prenant en charge exclusivement PCIe x1.

Chaque carte sert 4 disques.
Et puis l'effet suivant est révélé. Nous prenons un disque et commençons à y écrire des données. Nous obtenons une vitesse de 180 à 220 mégaoctets par seconde (ci-après, les mégaoctets sont 1024 * 1024 octets):

Nous prenons le deuxième disque. La vitesse d'écriture est de 170 à 190 Mo / s:

Nous écrivons immédiatement aux deux - nous obtenons un ralentissement de la vitesse:

La vitesse totale est d'environ 290 Mo / s. Mais ce qui est étonnant, c'est que nous avons débogué (donc il s'est avéré) ce programme sur les mêmes disques, mais sur d'autres canaux. Et tout allait bien là-bas. Nous transférons rapidement vers ces canaux (ils passeront par une autre carte), nous obtenons un excellent travail:

Je vais acheter une fente dans un bon quartier
Je dois dire tout de suite que cela ne vaut pas la peine de tout blâmer sur les composants de quelqu'un d'autre. Tout ici est écrit par nous, à partir du programme lui-même, se terminant par les pilotes. Ainsi, l'ensemble du chemin de données peut être surveillé. L'inconnu ne vient que lorsque la demande a été envoyée au matériel.
Après l'analyse initiale, il s'est avéré que la vitesse n'est pas limitée dans les «longs» emplacements PCIe et est limitée dans les «courts». Les longues sont où vous pouvez insérer des cartes x16 (bien que l'une d'entre elles fonctionne en mode non supérieur à x4), et les courtes sont uniquement pour les cartes x1.

Tout irait bien, mais les contrôleurs des cartes actuelles ne peuvent en principe pas fonctionner dans un mode autre que PCIex1. Autrement dit, tous les contrôleurs doivent être dans des conditions absolument identiques, quelle que soit la longueur de l'emplacement! Mais non. Qui vit dans le "long" - travaille vite, qui dans le "court" - lentement. Bon. Et rapide - à quelle vitesse? Ajoutez un troisième lecteur, écrivez sur les trois.
Dans les créneaux "courts", la limite est toujours aux alentours de 290 Mo / s:

Dans le "long" - dans la région de 400 Mo / s:


J'ai fouillé tout Internet. Premièrement, après un certain temps, j'ai déjà ri d'articles qui disent que le débit de PCIe gen 1 et gen 2 pour x1 est de 250 et 500 Mo / s. Ce sont des mégaoctets bruts. En raison de la surcharge (j'utilise ce mot non russe pour désigner un échange de services qui va dans le même sens que les données principales) pour la génération 2, nous obtenons exactement 400 mégaoctets par seconde de flux utile. Deuxièmement, je ne pouvais obstinément rien trouver sur le nombre magique 290 (regarder vers l’avenir - je ne l’ai toujours pas trouvé).
Super. Essayer de regarder la topologie de l'inclusion de nos contrôleurs. Le voici (013-015 - ce sont les suffixes de nom de périphérique par lesquels je les ai comparés afin de les distinguer). Le vert est rapide, le rouge est lent.

Le contrôleur "015" nous ne considérons même pas. Il vit dans une fente privilégiée conçue pour une carte vidéo. Mais le 013rd est connecté au même commutateur que le 012nd à partir du 014th. En quoi est-il différent?
Certains articles disent que différentes cartes peuvent différer dans les paramètres de Max Payload. J'ai étudié l'espace de configuration de toutes les cartes - ce paramètre est pour tout le monde dans la même valeur minimale possible. De plus, la documentation du chipset de cette carte mère indique qu'il ne peut y avoir d'autre sens.

En général, j'ai fouillé tout dans l'espace de configuration - tout est configuré de manière identique. Et la vitesse est différente! Relisez à plusieurs reprises la documentation du chipset - pas de paramètres de bande passante. Priorités - oui, quelque chose a été écrit à leur sujet, mais les tests sont effectués en l'absence totale de charge sur d'autres canaux! Autrement dit, ce n'est pas en eux.
Au cas où, j'aurais même désactivé le programme d'interruption. La charge du processeur a augmenté à des niveaux insensés, car maintenant, il lit constamment stupidement le bit de préparation, mais les lectures de vitesse n'ont pas changé. Il est donc impossible de blâmer ce sous-système pour des problèmes.
Et les autres planches?
Nous avons essayé de changer exactement la même carte mère. Pas de changement. Ils ont essayé de remplacer le processeur (il y avait des raisons de croire qu'il s'agissait d'un détournement). De plus, aucun changement de vitesse (mais l'ancien processeur est vraiment indésirable). Nous avons installé une carte mère de nouvelle génération - tout vole simplement sur tous les emplacements. De plus, la vitesse maximale n'est plus de 400, mais 418 mégaoctets par seconde, même dans des créneaux «longs», voire «courts»:

Mais ici - pas de miracles. Avec le mouvement habituel de la main (déjà utilisé de nos jours), nous lisons l'espace de configuration et voyons que le paramètre Max Payload est défini non pas sur 128, mais sur 256 octets.
Plus grande taille de paquets - moins de paquets. Moins de surcharge pour les envoyer - des données plus utiles parviennent à s'exécuter en même temps. C'est vrai.
Alors, qui est à blâmer?
Je ne donnerai pas de réponse exacte à la question du titre, en référence aux documents. Mais ma pensée a suivi le chemin suivant: disons que la restriction de flux est définie à l'intérieur du chipset. Il ne peut pas être programmé, il est bien réglé, mais il l'est. Par exemple, il est égal à 290 mégaoctets par seconde pour chaque diff. un couple. Plus - il est déjà coupé quelque part à l'intérieur du chipset sur ses mécanismes internes. Par conséquent, dans la fente "longue" (où vous pouvez coller des cartes jusqu'à x4), rien n'est coupé pour notre carte à l'intérieur du chipset, et nous nous appuyons sur la limite physique du bus x1. Dans le connecteur «court», nous rencontrons cette limitation.
En fait, vérifier cela n'est pas facile, mais très simple. Nous restons dans le 013e emplacement non pas AHCI, mais le contrôleur SAS, qui dessert 8 disques à la fois et peut fonctionner en modes PCIe jusqu'à x4. Nous y connectons 4 disques SSD intelligents. Nous regardons la vitesse d'enregistrement - autant que l'âme se réjouit:

Maintenant, nous ajoutons ces 4 disques qui sont apparus lors des premiers tests. Les performances du SSD ont diminué de façon prévisible:

Nous calculons la vitesse totale passant par le contrôleur SAS, nous obtenons 1175 mégaoctets par seconde. Divisez par 4 (tant de lignes vont à la fente "longue"), nous obtenons ... Roulement de tambour ... 293 mégaoctets par seconde. Quelque part, j'ai déjà vu ce numéro!
Ainsi, dans le cadre de ce projet, il a été prouvé que le problème ne vient pas de notre programme ou pilote, mais des étranges limitations du chipset, qui sont probablement "câblées" étroitement. La méthodologie de sélection des cartes mères pouvant être utilisées dans le projet a été développée. Mais en général, nous tirons les conclusions suivantes.
Conclusion
- Souvent dans la vie réelle, l'équipement a moins de performances que théoriquement possible. Des restrictions peuvent même être imposées par les pilotes, comme illustré dans le cas de l'USB. Parfois, il est possible de récupérer du matériel qui (ou dont les conducteurs) ne sont pas soumis à de telles restrictions.
- Les limitations peuvent même être non documentées, mais clairement exprimées.
- Beaucoup d'articles qui disent qu'une paire différentielle de gen PCIe. 1 et gen 2 donne environ 250 et 500 mégaoctets par seconde, sont erronés. Ils copient la même erreur les uns des autres - un mégaoctet de données brutes par seconde. Les frais généraux s'accumulent à plusieurs niveaux de l'interface. Avec une charge utile maximale de 128 octets, PCIe gen2 obtient environ 400 mégaoctets par seconde. Dans les nouvelles générations PCIe, tout devrait être un peu mieux, car l'encodage physique n'est pas 8b / 10b, mais plus économique, mais jusqu'à présent, aucun contrôleur de disque n'a été trouvé sur lequel tester cela en pratique.