15-minütiges paralleles Artefakt GNU Parallel Erste Schritte

15-minütiges paralleles Artefakt GNU Parallel Erste Schritte

GNU Parallel ist ein Shell-Tool zum parallelen Ausführen von Rechenaufgaben auf einem oder mehreren Computern. Dieser Artikel bietet eine kurze Einführung in die Verwendung von GNU Parallel.

Diese CPU ist Multi-Core.

Im Allgemeinen funktionieren zwei Kerne wie folgt:

So funktionieren Quad-Cores:

So funktionieren die 16 Kerne:

Okay, es ist nicht mehr dunkel. Wenn Sie weiterhin Intel kritisieren, werde ich geschlagen.

An einem Wochenendmorgen habe ich aus Langeweile einen halben Tag damit verbracht, die Manpage und das Tutorial von GNU Parallel durchzugehen. Haha, ich muss sagen, dass es sich wirklich lohnt, diesen halben Tag zu investieren, weil ich das Gefühl habe, dass ich dadurch in Zukunft mehr als einen halben Tag sparen kann.

Dieser Artikel versucht nicht, die Manpage oder das Tutorial von GNU Parallel zu übersetzen. Denn es gibt bereits fertige Übersetzungen, diese könnt ihr euch hier oder hier ansehen.

Aber nachdem ich vor ein paar Mal die seltsamen ::: und die merkwürdigen {}{#}{.}{\}-Platzhalter parallel gesehen habe, habe ich einen Rückzieher gemacht. Eine so hässliche Syntax ist unattraktiv. Zum Glück habe ich mir zur Beruhigung ein paar Beispiele angeschaut und es dann selbst ausprobiert. Dabei stellte ich fest, dass es sich wirklich um ein magisches Werkzeug handelt.

Der Hauptzweck dieses Artikels besteht darin, Sie zur Verwendung dieses Tools zu verleiten und Ihnen zu erklären, warum und wie Sie es verwenden.

Warum

Es gibt nur einen Grund für die Verwendung von GNU Parallel: Schnelligkeit!

Schnelle Installation

(wget -O - pi.dk/3 || curl pi.dk/3/) | bash

Der Autor sagte, die Installation dauert 10 Sekunden. Die tatsächliche Situation im Land reicht möglicherweise nicht aus. Aber es dauert nicht allzu lange. Tatsächlich handelt es sich um ein einteiliges Perl-Skript mit mehr als 10.000 Zeilen (ja, Sie haben richtig gelesen, alle Module befinden sich in dieser Datei, das ist ein Feature~). Danach habe ich Fabric-Skripte geschrieben und sie direkt auf jede Knotenmaschine kopiert. Ändern Sie dann die Ausführungsberechtigung in CHMOD.
Dann gibt es die schnelle Ausführung, die Ihr Programm parallel unter Verwendung mehrerer Systemkerne ausführt:
Über:

grep ein 1G-Protokoll.

Verwenden von parallel und direktes grep ohne parallel. Das Ergebnis ist offensichtlich: ein Unterschied von 20 Mal. Dies ist viel effektiver als die Verwendung einer Ack- oder Ag-Optimierung.

Hinweis: Dies ist das Ergebnis der Ausführung auf einem 48-Core-Server.

Wie

Am einfachsten geht das mit xargs. Es gibt einen Parameter -P in xargs, der mehrere Kerne nutzen kann.

Zum Beispiel:

$ Zeit echo {1..5} |xargs -n 1 schlafen

real 0m15.005s
Benutzer 0m0.000s
System 0m0.000s

Diese Zeile mit xargs übergibt jede Echonummer als Parameter an sleep, sodass die gesamte Ruhezeit 1+2+3+4+5=15 Sekunden beträgt.

Wenn der Parameter -P verwendet wird, um die Daten 5 Kernen zuzuordnen, schläft jeder Kern 1, 2, 3, 4 und 5 Sekunden, sodass die gesamte Ruhezeit nach der Ausführung 5 Sekunden beträgt.

$ Zeit echo {1..5} |xargs -n 1 -P 5 schlafen

real 0m5.003s
Benutzer 0m0.000s
System 0m0.000s

Die Vorbereitung ist abgeschlossen. Im Allgemeinen besteht der erste Parallelmodus darin, xargs -P zu ersetzen.

Komprimieren Sie beispielsweise alle HTML-Dateien.

finde . -name '*.html' | parallel gzip --best

Parameter-Übertragungsmodus

Der erste Modus besteht in der Verwendung paralleler Parameterübergabe. Die von vorne in der Pipeline eingehenden Befehle werden als Parameter an die nachfolgenden Befehle übergeben und parallel ausgeführt.

Zum Beispiel

huang$ Sequenz 5 | parallel echo pre_placeholder_{}
pre_placehoder_1
pre_placehoder_2
pre_placehoder_3
pre_placehoder_4
pre_placehoder_5

{} ist ein Platzhalter, der zum Speichern der eingehenden Parameter verwendet wird.

Bei Cloud-Computing-Vorgängen werden häufig Stapelvorgänge ausgeführt, beispielsweise das Erstellen von 10 Cloud-Festplatten.

seq 10 | parallele Cinder-Erstellung 10 --Anzeigename test_{}

Erstellen Sie 50 Cloud-Hosts

Kopieren Sie den Code wie folgt:
Sequenz 50 | paralleler Nova-Boot --Image Image_ID --Flavor 1 --Availability-Zone Az_ID --NIC VNETWORK = privat --VNC-Passwort 000000 Vm-Test_{}

Cloud-Hosts stapelweise löschen

Nova-Liste | grep some_pattern | awk '{print $2}' | paralleles Nova-Löschen

Schreiben Sie die For-Schleife neu

Wie Sie sehen, habe ich tatsächlich viele Stellen, an denen Schleifen geschrieben werden müssen, durch parallel ersetzt und den Komfort genossen, den die Parallelität mit sich bringt.
Der Grund hierfür liegt darin, dass bei der Ausführung einer For-Schleife die Wahrscheinlichkeit einer Parallelisierung am höchsten ist, da die in der Schleife platzierten Objekte kontextunabhängig sind.

Universelle Abstraktion, Shell-Schleife:

 (für x in „Katzenliste“;
 tu_etwas $x
 fertig) | Prozessausgabe

Kann direkt geschrieben werden

 Katzenliste | parallel tu_etwas | Prozessausgabe

Wenn sich zu viele Inhalte in der Schleife befinden

 (für x in „Katzenliste“;
 tu_etwas $x
 [... 100 Zeilen, die etwas mit $x machen ...]
 fertig) | Prozessausgabe

Es ist besser, ein Skript zu schreiben

 mach es() {
 x=$1
 tu_etwas $x
 [... 100 Zeilen, die etwas mit $x machen ...]
 }
 export -f doit
 Katzenliste | paralleles Doit

Und es kann auch viele lästige Fluchten verhindern.

--pipe-Modus

Ein anderer Modus ist parallel --pipe

Zu diesem Zeitpunkt wird der Befehl vor der Pipeline nicht als Parameter verwendet, sondern als Standardeingabe für den folgenden Befehl.

Zum Beispiel:

Katze my_large_log |parallel --pipe grep Muster 

Ohne --pipe wird jede Zeile in mylog in einen Zeilenbefehl im Grep-Muster erweitert. Mit --pipe unterscheidet sich der Befehl nicht vom Muster cat mylog | grep, außer dass die Befehle zur Ausführung auf verschiedene Kerne verteilt werden.

Okay, das ist das Grundkonzept! Der Rest ist nur die spezifische Verwendung verschiedener Parameter, wie z. B. wie viele Kerne verwendet werden sollen, Platzhalter-Ersetzung, verschiedene Möglichkeiten zur Parameterübergabe, parallele Ausführung unter Sicherstellung der Reihenfolge der Ergebnisausgabe (-k) und die magische knotenübergreifende Parallelverarbeitung. Schauen Sie einfach auf die Manpage, um mehr zu erfahren.

Bonus

Wenn Sie ein kleines Tool zur Parallelisierung zur Hand haben, können Sie nicht nur die tägliche Ausführung beschleunigen, sondern auch die Parallelität testen.

Bei vielen Schnittstellen treten bei gleichzeitigen Vorgängen Fehler auf. Beispielsweise wird auf Codeebene beurteilt, dass die Datenbank nicht gesperrt ist. Infolgedessen werden gleichzeitige Anforderungen gestellt und jede Anforderung wird als erfolgreich beurteilt, wenn sie den Server erreicht. Wenn sie zusammen geschrieben werden, wird das Limit überschritten. Zuvor wurde die For-Schleife seriell ausgeführt und löste diese Probleme nicht aus. Wenn Sie jedoch wirklich die Parallelität testen möchten, müssen Sie ein Skript schreiben oder die Mehrfachverarbeitung von Python verwenden, um sie zu kapseln. Aber ich habe parallel zur Hand und habe die folgenden beiden Aliase in bashrc hinzugefügt

Alias ​​p='parallel'
Alias ​​pp='parallel --pipe -k' 

Auf diese Weise lässt sich sehr bequem Parallelität erzeugen. Ich muss nur nach der Pipeline ein p hinzufügen und kann jederzeit Parallelität erzeugen, um die Antwort zu beobachten.

Zum Beispiel

Sequenz 50 | p -n0 -q curl 'example.com'

Stellen Sie gleichzeitige Anfragen basierend auf der Anzahl Ihrer Kerne. -n0 bedeutet, dass die Seq-Ausgabe nicht als Parameter an den nachfolgenden Befehl übergeben wird.

Zeit für Klatsch: Xianglin Sao von GNU

Da ich mich für Klatsch und Tratsch über kostenlose Software interessiere, google ich jedes Mal, wenn ich eine neue und interessante Software entdecke, die Schlüsselwörter site:https://news.ycombinator.com und關鍵詞site:http://www.reddit.com/ . Schauen Sie sich die Rezensionen an, vielleicht erfahren Sie im Verlauf der Diskussionen Unerwartetes.

Dann sah ich eine Beschwerde bei Hacker News, in der es im Wesentlichen darum ging, dass jedes Mal, wenn man die Ausführung von Parallel auslöst, ein Text erscheint, der einen darauf hinweist, dass man, wenn man dieses Tool für akademische Zwecke verwendet (viele Leute aus dem Bereich Biowissenschaften verwenden dieses Tool), seine Arbeit zitieren muss, sonst zahlt man ihm 10.000 Euro. Dabei habe ich ein Wort gelernt: „Nagware“, womit sich speziell Software bezeichnet, die wie Tang Seng nervt, damit man zahlt. Ich denke jedoch, dass der Artikel zitiert werden sollte, wenn er wirklich verwendet wird, wie dieser Student sagte:

Ich stimme zu, dass es ein großartiges Tool ist, abgesehen von den Nagware-Meldungen und deren Inhalt. Stellen Sie sich vor, der Autor von CD oder LS hätte die gleiche Einstellung ...

Darüber hinaus ist es dem Autor sehr wichtig, dass andere seine Software zitieren. Das ging so weit, dass ich dies auch in den NEWS gesehen habe:

Hauptzeit

Zitieren Sie direkt die Antwort des Autors auf stackoverflow

GNU Parallel ist ein allgemeiner Parallelisierer und erleichtert die parallele Ausführung von Jobs auf derselben Maschine oder auf mehreren Maschinen, auf die Sie per SSH-Zugriff zugreifen können.

Wenn Sie 32 verschiedene Jobs haben, die Sie auf 4 CPUs ausführen möchten, können Sie die Parallelisierung ganz einfach durchführen, indem Sie auf jeder CPU 8 Jobs ausführen:

GNU Parallel startet stattdessen einen neuen Prozess, wenn einer fertig ist – wodurch die CPUs aktiv bleiben und Zeit gespart wird:

abschließend

Dieser Artikel stellt hauptsächlich ein echtes Paralleltool vor, erklärt seine beiden Hauptmodi, gibt Tipps und plaudert über die unbekannte Seite der GNU-Welt. Ich hoffe, es ist nützlich für Sie.

Das Obige ist der vollständige Inhalt dieses Artikels. Ich hoffe, er wird für jedermanns Studium hilfreich sein. Ich hoffe auch, dass jeder 123WORDPRESS.COM unterstützen wird.

<<:  MySQL 5.6.27 Installations-Tutorial unter Linux

>>:  Detaillierte Erklärung der Ansichtszusammenfassungsdefinition im Angular-Framework

Artikel empfehlen

Analyse der Gründe, warum das MySQL-Indexsystem den B + -Baum verwendet

Inhaltsverzeichnis 1. Was ist ein Index? 2. Warum...

Implementierung von zwei Basis-Images für die Docker-Bereitstellung von Go

1. golang:neuestes Basis-Image mkdir gotest Berüh...

Element-ui klickt direkt auf die Zelle in der Tabelle, um sie zu bearbeiten

Inhaltsverzeichnis Ergebnisse erzielen Implementi...

So verwenden Sie den Nginx-Proxy zum Surfen im Internet

Normalerweise verwende ich nginx als Reverse-Prox...

So konfigurieren Sie den Runner-Container in Docker

1. Erstellen Sie einen Runner-Container mk@mk-pc:...

Implementierung der TCPWrappers-Zugriffskontrolle in Centos

1. Übersicht über TCP-Wrapper TCP Wrapper „verpac...

Detaillierte Erläuterung des Lese-Commits der MySQL-Transaktionsisolationsebene

MySQL-Transaktionsisolationsebene anzeigen mysql&...

Linux-Fernsteuerungsprogramm für Windows-System (drei Methoden)

Manchmal müssen wir Programme auf dem Windows-Sys...

Konvertieren von XHTML-CSS-Seiten in Druckerseiten

<br />In der Vergangenheit musste zum Erstel...

Linux verwendet den Befehl lsof, um den Status des Dateiöffnens zu überprüfen

Vorwort Wir alle wissen, dass unter Linux „alles ...

Beispielanalyse für MySQL Oracle- und SQL Server-Paging-Abfragen

Ich habe vor Kurzem eine einfache Studie zur Date...