2009-11-04 11 views
10

Podczas testowania serwera multiemisji UDP, który napisałem na Windows 7 Ultimate x64, natknąłem się na najbardziej interesującą rzecz. Odtwarzanie muzyki za pomocą foobar2000 w tle znacznie poprawiło szybkość transmisji serwera, ale również poniosło niewielką utratę pakietów. Wyłączenie muzyki natychmiast obniżyło prędkość transmisji poniżej akceptowalnych poziomów, ale również spowodowało utratę pakietów. (Mam aplikację kliencką, która komunikuje się z serwerem i zgłasza niepotwierdzone pakiety)Najlepsze praktyki wysokowydajnych aplikacji sieciowych

Jestem świadomy dławiącego (i up) zachowania Vista, aby media i aplikacje sieciowe dobrze się ze sobą grały, ale na pewno nie spodziewałem się, że gra Muzyka poprawiłaby wydajność sieci, a także znacznie go obniżyła.

Co mogę zrobić z punktu widzenia kodu w mojej aplikacji serwerowej, aby konsekwentnie realizować odtwarzanie muzyki w systemie Vista i nie? Z pewnością chciałbym uniknąć informowania wszystkich moich klientów o tym, jak poprawić ich rejestr, aby uzyskać akceptowalne stawki transmisji, i chciałbym również uniknąć sytuacji, w której po prostu "odtwarzałbym muzykę", aby uzyskać akceptowalne stawki transmisji. Aplikacja powinna "po prostu działać" w mojej opinii.

Myślę, że rozwiązanie to obejmuje coś podobnego do priorytetów procesów, MMCSS lub być może jakieś inne niejasne wywołanie interfejsu Windows API, aby zmusić go do zrobienia The Right Thing (TM) tutaj.

Przykro mi, ale tworzenie powtarzalnego przypadku testowego to nietuzinkowa ilość pracy. Zachowanie dławienia występuje tylko wtedy, gdy sterownik fizycznej karty sieciowej aktywnie wykonuje pracę i nie może być odtworzony za pomocą interfejsu pętli zwrotnej. Do przetestowania potrzebna byłaby implementacja klienta, implementacja serwera i fizyczny sprzęt sieciowy.

+0

Kiedy mówisz "odtwarza muzykę", masz na myśli, że odtwarza muzykę w HD i używa karty dźwiękowej? Czy jest to przesyłanie strumieniowe za pośrednictwem tej samej karty sieciowej? – Toad

+0

@reinier: Tak, foobar2000 powoli ładuje dane z HD i przesyłane strumieniowo audio do mojego zewnętrznego interfejsu audio przez USB 2.0. –

Odpowiedz

3

To, co obserwujesz, jest efektem ubocznym twojego odtwarzacza multimedialnego ustawiającego rozdzielczość zegara twojego urządzenia na 1 ms.

Dzieje się tak tylko podczas odtwarzania

Ubocznym efektem jest - aplikacja ma mniejsze dopowiednią część czasu i to imporves aplikację bo prawdopodobnie miał dużo CPU skradzione z aplikacji i dłuższe dopowiednią część czasu - na dłużej czas.

Aby to przetestować, możesz po prostu ustawić rozdzielczość zegara w swojej aplikacji na 1 ms i porównać wydajność odtwarzania bez odtwarzacza multimedialnego.

Powinny być takie same, jak w przypadku braku ustawień clocres, ale z odtwarzaniem multimediów.

0

Foobar ma wiele wtyczek napisanych przez różnych ludzi. To może być przyczyną Twojego problemu. Proponuję, abyś zbliżył się do prawdziwego powodu. Spróbuj wyłączyć wtyczki jeden po drugim, wykonując test za każdym razem, gdy wtyczka jest wyłączona.

Mam nadzieję, że pomysł pomoże.

+0

Bardzo wątpię, że problem jest specyficzny dla foobar2000. Spróbuję innych odtwarzaczy multimedialnych, aby dokładniej zdiagnozować problem. To * może * mieć coś wspólnego z interfejsem audio USB 2.0, którego używam. Przeprowadzę też testy z wbudowaną kartą dźwiękową. –

0

To brzmi jak przepustowość zarządzania TSP/IP na podstawie jej prymitywnego algorytmu. Biała księga powinna dać więcej tła. http://www.asperasoft.com/?gclid=CICSzMqD8Z0CFShGagod_ltSMQ Ich produkt jest protokołem UDP, który działa bardzo dobrze.

+0

Należy wspomnieć, że używam protokołów TCP i UDP w tej samej aplikacji. TCP służy wyłącznie do informacji kontrolnych i koordynacji wszystkich klientów; nie powinno to być wąskim gardłem. Używam UDP wyłącznie do przesyłania danych i przechowuję pakiety poniżej 1500 bajtów. Używałem wszystkich UDP, ale wpadłem w poważne problemy z synchronizacją i miałem zamiar ponownie wymyślić koło TCP, więc powiedziałem, dlaczego nie wystarczy użyć TCP. –

+0

TCP/IP to pierwsze miejsce, w którym będę szukał Twojego problemu. –

+0

@Mike: Czy uważasz, że utrata pakietów UDP po stronie serwera jest w jakiś sposób powiązana z komunikacją TCP? Protokół TCP jest używany tylko do powiadamiania wszystkich klientów o wysłaniu następnej partii danych za pośrednictwem protokołu UDP. Istnieje również komunikat "pełny sektor", który jest wysyłany po krótkim opóźnieniu z serwera. Podczas przesyłania wsadowego UDP nie ma żadnych komunikatów TCP wysyłanych tam iz powrotem przez aplikację, z wyjątkiem zwykłego przepływu ruchu TCP, który system operacyjny wykonuje, aby utrzymać ustanowione połączenie. –

2

Minęło wiele lat, odkąd napisałem kod związany z protokołem sieciowym, ale dam znać.

Podejrzewam, że jest to problem z throughput and latency. Odtwarzanie muzyki wprowadza rywalizację I/O i dodaje opóźnienie w przesyłaniu pakietów. Jednak dodatkowe opóźnienie prawdopodobnie powoduje, że pakiety są w kolejce, a co za tym idzie zwiększają przepustowość przepustowości.

Aby rozwiązać ten problem w kodzie, możesz spróbować przesłać pakiety partiami. Zakładam, że przesyłasz każdy pakiet do systemu w celu przesłania, gdy dane staną się gotowe. Grupuj wiele pakietów i wysyłaj je do systemu w tym samym czasie. Nawet grupa dwóch lub trzech pakietów może sprawić dramatyczną różnicę, szczególnie jeśli między każdym wywołaniem systemowym jesteś introducing your own small delay.

Nie mogłem znaleźć żadnych bezpośrednich linków z szybkiego wyszukiwania w Google. Jednak można zobaczyć koncepcję w this discussion of network tuning for Linux lub w this FAQ, która opisuje techniki takie jak grupowanie w celu zwiększenia przepustowości.

+0

Pakuję już pakiety w grupach o rozmiarze 1024. Pakiety mają po około 1400 bajtów. Dostaję około 50-60 negatywnie potwierdzonych pakietów przez klienta z 1024. Po wyłączeniu odtwarzacza multimediów na komputerze serwera liczba NAK spada natychmiast do 0 i uzyskuje się lepszą przepustowość. Wydaje się to wskazywać, że serwer odpowiada za utratę pakietów. Zastanawiam się, co mogę zrobić po stronie serwera, jeśli w ogóle, aby automatycznie przystosować się do tego konfliktu we/wy. –

+0

Twój komentarz wydaje się wskazywać na przeciwieństwo twojego pytania. Czy naprawdę próbujesz wysłać 1024 pakiety co 50-100 μs? To szalona przepustowość. I czy problemem jest naprawdę przepustowość czy utrata danych? –

+0

O nie, nie. Opóźnienie 50-100 mikrosekund to opóźnienie między wysyłaniem pojedynczych pakietów w sektorze 1024 pakietów. Ponadto nie sądzę, abym wspomniał o mojej 50-100 mikrosekundowej zwłoce w tym pytaniu. Czy łączysz moje pytania dotyczące SO? :) –