Bonjour amis agrumes,
j'écris un script qui doit permettre de relever certains indicateurs réseaux sur un lien en utilisant l'outil iperf3. Actuellement il y a deux machines que je vais noter A et B. B avec l'adresse ip 192.168.1.138 joue le rôle de serveur et A avec l'ip 192.168.1.91 joue le rôle de client.
Sur le serveur j'ai un script bash qui ouvre mon logiciel iperf sur un ensemble de serveurs
1 2 3 4 | for j in `seq 5000 5020` do /home/pi/rpi_scripts/iperf3 -s -i 1 -p $j done |
Ensuite sur mon ordinateur qui sert de client j'ai crée un un thread qui exécute cette méthode
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | def iperf(self): """Brief: effectue des mesures sur la sonde ciblée en testant un ensemble de ports et renvoie la gigue et le taux de perte""" # Variable qui va permettre d'arrêter le parcours des ports dès # que l'un d'entre eux aura permis de faire les mesures ok = False with self.lock: for port in range(self.start_port, self.end_port + 1): iperf_command = os.popen('iperf3 -c {} -u -b {} -p {} -t {}'. format(self.ip, BANDWIDTH, port, DURATION)) result = iperf_command.read() # S'il y a une erreur dans l'exécution de la commande, on passe # l'itération suivante if result.find('error') != -1: continue # S'il n'y a pas d'erreur, on analyse le résultat result_lines = result.split('\n') for line in result_lines: if re.search(r'/sec (.*) ms (\d+)/(\d+) (.*)', line): kpi_search = re.search(r'/sec (.*) ms (\d+)/(\d+) \((.*)%\)', line) jitter = kpi_search.group(1) packet_loss = kpi_search.group(4) ok = True # Si on a pu mesurer les indicateurs, il est inutile de parcourir # les autres ports if ok: break # Si les mesures se sont bien passés, on retourne les indicateurs if ok: return jitter, packet_loss # Sinon on retourne un message d'erreur else: return "Impossible de mesurer les indicateurs gigue et taux " \ "de perte sur l'adresse ip {}".format(self.ip) |
Ensuite je fais des tests
1 2 3 4 5 6 7 8 9 10 11 12 | if __name__ == '__main__': thread1 = Measure('192.168.1.138', 5000, 5020) thread2 = Measure('192.168.1.138', 5000, 5020) thread3 = Measure('192.168.1.138', 5000, 5020) # on lance les thread thread1.start() thread2.start() thread3.start() # On attend qu'ils se terminent ensemble thread1.join() thread2.join() thread3.join() |
Et j'obtiens le résultat suivant
1 2 3 4 5 6 7 8 | Thread-2 latency: 3.887 error: Impossible de mesurer les indicateurs gigue et taux de perte sur l'adresse ip 192.168.1.138 Thread-3 latency: 4.618 error: Impossible de mesurer les indicateurs gigue et taux de perte sur l'adresse ip 192.168.1.138 Thread-1 pl: 0 latence: 3.298 gigue: 7.516 |
En gros, le résultat ne marche que sur un thread, pourtant j'ai bien utilisé un verrou pour éviter d'éventuels soucis de concurrence. A noter que j'ai une autre méthode, le ping qui s'exécute normalement (et me renvoie la latence) sans même que j'ai à utiliser un verrou. Peut-être le problème ne viendrait pas de python mais du logiciel en lui-même?
Bref je suis ouvert à toute suggestion