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?
ulimit
montrera certaines de ces limites.parallel(1)
pour de telles tâches: manpages.debian.org/cgi-bin/…start=$SECONDS
etend=$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 (etstart
n'est calculé qu'une seule fois). Dans Bash, vous pouvez(( diff = end - start ))
supprimer les signes dollar et permettre un espacement plus flexible. Utilisezpgrep
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 chaqueparallel
script perl mange 32 Mo.Réponses:
Suite à la question stricte:
Plus court si vous n'avez pas besoin du texte passe-partout autour des horaires:
Si vous souhaitez exécuter des milliers en parallèle, vous atteindrez certaines limites (telles que les descripteurs de fichiers). Augmenter ulimit -n ou /etc/security/limits.conf peut aider.
la source
seq 100 | parallel 'echo here is command 1: {}; echo here is command 2: {}'
. Passez une heure à parcourir le didacticiel. Votre ligne de commande vous aimera pour cela:man parallel_tutorial
Il n'y a que 65536 ports. Limitez cela.
(edit: (edit: supprime les assertions sérieusement datées sur les limites du système d'exploitation et ajoute les manquantes )
echo
curl
wait
la source