popraw użycie równoległe xargs


9

Używam xargsdo wywołania skryptu Pythona w celu przetworzenia około 30 milionów małych plików. Mam nadzieję, że wykorzystam to xargsdo zrównoleglenia procesu. Polecenie, którego używam to:

find ./data -name "*.json" -print0 |
  xargs -0 -I{} -P 40 python Convert.py {} > log.txt

Zasadniczo Convert.pywczyta się w małym pliku json (4kb), trochę przetworzy i zapisze w innym pliku 4kb. Pracuję na serwerze z 40 rdzeniami procesora. Na tym serwerze nie działa żaden inny proces wymagający dużego procesora.

Monitorując htop (btw, czy jest jakiś inny dobry sposób monitorowania wydajności procesora?), Stwierdzam, że -P 40nie jest tak szybki, jak się spodziewałem. Czasami wszystkie rdzenie zamarzają i zmniejszają się prawie do zera przez 3-4 sekundy, a następnie wracają do 60-70%. Następnie staram się zmniejszyć liczbę równoległych procesów do -P 20-30, ale wciąż nie jest to bardzo szybkie. Idealnym zachowaniem powinno być przyspieszenie liniowe. Wszelkie sugestie dotyczące równoległego korzystania z xargs?


6
Najprawdopodobniej uderza Cię we / wy: system nie może odczytać plików wystarczająco szybko. Spróbuj uruchomić więcej niż 40: W ten sposób będzie dobrze, jeśli niektóre procesy będą musiały czekać na We / Wy.
Ole Tange

Jakie przetwarzanie wykonuje skrypt? W grę wchodzi jakaś baza danych / sieć / io? Jak długo to trwa?
Lis,

1
I drugi @OleTange. Jest to oczekiwane zachowanie, jeśli uruchomisz tyle procesów, ile masz rdzeni, a twoje zadania są związane z operacjami wejścia / wyjścia. Najpierw rdzenie zaczekają na IO na swoje zadanie (uśpienie), następnie przetworzą, a następnie powtórzą. Jeśli dodasz więcej procesów, dodatkowe procesy, które obecnie nie działają na fizycznym rdzeniu, rozpoczną równoległe operacje we / wy, co po zakończeniu wyeliminuje lub przynajmniej skróci okresy uśpienia na rdzeniach.
PSkocik

1- Czy masz włączony hyperthreading? 2- w tym, co tam masz, log.txt jest faktycznie nadpisywany przy każdym wywołaniu do convert.py ... nie jestem pewien, czy jest to zamierzone zachowanie, czy nie.
Bichoy,

xargs -P i > otwiera się na warunki wyścigu z powodu problemu z linią środkową gnu.org/software/parallel/... Zamiast tego używanie GNU Parallel nie będzie miało tego problemu.
Ole Tange

Odpowiedzi:


4

Byłbym skłonny założyć się, że twoim problemem jest python . Nie powiedziałeś, jaki rodzaj przetwarzania jest wykonywany dla każdego pliku, ale zakładając, że po prostu przetwarzasz dane w pamięci, czas działania zostanie zdominowany przez uruchomienie 30 milionów wirtualnych maszyn (interpreterów) w Pythonie.

Jeśli możesz zrestrukturyzować swój program python, aby pobierał listę plików, zamiast jednego, uzyskasz ogromną poprawę wydajności. Następnie możesz nadal używać xargs w celu dalszej poprawy wydajności. Na przykład 40 procesów, każdy przetwarzający 1000 plików:

find ./data -name "*.json" -print0 |
  xargs -0 -L1000 -P 40 python Convert.py

Nie oznacza to, że Python jest złym / wolnym językiem; po prostu nie jest zoptymalizowany pod kątem czasu uruchamiania. Zobaczysz to w dowolnym języku opartym na maszynie wirtualnej lub tłumaczonym. Na przykład Java byłaby jeszcze gorsza. Jeśli Twój program został napisany w języku C, nadal będzie istniał koszt uruchomienia osobnego procesu systemu operacyjnego do obsługi każdego pliku, ale byłoby to znacznie mniej.

Stamtąd możesz manipulować, -Paby sprawdzić, czy możesz wycisnąć nieco większą prędkość, być może zwiększając liczbę procesów, aby skorzystać z bezczynnych procesorów podczas odczytu / zapisu danych.


1

Po pierwsze, rozważ ograniczenia:

Jakie jest ograniczenie każdej pracy? Jeśli to we / wy, prawdopodobnie możesz uda się uniknąć wielu zadań na rdzeń procesora, dopóki nie osiągniesz limitu We / Wy, ale jeśli jest to procesor intensywny, będzie gorzej niż bezcelowe wykonywanie większej liczby zadań jednocześnie niż w przypadku rdzeni procesora.

Moje rozumienie tych rzeczy polega na tym, że GNU Parallel dałoby ci lepszą kontrolę nad kolejką zadań itp.

Zobacz GNU równoległe vs i (mam na myśli tło) vs xargs -P, aby uzyskać bardziej szczegółowe wyjaśnienie różnic między nimi.


0

Jak powiedzieli inni, sprawdź, czy jesteś związany we / wy. Ponadto, strona podręcznika użytkownika xargs sugeruje używanie -nz -P, nie wspominasz o liczbie Convert.pyrównoległych procesów.

Jako sugestię, jeśli jesteś związany we / wy, możesz spróbować użyć urządzenia blokującego SSD lub spróbować wykonać przetwarzanie w tmpfs (oczywiście w tym przypadku powinieneś sprawdzić wystarczającą ilość pamięci, unikając wymiany z powodu tmpfs presja (tak mi się wydaje), a przede wszystkim narzut związany z kopiowaniem danych.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.