2011-09-29 11 views
8

Mam długotrwały proces, który odczytuje duże pliki i zapisuje pliki podsumowań. Aby przyspieszyć, jestem przetwarzanie wielu plików jednocześnie stosując regularne stare wątki:Wątki kontra procesy w .NET

ThreadStart ts = new ThreadStart(Work); 
Thread t = new Thread(ts); 
t.Start(); 

Co odkryłem, że nawet z oddzielnych wątków czytania pojedynczych plików i brak blokady między nimi i za pomocą 4 wątki na 24 -pokrywarka, nie mogę nawet uzyskać do 10% na procesorze lub 10% na dysku I/O. Jeśli używam więcej wątków w mojej aplikacji, wydaje mi się, że działa ona jeszcze wolniej.

Przypuszczam, że robię coś złego, ale gdy robi się ciekawy, to jeśli uruchomię cały exe drugi i trzeci raz, to faktycznie przetwarza pliki dwa i trzy razy szybciej. Moje pytanie brzmi: dlaczego nie mogę uzyskać 12 wątków w mojej aplikacji do przetwarzania danych i opodatkowania urządzenia, a także 4 wątków w 3 przypadkach mojej aplikacji?

Profilowałem aplikację, a najbardziej czasochłonne i często nazywane funkcje są wywołaniami ciągów.

+6

Nie można powiedzieć bez rzeczywistego kodu wykonującego przetwarzanie pliku. –

+5

Co uruchomił profil, mówiąc o tym, gdzie jest wąskie gardło? –

+0

Powinieneś mieć kilka wspólnych miejsc (do których dostęp mają wątki przetwarzania) z kodem blokującym/synchronizującym, czy mógłbyś udostępnić ten kod synchronizacji – sll

Odpowiedz

-1

Spróbuj użyć biblioteki zadań z .net 4 (System.Threading.Task). Ta biblioteka ma wbudowane optymalizacje dla różnej liczby procesorów.

nie mają pojęcia co to ty problem, być może dlatego, że fragment kodu nie jest naprawdę pouczające

+0

Korzystanie z biblioteki zadań nie rozwiąże problemu, on już używa wątków, które po dogłębnym pogłębianiu są tym, czego używa zadanie. –

+0

Dzięki za informację, capt. Po prostu miałem na myśli, że biblioteka zadań ma planowanie i optymalizację liczby wątków. To nie to samo, co przy użyciu grubych wątków. Miłego dnia –

6

Jest możliwe, że problem nie jest obliczeniowa procesora związany, ale I/O związany. Nie pomaga stwierdzenie, że dysk we/wy ma "tylko 10%". Nie jestem pewien, czy taki licznik wydajności istnieje.

Powodem, dla którego robi się wolniej podczas korzystania z większej liczby wątków, jest to, że wszystkie wątki próbują dostać się do odpowiednich plików w tym samym czasie, podczas gdy podsystem dysku ma problemy z zapełnieniem wszystkich wątków. Widzisz, nawet przy użyciu nowoczesnej technologii, takiej jak dyski SSD, w których czas wyszukiwania jest o kilka rzędów wielkości mniejszy niż w przypadku tradycyjnych dysków twardych, wciąż istnieje kara pieniężna.

Należy raczej stwierdzić, że problem jest związany z dyskiem, a pojedynczy wątek prawdopodobnie będzie najszybszym sposobem rozwiązania problemu.

Można argumentować, że można użyć technik asynchronicznych do przetworzenia bitów, które zostały przeczytane, podczas gdy w tle czytany jest następny fragment, ale myślę, że zauważysz tam bardzo niewielkie polepszenie wydajności.

Mam podobny problem nie tak dawno temu w małym narzędziu, w którym chciałem obliczyć podpisy MD5 wszystkich plików na moim dysku twardym i odkryłem, że procesor jest zbyt szybki w porównaniu do systemu pamięci masowej i uzyskałem podobne wyniki, starając się uzyskać większą wydajność, korzystając z większej liczby wątków.

Korzystanie z zadania Biblioteka równoległa nie złagodziło tego problemu.

+1

Zgadzam się z tym, co mówisz, ale nie rozumiem, dlaczego jeśli problem dotyczy dysku i/o, mogę przetwarzać pliki szybciej przy użyciu wielu plików wykonywalnych w jednym pliku exe z większą liczbą wątków. Czuję, że prawdopodobnie robię coś złego, ale nie wiem, od kiedy każdy wątek działa niezależnie. – powlette

+0

Czy twój proces przyspiesza, gdy nic nie robisz z rzeczami, które czytasz? Być może powinieneś wyłączyć to i sprawdzić wynik. Zgaduję, że część przetwarzania, które robisz, ma problemy z blokowaniem, nawet jeśli naprawdę nie możesz tego jeszcze zobaczyć. –

+0

O ile szybciej jest szybciej? Czy mówimy o jedno- lub dwucyfrowych wzrostach wydajności? –

2

Przede wszystkim na 24-rdzeniowym pudełku, jeśli używasz tylko 4 wątków, najwięcej procesorów, z których mógł korzystać, to 16,7%, więc naprawdę uzyskujesz 60% wykorzystania, co jest dość dobre.

Trudno powiedzieć, czy twój program jest związany w tym momencie z I/O, domyślam się, że tak właśnie jest. Musisz uruchomić profiler na swoim projekcie i zobaczyć, które sekcje kodu twój projekt poświęca najwięcej czasu. Jeśli siedzi na operacji odczytu/zapisu, jest związany we/wy.

Możliwe jest użycie jakiejś formy blokady między wątkami. To spowodowałoby spowolnienie programu w miarę dodawania kolejnych wątków, a tak, uruchomiłby się drugi proces, ale naprawiłoby to również blokowanie.

To wszystko sprowadza się do braku informacji o profilowaniu, nie możemy powiedzieć, że jeśli drugi proces przyspieszy lub spowolni działanie, musimy wiedzieć, czy program zawiesił się na operacji wejścia/wyjścia, blokowanie operacja lub po prostu długi czas w funkcji, która może być lepiej zrównoleglona.

+1

To jest dobre - wydaje się, że plakat jest zły na matematyce pierwszego stopnia, a reszta innych ludzi. Oto wyjaśnienie: wątek działa tylko na jednym rdzeniu. Zawsze. Nie można pracować na 2 rdzeniach jednocześnie. Tak więc przy użyciu 100% 4 rdzeni .... z 24 .... poziom wykorzystania os 4/24 = 16,7 maksimum (+ trochę dla systemu operacyjnego). Fizycznie niemożliwe, aby uzyskać więcej. Chcesz 100%? Przejdź do maszyny 4-rdzeniowej. – TomTom

+0

@TomTom Jak można przeczytać w pytaniu, po 4 wątkach aplikacja faktycznie * traci * wydajność. Ponadto na moim komputerze 4-rdzeniowym takie samo zachowanie występuje, gdy umieszczam więcej niż 2 wątki w niektórych intensywnych zadaniach. Jest dla mnie oczywiste, że aplikacja ma timeun maximun przydzielony przez system operacyjny, a wszystkie jej wątki muszą współdzielić ten timeslice. – ThunderGr

+0

@ThunderGr Każda nić pobiera swój własny czasownik, czyli punkt wątku.Pojedyncza maszyna może działać z jednym współbieżnym timelice, duet core może działać na dwóch równoległych odcinkach czasu, itd ... Problem z plakatem polega na tym, że moc obliczeniowa procesora nie jest jego problemem, jego program czeka na dysku, aby zwrócić niektóre IO lub jakiś zasób, który ma blokadę, aby zostać uwolnionym. Dodanie kolejnych wątków zwiększa niedostatek tego, co uruchamia jego program i sprawia, że ​​jest on *** wolniejszy *** –

0

Myślę, że dowiesz się, jaka pamięć podręczna plików nie jest idealna w przypadku, gdy jeden proces zapisuje dane w wielu plikach jednocześnie. Pamięć podręczna plików powinna zostać zsynchronizowana z dyskiem, gdy liczba brudnych stron pamięci podręcznej przekroczy próg. Wydaje się, że współbieżni pisarze w jednym próg uderzenia o proces szybciej niż pisarz pojedynczego wątku. Możesz przeczytać czytać o pamięci podręcznej systemu plików tutaj File Cache Performance and Tuning