2009-09-08 11 views
11

Zajmuję się rozwojem serwera w C#. Serwer ten będzie działał jako serwer danych dla usługi kopii zapasowej: klient będzie wysyłać dane, dużo danych, w sposób ciągły, konkretnie wyśle ​​fragment danych plików, do pięciu, w tym samym kanale tcp. Wyślę dane na serwer powoli, nie chcę zabijać przepustowości klientów, więc nie potrzebowałem przyspieszyć wysyłania danych do maksimum iz tego powodu mogę użyć jednego kanału TCP na wszystko.Socket.BeginReceive Performance na Mono

Powiedział, że tak naprawdę serwer używa metody BeginReceive do pozyskiwania danych z klienta, a w systemie Windows oznacza to IOCP. Moje pytania brzmią: w jaki sposób BeginReceive będzie działał na Linux-ie/freebsd? W systemie Windows przeczytałem wiele rzeczy, wykonam bardzo dobrze, ale to oprogramowanie, część serwerowa, będzie działała na platformie linux lub freebsd i nie wiem jak te metody są na niej zaimplementowane!

Więcej, aby zredukować dalsze alokacje obiektu Async State dla metody (Begin | End) Receive, w której znajduje się połączenie tcp, oraz w wywołaniu zwrotnym BeginReceive, a następnie skopiować dane przed ich ponownym użyciem (naturalnie nie. t jasne dane, ponieważ wiem, ile wartości odczytu EndReceive jest minimalna). Bufor ustawiony jest na 8kb, więc będę mógł maksymalnie skopiować 8kb danych, nie powinien zabijać resoruces.

Moim celem jest uzyskanie do 400/500 połączeń przy max. To nie jest tak dużo, ale serwer (maszyna) w międzyczasie będzie obsługiwał pliki za pomocą własnego systemu plików (opracowanego przy użyciu bezpiecznika najpierw w języku C# i później w C) w oprogramowaniu LVM + Linux Software Raid Mirror i antywirusowego sprawdzania przy użyciu clamav, tak oprogramowanie musi być jak najlżejsze!

Edycja: zapomniał, że urządzenie będzie (prawdopodobnie) Intel Core 2 Duo 2.66+ GHz (3 MB L2 - FSB 1066 MHz) 2 GB pamięci RAM, a więc przy użyciu 64 bitów.

Czy mono używa epoli (libevent) lub kqueue (na freebsd)? I powinienem zrobić coś konkretnego, aby zmaksymalizować wydajność? Czy mogę zrobić coś więcej, aby nie zabijać zasobów otrzymujących pakiety danych?

+1

Witamy w społeczności! – JoshJordan

Odpowiedz

2

Wiem, że to trochę późno, ale ja po prostu znaleźć to pytanie ...

Mono jest w stanie obsłużyć liczbę połączeń, które trzeba i wiele więcej. Regularnie testuję xsp2 (autonomiczny serwer Mono ASP.NET) z ponad 1 krotnie równoczesnymi połączeniami. Jeśli będzie to sytuacja dużego obciążenia, powinieneś zagrać trochę z ustawieniem MONO_THREADS_PER_CPU, aż znajdziesz odpowiednią liczbę wątków dla ThreadPool .

Na Linuxie, Mono używa epoli, gdy jest dostępny (co jest zawsze w dzisiejszych czasach).

+0

Odpowiedzi nigdy się nie spóźniają :) Naprawdę dziękuję! –

+0

Kiedy korzysta z epoll_ctl?Przeszedłem przez cały kod mono i istnieje tylko jego definicja w kodzie mono.posix –

+1

@AndriusBentkus jest w środowisku wykonawczym, a nie w bibliotekach klas: https://github.com/mono/ mono/blob/master/mono/metadata/tpool-epoll.c – Gonzalo

1

Nie mogę mówić konkretnie o wydajności tej jednej funkcji na mono, ale generalnie mono działa obecnie bardzo dobrze. 4-500 połączeń jest tak jak mówisz, niezbyt wiele, więc wątpię, byś miał jakiekolwiek problemy.

Mówiąc tak, nie powinno być bardzo trudno ustawić test dla tego rodzaju rzeczy. Myślę, że to prawdopodobnie jedyny sposób, by uzyskać rozstrzygającą odpowiedź na swoją sytuację.

+1

Dziękujemy za sugestię! Napisałem proste oprogramowanie antystresowe, które jest w stanie ustawić zestaw połączeń podczas wysyłania danych, jest to naprawdę proste. Testowanie mojego serwera w oknach z 3000 równoczesnymi połączeniami pokazało, że mój serwer obsłużyłby około 250 połączeń, ale myślę, że to zależy od mojej maszyny klienckiej (tej, która uruchamia oprogramowanie do stresu), ponieważ jest starym centrino 2ghz z 1gb pamięci (= to może wykonać tylko jeden wątek na czas). Muszę zrobić kilka poprawek, ale tego popołudnia wypróbuję to na moim komputerze testowym Linuksa! –