/ / Wiele maszyn - przetwarzaj wiele plików jednocześnie? - Linux, sieci, sprzęt, dysk twardy

Wiele maszyn - przetwarzaj wiele plików jednocześnie? - Linux, sieci, sprzęt, dysk twardy

Muszę jednocześnie przetwarzać dużą liczbę plików (tysiące różnych plików o średniej wielkości 2 MB na plik).

Wszystkie informacje są przechowywane na jednym (1.5 TB) sieciowego dysku twardego i będzie dostępny (odczyt) przez około 30 różnych komputerów. W celu uzyskania wydajności każda maszyna będzie odczytywać (i przetwarzać) różne pliki (są tysiące plików, które należy przetworzyć).

Każda maszyna - po odczytaniu plikuz folderu "przychodzącego" na dysku twardym o pojemności 1,5 TB - przetwarzanie informacji i przygotowanie danych wyjściowych do przetworzonego folderu na dysku 1,5 TB. przetwarzane informacje dla każdego pliku mają mniej więcej taki sam średni rozmiar, jak pliki wejściowe (około ~ 2 MB na plik).

Czy są jakieś "do zrobienia" i "nie", gdy takie sąbudowanie takiej operacji? Czy jest problemem, aby mieć 30 maszyn lub tak czytać (lub zapisywać) informacje na tym samym dysku sieciowym, w tym samym czasie? (Uwaga: istniejące pliki będą czytane, nie będą dołączane / pisane, nowe pliki będą tworzone od zera, więc nie ma problemów z wielokrotnym dostępem do tego samego pliku ...). Czy są jakieś wąskie gardła, których powinienem się spodziewać?

(Używam Linuksa, Ubuntu 10.04 LTS na wszystkich komputerach, jeśli wszystko ma znaczenie)

Odpowiedzi:

1 dla odpowiedzi № 1

Rzeczy, o których powinieneś pomyśleć:

Jeśli przetwarzanie, które należy wykonać dla każdego pliku, jest proste, to prawdziwym wąskim gardłem nie jest ilość plików równoległych, które czytasz, ale możliwości dysku twardego.

O ile przetwarzanie nie trwa długo (na przykład niektóresekund na plik) przejdziesz obok punktu, w którym dodanie większej liczby procesów spowolni proces indeksowania, ponieważ każdy proces odczytuje i zapisuje wyniki, a dysk może tylko tyle zrobić.

Postaraj się zminimalizować dostęp do dysku: na przykład pobieraj pliki i generuj wyniki lokalnie, podczas gdy inne procesy pobierają, i wysyłaj wyniki z powrotem, gdy ładowanie na dysku zostanie przerwane.

Im więcej piszę, tym bardziej sprowadza się to do tego, ile przetwarzania należy wykonać dla każdego pliku. Jeśli to proste przetwarzanie, coś, co zajmuje milisekundy, 1 maszyna lub 30 zrobi małą różnicę.


0 dla odpowiedzi nr 2

Musisz uważać, aby dwa procesy robocze nie podniosły (i nie spróbowały) tej samej pracy w tym samym czasie.

Niestety, systemy plików NFS nie mają semantyki, która pozwala łatwo to zrobić.

Polecam więc użycie czegoś w rodzaju Gearmana i modelu producenta / konsumenta, gdzie jeden proces daje pracę każdemu, kto jest do tego zdolny.

Inną możliwością jest posiadanie bazy danych (np. Mysql) z tabelą wszystkich zadań, a procesy te atomicznie "roszczą sobie" zadania dla siebie.

Ale wszystko to jest opłacalne tylko wtedy, gdy twoje procesy są głównie związane z procesorem. Jeśli próbujesz uzyskać większą przepustowość IO (lub operacje) z NAS przez użycie wielu klientów, to nie zadziała.

Zakładam, że będziesz mieć tutaj co najmniej gigabit Ethernet (lub prawdopodobnie nie jest to warte).

Czy próbowałeś uruchomić wiele procesów na tym samym komputerze?