Forum Linux.debian/ubuntu Vitesse d'envoi de trames ethernet

Posté par  . Licence CC By‑SA.
Étiquettes : aucune
0
19
août
2015

Bonjour à tous !

Voila, j'ai un problème sur lequel je planche depuis quelques temps maintenant et que je n'arrive pas à résoudre. J'ai développé un petit programme (sous Qt), qui se sert de la bibliothèque pcap (pour envoyer des paquets agencés entièrement par mes soins), et qui envoie via l'ethernet ces trames.
Voila mon problème, ces trames sont en fait des images, que je dois donc envoyer à une certaine cadence, qui est sous Linux pas du tout respecté.. je n'envoie ces images (qui ne font que 42ko) à plus de 2 secondes d'intervalle… J'ai donc essayé le même programme sous Windows, qui cette fois-ci, les envoie sans soucis par intervalle de 32ms. Ne pouvant utiliser Windows pour mon application, je me tourne vers vous pour m'aider !!!

Merci d'avance !

  • # Découpage ou UDP/IP

    Posté par  . Évalué à 2.

    Une trame ethernet fait 1500 octets (de mémoire et à peu près), donc il faut découper la trame à la main.

    Pourquoi envoyer les trames à la main ? Pourquoi ne pas faire simplement de l’IP avec de l’UDP ?

    42ko toutes le 32ms ==> 1,28 Mo/s de débit. Sur un réseau local tu as de la marge. Il vaut mieux rester standard pour ne pas dépendre des spécificités du système.

    • [^] # Re: Découpage ou UDP/IP

      Posté par  . Évalué à 1.

      Merci de ta réponse ! Je ne peux malheureusement pas utiliser l'UDP/IP, car la carte électronique à laquelle j'envoie ces trams (made in china..), ne fait que recevoir les paquets, et n'accepte que les trams sous une forme bien spécifique..

      Et la tram entière est d'or et déjà découpé en 98 paquets.

      Je ne pense pas que mon problème vienne de de la forme ou la taille des paquets, juste de la vitesse d'envoi de ceux-ci.. J'ai pensé que ça pouvait venir du pourcentage du CPU attribué à mon programme ?

      • [^] # Re: Découpage ou UDP/IP

        Posté par  . Évalué à 2.

        Quel est le problème de réception ?

        • Les paquets sont-ils mal formés ?
        • Le timing des paquets est-il correct ?

        Tu peux essayer d’envoyer tes paquets répartis de manière uniforme dans le temps :

        toutes les 32ms tu envoies 98 paquets… on va dire 100. Peux-tu émettre un paquet ethernet toutes les 320μs ? (sans déraper dans le temps).

        • [^] # Re: Découpage ou UDP/IP

          Posté par  . Évalué à 1.

          Mon problème ne vient pas de la forme ou de la taille des paquets, exactement le même programme marche parfaitement bien et à la bonne vitesse sous windows. Il marche d'ailleurs aussi bien sous linux, le seul problème et la vitesse de fonctionnement de se programme sous linux.. Les trames sont bien envoyé et sous la bonne forme et tout ce qui va bien, juste pas assez vite du tout.. J'ai essayé de modifier la priorité du processus, cela n'a rien changé..
          Je suis pas certain d'avoir bien exposé mon problème avant :D, c'est pour ça que je permet d'apporter des précisions.

          • [^] # Re: Découpage ou UDP/IP

            Posté par  . Évalué à 2.

            J'ai essayé de modifier la priorité du processus, cela n'a rien changé..

            Attention, le nice ne sert presque à rien… il faut utiliser le scheduler FIFO. man sched_setscheduler passer en mode SCHED_FIFO.

            • [^] # Re: Découpage ou UDP/IP

              Posté par  . Évalué à 2.

              Juste pour précisé, fait gaffe avec le temps réel en mono processeur sur une boucle infini, le process ne rendra jamais la main. Le Ctrl + C devrait fonctionner néanmoins.

        • [^] # Re: Découpage ou UDP/IP

          Posté par  . Évalué à 1.

          Pour expliciter cela, je met ma fonction d'envoi dans le main dans un while(1), le programme ne fait que ca, sans aucune limitation de temps, et celui-ci met quand meme plus de 2 secondes pour 42ko…

          • [^] # Re: Découpage ou UDP/IP

            Posté par  . Évalué à 3.

            le programme ne fait que ca, sans aucune limitation de temps, et celui-ci met quand meme plus de 2 secondes pour 42ko…

            Ouch, il y a un problème. La puissance de la machine émettrice sous Linux ? (je n’y crois pas)

            Pour utiliser la libpcap, j’imagine que le programme est exécuté en root. Donc tu peux passer ton processus sur le scheduler FIFO qui le rendra prioritaire sur tout sauf le noyau. Si tu as plusieurs cores, tu peux également lui assigner un seul core pour l’émission. Ça peut éviter des transfères de RAM fait par le noyau, mais je pense néanmoins que le problème doit-être ailleurs…

            Si tu mets un autre PC sur le réseau et que tu snif les paquets que tu envoie, sont-ils bien de la forme que tu attends ? (Je reviens aux sources car j’ai du mal à voir pourquoi ça ne marcherai pas)

            Le source est-il publiable, histoire de voir s’il n’y aurait pas un loup dedans ?

            • [^] # Re: Découpage ou UDP/IP

              Posté par  . Évalué à 1.

              Je ne crois pas non plus que le problème vienne de la puissance de la machine, je fais tourner linux et Windows sur le même PC en dual boot :P

              Je sniff directement "eth0" avec Wireshark, pour Windows et pour linux, et les paquets sont dans tout les cas de la bonne forme et dans le bon ordre.

              Et effectivement je l’exécute en root.

              • [^] # Re: Découpage ou UDP/IP

                Posté par  . Évalué à 2.

                Tu as dis plus haut que le programme prenait 2s pour envoyer 98 paquets. (Arrête moi si je n’ai pas bien compris)

                Tu peux calculer le temps d’exécution de ta fonction d’envoi. Tu as un exemple ici. Tu peux aussi faire un tableau de toutes tes mesures et faire des stats : min, max, moy…

                Vérifies aussi toutes les sorties des fonctions que tu appelles. Certaines peuvent sortir avec EAGAIN ce qui peut vouloir dire que le processus a été dégager d’un appel système sur réception d’un signal. Dans ce cas, il faut relancer l’appel système.

                • [^] # Re: Découpage ou UDP/IP

                  Posté par  . Évalué à 1.

                  J'ai essayé les fonctions pour passer en SCHED-FIFO, cela donne le même résultat…

                  Je vais regarder au lien que tu m'as donné pour les calculs de temps d'écécution

                • [^] # Re: Découpage ou UDP/IP

                  Posté par  . Évalué à 1.

                  Je viens de suivre la manip du tuto que tu m'as envoyé, j'obtiens bien un peu plus de deux secondes par exécution de la fonction…

                • [^] # Re: Découpage ou UDP/IP

                  Posté par  . Évalué à 1.

                  Je viens de de regarder les temps d'exécution beaucoup plus précisement dans tout le code, et il est répartis proportionnellement sur tout le code, juste trés long.. environ 30ms pour envoyer juste un paquet.

                • [^] # Re: Découpage ou UDP/IP

                  Posté par  . Évalué à 1.

                  Bon, je viens de regarder encore plus précisement sur un paquet le détail de temps d'envois, l'exécution de tout le code se fait rapidement, à une allure normale, c'est le temps d'exécution de la fonction (fp = pcap_open_live) qui dure à peu près 20ms, et celui de (pcap_close(fp)) qui dure à peu près 10ms qui mettent tout ce temps.. Vu qu'elles sont appelées pour chaque paquet à envoyer…

                  • [^] # Re: Découpage ou UDP/IP

                    Posté par  . Évalué à 6.

                    c'est le temps d'exécution de la fonction (fp = pcap_open_live) qui dure à peu près 20ms, et celui de (pcap_close(fp)) qui dure à peu près 10ms qui mettent tout ce temps.. Vu qu'elles sont appelées pour chaque paquet à envoyer…

                    Ouvre ton device au lancement de ton appli et ferme le quand tu n'en as plus besoin, au lieu de le faire pour tous les paquets.

                    • [^] # Re: Découpage ou UDP/IP

                      Posté par  . Évalué à 1.

                      Bonjour !

                      C'est ce que j'ai testé déjà, ça a l'air de fonctionner, j'attend de rentrer à la maison ce soir pour tester sur le raspberry et je te tiens au courant ! Je n'arrive cependant pas encore à 24 images secondes, je suis la à 24 images en 1.8 secondes. Mais je n'ai pas encore essayer avec cette méthode de modifier d'autres paramètres pour booster l'exécution de ce programme.

                  • [^] # Re: Découpage ou UDP/IP

                    Posté par  (site web personnel) . Évalué à 4.

                    Obligé de passer par libpcap?

                    Un accès direct socket(AF_PACKET, SOCK_RAW, IPPROTO_RAW) ne suffit pas ?

                    Cf un exemple commenté.

                    Python 3 - Apprendre à programmer dans l'écosystème Python → https://www.dunod.com/EAN/9782100809141

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.