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?
parallel(1)
für solche Aufgaben: manpages.debian.org/cgi-bin/...
start=$SECONDS
und end=$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 (und start
nur einmal berechnet wird). In Bash können Sie (( diff = end - start ))
die Dollarzeichen löschen und den Abstand flexibler gestalten. Verwenden pgrep
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.
ulimit
wird einige dieser Grenzen zeigen.