2009-09-08 16 views
11

Sto sviluppando un server in C#. Questo server fungerà da server di dati per un servizio di backup: un client invierà dati, molti dati, continuamente, in particolare invierà blocchi di dati di file, fino a cinque, nello stesso canale TCP. Trasmetterò i dati lentamente al server, non voglio uccidere la larghezza di banda del cliente, quindi non ho avuto bisogno di accelerare al massimo invio di dati e, per questo motivo, posso usare un singolo canale TCP per tutto.Socket.BeginReceive Performance on Mono

Detto questo, in realtà il server utilizza il metodo BeginReceive per acquisire dati dal client e, su Windows, questo significa IOCP. Le mie domande sono: come BeginReceive si esibirà su linux/freebsd tramite mono? Su Windows, ho letto un sacco di cose, si esibiranno molto bene ma questo software, la parte server, funzionerà su linux o freebsd tramite mono e non so come siano implementati questi metodi!

Altro, per provare a ridurre le allocazioni continue di un oggetto Async State per il metodo di ricezione (Begin | End) ne mantengo uno per la connessione TCP e nel callback BeginReceive copio i dati prima di riutilizzarlo (naturalmente non lo faccio t dati chiari in perché so quanta lettura attraverso il valore di ritorno di EndReceive). Buffer è impostato su 8kb, quindi a max copie 8kb di dati, non dovrebbe uccidere resoruces.

Il mio obiettivo è di ottenere fino a 400/500 connessioni al massimo. Non è tanto, ma il server (macchina), nel frattempo, gestirà i file attraverso un proprio filesystem (sviluppato utilizzando il fusibile prima in C# e successivamente in C) su LVM + Linux Software Raid Mirror e controllo antivirus usando clamav so il software deve essere leggero come può!

EDIT: Ho dimenticato di dire che la macchina sarà (probabilmente) un processore Intel Core 2 Duo 2.66+ GHz (3 MB L2 - FSB 1066 MHz) con 2 GB di RAM e il SO utilizzando 64 bit.

È mono che utilizza epoll (libevent) o kqueue (su freebsd)? E dovrei fare qualcosa di specifico per cercare di massimizzare le prestazioni? Posso fare qualcosa in più per non uccidere le risorse che ricevono i pacchetti di dati?

+1

Benvenuti nella comunità! – JoshJordan

risposta

2

so che è un po 'tardi, ma ho appena trovato questa domanda ...

Mono è in grado di gestire il numero di connessioni che è necessario e molto altro ancora. Eseguo regolarmente test xsp2 (il server autonomo Mono ASP.NET) con oltre 1k connessioni simultanee. Se si verifica una situazione di carico elevato, dovresti giocare un po 'con l'impostazione di MONO_THREADS_PER_CPU fino a trovare il giusto numero di thread per il ThreadPool .

Su linux, Mono usa epoll quando disponibile (che è sempre in questi giorni).

+0

Le risposte non sono mai in ritardo :) Grazie davvero! –

+0

Quando usa epoll_ctl?Ho grep'ed attraverso l'intero codebase di mono e c'è solo la definizione di esso nel codice di mono.posix –

+1

@AndriusBentkus è nel runtime, non nelle librerie di classi: https://github.com/mono/ mono/blob/master/mono/metadata/tpool-epoll.c – Gonzalo

1

Non riesco a parlare in modo specifico delle prestazioni di quell'unica funzione in mono, ma in generale, in questi casi, il mono funziona molto bene. Le connessioni 4-500 sono come dici tu, non molte, quindi dubito che tu abbia qualche problema.

Nel dire questo, non dovrebbe essere molto difficile impostare un test per questo genere di cose. Penso che questo sia probabilmente l'unico modo per ottenere una risposta definitiva per la tua situazione.

+1

Grazie per il tuo suggerimento! Ho scritto un semplice software di stress che è in grado di configurare un insieme di connessioni durante l'invio di dati, è davvero semplice. Testare il mio server su Windows con 3000 connessioni simultanee ha dimostrato che il mio server gestirà circa 250 connessioni, ma penso che questo dipenda dalla mia macchina client (quella che esegue il software stress) perché è un vecchio centrino 2ghz con 1gb di memoria (= può eseguire solo un thread alla volta). Ho bisogno di fare alcune correzioni, ma questo pomeriggio proverò questa roba sulla mia macchina di prova linux! –