Wie lassen sich viele Netzwerkgeräte am besten parallel anpingen?

7

Ich lese viele Geräte im Netzwerk (mehr als 300) durch wiederholtes Ping ab.

Das Programm fragt die Geräte nacheinander ab, also ist es langsam. Ich möchte die Geschwindigkeit der Umfrage erhöhen.

Es gibt einige Möglichkeiten, dies in Delphi 7 zu tun:

  1. Jedes Gerät hat einen Thread, der ping ausführt. Verwalten Sie Threads manuell.
  2. Lerne und benutze Indy 10. Brauche Beispiele.
  3. Verwenden Sie überlappende E / A basierend auf Fenstermeldungen.
  4. Verwenden Sie Completion-Ports basierend auf Ereignissen.

Was ist schneller, einfacher? Bitte geben Sie einige Beispiele oder Links an.

    
Dr.eel 03.02.2011, 13:27
quelle

6 Antworten

9

Das Überfluten des Netzwerks mit ICMP ist keine gute Idee.

Sie möchten vielleicht eine Art Thread-Pool in Erwägung ziehen und die Ping-Anfragen in eine Warteschlange stellen und eine feste Anzahl von Threads für die Anfragen haben.

    
Lloyd 03.02.2011 14:20
quelle
6

Ich persönlich würde mit IOCP gehen. Ich verwende das sehr erfolgreich für die Transport-Implementierung in NexusDB.

Wenn Sie 300 Sende- / Empfangszyklen mit blockierenden Sockets und parallelen Threads durchführen möchten, benötigen Sie 300 Threads.

Wenn Sie bei IOCP die Sockets mit dem IOCP verknüpft haben, können Sie die 300 Sendevorgänge ausführen, und sie werden sofort zurückkehren, bevor der Vorgang abgeschlossen ist. Wenn die Operationen abgeschlossen sind, werden sogenannte Completion-Pakete in die IOCP eingereiht. Sie haben dann einen Pool von Threads, der auf dem IOCP wartet, und das OS weckt sie auf, wenn die Completion-Pakete eingehen. Als Reaktion auf abgeschlossene Sendeoperationen können Sie dann die Empfangsoperationen durchführen. Die Empfangsoperationen kehren auch sofort zurück und werden, sobald sie tatsächlich abgeschlossen sind, in die IOCP eingereiht.

Das Besondere an einem IOCP ist, dass er weiß, welche Threads zu ihm gehören und gerade Vervollständigungspakete verarbeiten. Und der IOCP weckt nur neue Threads, wenn die Gesamtzahl der aktiven Threads (nicht in einem Wartezustand im Kernelmodus) niedriger ist als die Parallelitätsnummer des IOCP (standardmäßig entspricht dies der Anzahl der auf dem Computer verfügbaren logischen Kerne). Wenn auf dem IOCP Threads auf Completion-Pakete warten (die noch nicht gestartet wurden, obwohl Completion-Pakete in die Warteschlange gestellt wurden, weil die Anzahl der aktiven Threads der Concurrancy-Nummer entsprach), ist dies der Moment, in dem gerade einer der Threads verarbeitet wird Ein Completion-Paket tritt aus irgendeinem Grund in einen Kernel-Modus-Wartezustand ein. Einer der wartenden Threads wird gestartet.

Threads, die zum IOCP zurückkehren, nehmen Fertigpackungen in der LIFO-Reihenfolge auf. Das heißt, wenn ein Thread zum IOCP zurückkehrt und noch Completion-Pakete warten, nimmt dieser Thread das nächste Completion-Paket direkt auf, anstatt in einen Wartezustand versetzt zu werden, und der Thread wartet auf den längsten Zeitpunkt des Aufwachens.

Unter optimalen Bedingungen haben Sie eine Anzahl von Threads, die der Anzahl gleichzeitig verfügbarer Cores entspricht (eine auf jedem Core), das nächste Completion-Package abholen, es verarbeiten, zum IOCP zurückkehren und direkt den nächsten abholen Komplettierungspaket, alles ohne jemals in einen Kernel-Modus-Wartezustand oder einen Thread-Kontext-Schalter eintreten zu müssen.

Wenn Sie stattdessen 300 Threads und blockierende Operationen ausführen würden, würden Sie nicht nur mindestens 300 MB Adressraum (für den reservierten Speicherplatz für die Stacks) verschwenden, sondern Sie hätten auch konstante Threadkontextwechsel, wenn ein Thread eine Wartezeit eingibt Zustand (Warten auf einen Sende- oder Empfangsabschluss) und der nächste Thread mit einem abgeschlossenen Sende- oder Empfangsaufwachen. - Thorsten Engler vor 12 Stunden

    
Thorsten Engler 03.02.2011 14:56
quelle
5

Der direkte ICMP-Zugriff wird in Windows nicht mehr unterstützt. Der direkte Zugriff auf das ICMP-Protokoll unter Windows wird gesteuert. Aufgrund der bösartigen Verwendung von Raw-Sockets im ICMP / Ping / Traceroute-Stil glaube ich, dass Sie bei einigen Windows-Versionen Windows-eigene API verwenden müssen. Insbesondere Windows XP, Vista und Windows 7 lassen Benutzerprogramme nicht auf rohe Sockets zugreifen.

Ich habe die in ICMP.dll enthaltene Konserzfunktion verwendet, was einige Delphi-Ping-Komponenten tun, aber ein Kommentar unten machte mich auf die Tatsache aufmerksam, dass dies als "Verwendung einer undokumentierten API-Schnittstelle" betrachtet wird.

Hier ist ein Beispiel für den Aufruf der Haupt-Delphi-Ping-Komponente:

%Vor%

Ich glaube, dass die meisten modernen Ping-Komponentenimplementierungen auf einem ähnlichen Bit des Codes basieren werden, und ich habe es verwendet, um diese Ping-Operation in einem Hintergrund-Thread ohne irgendwelche Probleme auszuführen. (Demo-Programm in den Link unten enthalten).

Der vollständige Beispielquellcode für die ICMP.DLL-basierte Demo ist hier .

UPDATE Ein moderneres IPHLPAPI.DLL-Beispiel finden Sie unter About.com hier.

    
Warren P 03.02.2011 14:46
quelle
4

Hier ist ein Artikel von Delphi3000 , der zeigt, wie man mit IOCP einen Thread-Pool erstellt. Ich bin nicht der Autor dieses Codes, aber die Informationen des Autors sind im Quellcode enthalten.

Ich poste die Kommentare und den Code hier erneut:

  

Jeder sollte jetzt was verstehen   Ein Thread ist, die Prinzipien von Threads   und so weiter. Für diejenigen in Not, die   einfache Funktion eines Threads ist zu   separate Verarbeitung von einem Thread zu   ein anderes, um gleichzeitig zu erlauben und   parallele Ausführung. Der Hauptgrundsatz   von Threads ist genauso einfach, Speicher   zugeordnet, auf die verwiesen wird   Threads müssen gemarshallt werden, um sicherzustellen   Sicherheit des Zugangs. Es gibt eine Nummer   von anderen Prinzipien, aber das ist wirklich   um den man sich kümmern muss.

     

Und weiter ..

     

Eine Thread-sichere Warteschlange erlaubt   mehrere Threads zum Hinzufügen und Entfernen,   Push und Pop Werte zu und von der   Bei einem First on First off sicher anstehen   Basis. Mit einem effizienten und gut   geschriebene Warteschlange kann man sehr hoch haben   nützliche Komponente in der Entwicklung   Gewindeanwendungen, von helfen   mit threadsicherem Protokollieren, zu   asynchrone Verarbeitung von Anfragen.

     

Ein Thread-Pool ist einfach ein Thread oder ein   Anzahl der Fäden, die am meisten sind   häufig verwendet, um eine Warteschlange von zu verwalten   Anfragen. Zum Beispiel ein Webserver   die würde eine ununterbrochene Schlange von haben   Anfragen müssen bearbeitet werden   Thread-Pools zur Verwaltung der http   Anforderungen oder ein COM + - oder DCOM-Server   verwendet einen Thread-Pool, um den RPC zu verarbeiten   Anfragen. Dies ist so, da ist es   weniger Auswirkungen von der Verarbeitung von einem   Anfrage an einen anderen, sagen Sie, wenn Sie 3 gelaufen sind   Anfragen synchron und die erste   Anfrage dauerte 1 Minute, um die   Die zweiten beiden Anfragen würden nicht abgeschlossen werden   für mindestens 1 Minute hinzufügen an der Spitze   da eigene Zeit zu verarbeiten, und für   Bei den meisten Kunden ist dies nicht der Fall   akzeptabel.

     

So wie das geht ..

     

Beginnend mit der Warteschlange !!

     

Delphi bietet ein TQueue-Objekt   welches verfügbar ist aber ist   leider nicht threadsicher noch   wirklich zu effizient, aber Leute   sollte sich die Contnrs.pas-Datei anschauen   sieh zu wie borland dort stapeln und schreiben   Warteschlangen. Es gibt nur zwei Hauptpunkte   Funktionen für eine Warteschlange benötigt, diese   sind hinzufügen und entfernen / drücken und pop.   Add / Push fügt einen Wert, Zeiger oder hinzu   Objekt an das Ende einer Warteschlange. Und   remove / pop wird entfernt und gibt das zurück   erster Wert in der Warteschlange.

     

Sie können vom TQueue-Objekt ableiten   und überschreiben Sie die geschützten Methoden und   hinzufügen in kritischen Abschnitten, dies wird   hol dir etwas von dem Weg, aber ich würde es tun   möchte, dass meine Warteschlange auf neu wartet   Anforderungen sind in der Warteschlange und legen Sie die   fädeln Sie sich in einen Ruhezustand ein   wartet auf neue Anfragen. Das könnte sein   getan durch Hinzufügen von Mutexes oder Signalisierung   Ereignisse, aber es gibt einen einfacheren Weg. Das   windows api bietet eine IO-Vervollständigung   Warteschlange, die uns mit Thread versorgt   sicherer Zugriff auf eine Warteschlange und ein Zustand von   Ruhe während des Wartens auf neue Anfrage in   die Warteschlange.

     

Implementieren des Thread-Pools

     

Der Thread-Pool wird sehr sein   einfach und wird x Anzahl von verwalten   Gewünschte Threads und übergeben jede Warteschlange   Anfrage an ein Ereignis zur Verfügung gestellt zu werden   verarbeitet. Es ist selten nötig   Implementieren Sie eine TThread-Klasse und Ihre   Logik implementiert werden und   gekapselt innerhalb des execute-Ereignisses   der Klasse, also ein einfaches   Die TSimpleThread-Klasse kann erstellt werden   welches irgendeine Methode in irgendeinem durchführt   Objekt im Kontext eines anderen   Faden. Sobald die Leute das verstehen,   alles, womit Sie sich beschäftigen müssen   ist Speicher zugeordnet.

     

Hier ist, wie es implementiert wird.

     

TThreadQueue und TThreadPool   Implementierung

%Vor%
  

Wie Sie sehen können, ist es ziemlich gerade   vorwärts, und damit kannst du   Implementieren Sie sehr einfach jede Warteschlange von   Anfragen über Threads und wirklich alle   Art der Anforderung, die erfordert   Threading kann mit diesen durchgeführt werden   Objekt und sparen Sie viel Zeit und   Anstrengung.

     

Sie können damit Anfragen in die Warteschlange stellen   von einem Thread zu mehreren Threads,   oder Warteschlangenanfragen von mehreren   führt zu einem Thread, der   das ist eine ganz schöne Lösung.

     

Hier sind einige Beispiele für die Verwendung dieser   Objekte.

     

Sichere Protokollierung

     

Um mehrere zuzulassen   Threads zum asynchronen Schreiben in a   Protokolldatei.

%Vor%
  

Da dies in einer Datei protokolliert wird, wird es   Verarbeiten Sie alle Anfragen zu einem einzigen   Thread, aber Sie könnten reiche E-Mail tun   Benachrichtigungen mit einem höheren Thread   zählen oder besser noch verarbeiten   Profiling mit dem, was vor sich geht oder   Schritte in Ihrem Programm, die ich werde   demonstrieren in einem anderen Artikel als dies   man ist jetzt ziemlich lang.

     

Für jetzt werde ich dich damit verlassen,   genießen..Hinterlasse einen Kommentar wenn es da ist   alles, was Menschen feststecken.

     

Chris

    
Mick 03.02.2011 15:59
quelle
3

Benötigen Sie eine Antwort von jeder Maschine im Netzwerk oder sind diese 300 Maschinen nur eine Teilmenge des größeren Netzwerks?

Wenn Sie eine Antwort von jedem Computer benötigen, können Sie eine Broadcast-Adresse verwenden oder Multicast-Adresse für Ihre Echo-Anfrage.

    
Leigh 03.02.2011 14:27
quelle
2

Bitte probieren Sie "chknodes" parallel ping für Linux aus, das einen einzigen Ping an alle Knoten Ihres Netzwerks sendet. Es wird auch DNS-Reverse-Lookup und HTTP-Antwort anfordern, wenn so angegeben. Es ist vollständig in bash geschrieben, d. H. Sie können es leicht überprüfen oder ändern Sie es an Ihre Bedürfnisse. Hier ist ein Ausdruck der Hilfe:

chknodes -h

chknodes ---- schneller paralleler Ping

chknodes [-l | --log] [-h | --help] [-H | --http] [-u | --uninstall] [-v | --version] [-V | - ausführlich]

-l | --log In Datei protokollieren   -h | --help Zeigt diesen Hilfebildschirm an   -H | --http Überprüfen Sie auch HTTP-Antwort   -n | --namen Erhalte auch Hostnamen   -u | --uninstall Entfernen Sie die Installation   -v | --version Version anzeigen   -V | --verbose Zeige jede IP-Adresse pinged

Sie müssen die Ausführung dafür ausführen (wie bei jedem sh / bash-Skript), um es auszuführen:

%Vor%

Beim ersten Durchlauf, d. h.

%Vor%

Es wird vorgeschlagen, sich selbst nach / usr / local / bin / chknodes zu installieren, nachdem Sie nur

gegeben haben %Vor%

wird reichen. Sie können es hier finden:

www.homelinuxpc.com/download/chknodes

    
ajaaskel 15.01.2014 18:58
quelle