Korzystam z tysięcy procesów zwijania w tle równolegle w następującym skrypcie bash
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
Mam serwer dedykowany 49Gb Corei7-920 (nie wirtualny).
Śledzę zużycie pamięci i procesora za pomocą top
poleceń i są one daleko od granic.
Używam ps aux | grep curl | wc -l
do zliczania liczby bieżących procesów zwijania . Liczba ta rośnie gwałtownie do 2-4 tysięcy, a następnie zaczyna się stale zmniejszać.
Jeśli dodam proste analizowanie przez zawijanie rur do awk ( curl | awk > output
), wówczas liczba procesów zwijania wzrośnie tylko do 1-2 tysięcy, a następnie spadnie do 20-30 ...
Dlaczego liczba procesów spada tak gwałtownie? Gdzie są granice tej architektury?
ulimit
pokaże niektóre z tych limitów.parallel(1)
do takich zadań: manpages.debian.org/cgi-bin/...start=$SECONDS
iend=$SECONDS
- i używaj nazw zmiennych o małych i małych literach według przyzwyczajenia, aby uniknąć potencjalnej kolizji nazw ze zmiennymi powłoki. Jednak tak naprawdę otrzymujesz tylko coraz większy przedział czasu na początku każdego procesu. Nie masz pojęcia, ile czasu trwało pobieranie, ponieważ proces jest w tle (istart
jest obliczany tylko raz). W Bash możesz(( diff = end - start ))
upuścić znaki dolara i pozwolić, aby odstępy były bardziej elastyczne. Użyj,pgrep
jeśli go masz.awk
).parallel
i mówi mi, że mogę wykonywać tylko 500 równoległych zadań z powodu ograniczeń systemowych uchwytów plików. Podniosłem limit w limit.conf, ale teraz, gdy próbuję uruchomić 5000 zadań Simulaneus, natychmiast zjada całą moją pamięć (49 Gb), nawet przed uruchomieniem, ponieważ każdyparallel
skrypt perla zjada 32Mb.Odpowiedzi:
Po ścisłym pytaniu:
Krótszy, jeśli nie potrzebujesz tekstu płyty głównej wokół czasów:
Jeśli chcesz uruchomić 1000 równolegle, osiągniesz pewne ograniczenia (takie jak uchwyty plików). Podnoszenie ulimit -n lub /etc/security/limits.conf może pomóc.
źródło
seq 100 | parallel 'echo here is command 1: {}; echo here is command 2: {}'
. Poświęć godzinę na samouczek. Twoja linia poleceń cię za to pokocha:man parallel_tutorial
Istnieje tylko 65536 portów. Ogranicz to.
(edytuj: (edytuj: usuń poważnie przestarzałe stwierdzenie o limitach systemu operacyjnego i dodaj brakujące )
echo
curl
wait
źródło