Quelle est la différence entre "mise en réseau sans copie" et "contournement du noyau"? S'agit-il de deux phrases signifiant la même chose ou différentes? Le contournement du noyau est-il une technique utilisée dans le cadre de la mise en réseau sans copie et telle est la relation?
Quelle est la différence entre "mise en réseau sans copie" et "contournement du noyau"? S'agit-il de deux phrases signifiant la même chose ou différentes? Le contournement du noyau est-il une technique utilisée dans le cadre de la mise en réseau sans copie et telle est la relation?
TL; DR - Ce sont des concepts différents, mais il est fort probable que la copie zéro soit prise en charge dans le framework/API de contournement du noyau.
Contournement utilisateur
Ce mode de communication doit également être envisagé. Il peut être possible pour DMA-à-DMA des transactions qui n'impliquent pas du tout le CPU. L'idée est d'utiliser splice()
ou des fonctions similaires pour éviter l'espace utilisateur du tout. Notez qu'avec splice()
, le flux de données entier n'a pas besoin de contourner l'espace utilisateur. Les en-têtes peuvent être lus dans l'espace utilisateur et les données diffusées directement sur le disque. L'inconvénient le plus courant est que splice()
ne fait pas de déchargement de somme de contrôle.
Zéro copie
Le concept zéro copie est seulement que les tampons réseau sont fixés en place et ne sont pas déplacés. Dans de nombreux cas, ce n'est pas vraiment bénéfique. Le plus moderne matériel réseau prend en charge scatter scatter , également connu sous le nom descripteurs de tampon, etc. L'idée est que le matériel réseau comprend les pointeurs physiques. Le descripteur de tampon se compose généralement de:
L'avantage est que les en-têtes de réseau n'ont pas besoin d'exister côte à côte et [~ # ~] ip [~ # ~] , [~ # ~] tcp [~ # ~] , et Application les en-têtes peuvent résider physiquement séparément des données d'application.
Si un contrôleur ne prend pas en charge cela, les en-têtes TCP/IP doivent précéder les données utilisateur afin qu'ils puissent être remplis avant d'être envoyés à = contrôleur réseau.
zéro copie implique également un utilisateur du noyau MMU configuration pour que les pages soient partagées.
Contournement du noyau
Bien sûr, vous pouvez contourner le noyau. C'est ce que pcap et d'autres logiciels renifleurs font depuis un certain temps. Cependant, il est difficile de voir un cas où espace utilisateur aura une victoire définitive à moins qu'il ne soit lié au matériel particulier. Certains contrôleurs de réseau peuvent avoir scatter scatter pris en charge par le contrôleur et d'autres pas.
Il existe différentes incarnations d'interfaces du noyau pour effectuer le contournement du noyau.
Pour mettre cela ensemble ...
S'agit-il de deux phrases signifiant la même chose ou différentes?
Ils sont différents, comme expliqué ci-dessus, espérons-le.
Le contournement du noyau est-il une technique utilisée dans le cadre de la mise en réseau sans copie et telle est la relation?
C'est le contraire. Le contournement du noyau peut utiliser zéro copie et le supportera très probablement car les tampons sont complètement sous le contrôle de l'application. De plus, il n'y a pas de partage de mémoire entre le noyau et l'espace utilisateur (ce qui signifie pas besoin de MMU pages partagées et quels que soient les effets de cache/TLB qui peuvent en résulter). Donc, si vous utilisez contournement du noyau, il sera souvent avantageux de supporter zéro copie; donc les choses peuvent sembler les mêmes au premier abord.
Si scatter-recueillir DMA est disponible (la plupart des contrôleurs modernes), l'espace utilisateur ou le noyau peut l'utiliser. zéro copie n'est pas aussi utile dans ce cas.
Référence:
Réseau sans copie
Vous faites un réseau sans copie lorsque vous ne copiez jamais les données entre l'espace utilisateur et l'espace noyau (je veux dire l'espace mémoire). Par exemple:
Langage C recv(fd, buffer, BUFFER_SIZE, 0);
Par défaut, les données sont copiées:
buffer
, qui se trouve dans l'espace utilisateur.Avec la méthode de copie nulle, les données ne sont pas copiées et arrivent dans l'espace utilisateur directement à partir de la pile réseau.
Contournement du noyau
Le contournement du noyau est lorsque vous gérez vous-même, dans l'espace utilisateur, la pile réseau et les éléments matériels. C'est difficile, mais vous gagnerez beaucoup de performances (il n'y a pas de copie, car toutes les données sont dans l'espace utilisateur). Ce lien pourrait être intéressant si vous souhaitez plus d'informations.
Lors de la transmission et de la réception de paquets, toutes les données des paquets doivent être copiées des tampons ser-space vers kernel-space pour la transmission et vice versa pour la réception. Un pilote zero-copy évite cela en ayant de l'espace utilisateur et le pilote partage directement la mémoire tampon du paquet.
Au lieu d'avoir les points transmettre et recevoir vers les tampons dans l'espace du noyau qui nécessiteront plus tard de copier, une région de mémoire dans l'espace utilisateur est allouée et mappée sur une région donnée de mémoire physique, à partager entre les tampons du noyau et les tampons de l'espace utilisateur, puis pointer chaque tampon de descripteur vers sa place correspondante dans la mémoire nouvellement allouée.
DPDK et RDMA sont d'autres exemples de contournement du noyau et de copie nulle. Lorsqu'une application utilise DPDK, elle contourne la pile TCP/IP du noyau. L'application crée les trames Ethernet et le NIC saisissant ces trames avec DMA directement à partir de la mémoire de l'espace utilisateur, donc c'est zéro copie car il n'y a pas de copie de l'espace utilisateur dans l'espace du noyau. Les applications peuvent faire des choses similaires avec RDMA. L'application écrit dans des paires de files d'attente que le NIC accède directement et transmet. Les iblibverbs RDMA sont également utilisés à l'intérieur du noyau, donc lorsque iSER utilise RDMA ce n'est pas un contournement du noyau mais c'est zéro copie.
https://www.openfabrics.org/index.php/openfabrics-software.html