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?
parallel(1)
do takich zadań: manpages.debian.org/cgi-bin/...
start=$SECONDS
i end=$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 (i start
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żdy parallel
skrypt perla zjada 32Mb.
ulimit
pokaże niektóre z tych limitów.