Ich führe im folgenden Bash-Skript Tausende von Curl- Hintergrundprozessen parallel aus
START=$(date +%s)
for i in {1..100000}
do
curl -s "http://some_url_here/"$i > $i.txt&
END=$(date +%s)
DIFF=$(( $END - $START ))
echo "It took $DIFF seconds"
done
Ich habe 49 GB Corei7-920 dedizierten Server (nicht virtuell).
Ich verfolge Speicherverbrauch und CPU durch top
Befehl und sie sind weit weg von Grenzen.
Ich benutze, ps aux | grep curl | wc -l
um die Anzahl der aktuellen Curl- Prozesse zu zählen. Diese Zahl steigt schnell auf 2-4 Tausend an und beginnt dann kontinuierlich abzunehmen.
Wenn ich awk ( curl | awk > output
) ein einfaches Parsing durch Pipe-Curl hinzufüge, dann erhöht sich die Anzahl der Curl-Prozesse nur auf 1-2 Tausend und verringert sich dann auf 20-30 ...
Warum sinkt die Anzahl der Prozesse so dramatisch? Wo liegen die Grenzen dieser Architektur?
ulimit
wird einige dieser Grenzen zeigen.parallel(1)
für solche Aufgaben: manpages.debian.org/cgi-bin/...start=$SECONDS
undend=$SECONDS
- und verwenden Sie gewohnheitsmäßig klein oder gemischt geschriebene Variablennamen, um mögliche Namenskollisionen mit Shell-Variablen zu vermeiden. In Wirklichkeit erhalten Sie jedoch nur das immer größer werdende Zeitintervall, in dem die einzelnen Prozesse gestartet werden. Sie können nicht feststellen, wie lange der Download gedauert hat, da sich der Vorgang im Hintergrund befindet (undstart
nur einmal berechnet wird). In Bash können Sie(( diff = end - start ))
die Dollarzeichen löschen und den Abstand flexibler gestalten. Verwendenpgrep
Sie, wenn Sie es haben.awk
).parallel
und es heißt, dass ich aufgrund der Systembeschränkung der Dateihandles möglicherweise nur 500 parallele Tasks ausführen kann. Ich habe limit in limits.conf erhöht, aber jetzt, wenn ich versuche, 5000 simulaneus-Jobs auszuführen, wird sofort mein ganzer Speicher (49 GB)parallel
aufgebraucht, noch bevor ich beginne, da jedes Perl-Skript 32 MB belegt.Antworten:
Befolgen Sie die Frage streng:
Kürzere, wenn Sie den Text auf dem Kesselschild nicht benötigen:
Wenn Sie 1000s parallel ausführen möchten, stoßen Sie an einige Grenzen (z. B. Dateizugriffsnummern). Das Erhöhen von ulimit -n oder /etc/security/limits.conf kann hilfreich sein.
quelle
seq 100 | parallel 'echo here is command 1: {}; echo here is command 2: {}'
. Gehen Sie eine Stunde lang durch das Tutorial. Ihre Kommandozeile wird Sie dafür lieben:man parallel_tutorial
Es gibt nur 65536 Ports. Drossle das.
(edit: (edit: Streng datierte Behauptung über Betriebssystemgrenzen entfernen und die fehlenden hinzufügen )
echo
curl
wait
quelle