J'exécute des milliers de processus d'arrière-plan curl en parallèle dans le script bash suivant
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
J'ai un serveur dédié 49Gb Corei7-920 (non virtuel).
Je surveille la consommation de mémoire et le processeur via la top
commande et ils sont loin des limites.
J'utilise ps aux | grep curl | wc -l
pour compter le nombre de processus de curl actuels . Ce nombre augmente rapidement jusqu'à 2 à 4 milliers, puis commence à diminuer continuellement.
Si j'ajoute une analyse simple à l'aide de la tuyauterie curl à awk ( curl | awk > output
), le nombre de processus de boucle augmente jusqu'à 1-2 milliers, puis diminue à 20-30 ...
Pourquoi le nombre de processus diminue-t-il si fortement? Où sont les limites de cette architecture?
parallel(1)
pour de telles tâches: manpages.debian.org/cgi-bin/…
start=$SECONDS
et end=$SECONDS
- et utilisez des noms de variables en minuscules ou en casse mixte par habitude afin d'éviter une éventuelle collision de noms avec des variables de shell. Cependant, vous n'obtenez vraiment que l'intervalle de temps sans cesse croissant du démarrage de chaque processus. Vous ne voyez pas combien de temps le téléchargement a pris depuis que le processus est en arrière-plan (et start
n'est calculé qu'une seule fois). Dans Bash, vous pouvez (( diff = end - start ))
supprimer les signes dollar et permettre un espacement plus flexible. Utilisez pgrep
si vous l'avez.
awk
).
parallel
et il me dit que je peux exécuter seulement 500 tâches parallèles en raison de la limite système des descripteurs de fichiers. J'ai augmenté la limite dans limits.conf, mais maintenant, lorsque j'essaie d'exécuter 5000 travaux simulaneus, il mange instantanément toute ma mémoire (49 Go) avant même de démarrer car chaque parallel
script perl mange 32 Mo.
ulimit
montrera certaines de ces limites.