2009-09-08 8 views
11

Je développe un serveur en C#. Ce serveur servira de serveur de données pour un service de sauvegarde: un client enverra des données, un grand nombre de données, en continu, enverra spécifiquement des fragments de données, jusqu'à cinq, dans le même canal tcp. Je vais envoyer les données au serveur lentement, je ne veux pas tuer la bande passante des clients, donc je n'ai pas besoin d'accélérer à l'envoi de données max et, pour cette raison, je peux utiliser un seul canal tcp pour tout. Cela dit, en réalité, le serveur utilise la méthode BeginReceive pour acquérir des données du client et, sur Windows, cela signifie IOCP. Mes questions sont: comment BeginReceive fonctionnera sur linux/freebsd en mono? Sur windows, j'ai lu beaucoup de choses, ça marchera très bien mais ce logiciel, la partie serveur, tournera sur linux ou freebsd en mono et je ne sais pas comment ces méthodes sont implémentées dessus! De plus, pour essayer de réduire les allocations continues d'un objet Async State pour la méthode de réception (Begin | End) j'en conserve une pour la connexion tcp et dans le callback BeginReceive je copie les données avant de les réutiliser (naturellement t effacer les données parce que je sais combien de lire la valeur de retour EndReceive). Buffer est réglé sur 8kb donc je vais au maximum copier 8kb de données, il ne devrait pas tuer se résorbe.Socket.BeginReceive Performance sur Mono

Mon objectif est d'obtenir jusqu'à 400/500 connexions à max. Ce n'est pas tellement, mais le serveur (machine), en attendant, manipulera les fichiers à travers un propre système de fichiers (développé en utilisant le fusible d'abord en C# et plus tard en C) sur LVM + Linux Software Raid Mirror et la vérification antivirus en utilisant clamav le logiciel doit être léger comme possible!

EDIT: J'ai oublié de dire que la machine sera (probablement) un Intel Core 2 Duo 2.66+ GHz (3 Mo L2 - FSB 1066 MHz) avec 2 Go de RAM et le SO utilisant 64 bits.

Est-ce que mono utilise epoll (libevent) ou kqueue (sur freebsd)? Et je devrais faire quelque chose de spécifique pour essayer de maximiser les performances? Puis-je faire quelque chose de plus pour ne pas tuer les ressources qui reçoivent des paquets de données?

+1

Bienvenue dans la communauté! – JoshJordan

Répondre

2

Je sais qu'il est un peu en retard, mais je viens de trouver cette question ...

Mono est capable de gérer le nombre de connexions que vous avez besoin et bien plus encore. Je teste régulièrement xsp2 (le serveur autonome Mono ASP.NET) avec plus de 1k connexions simultanées .. Si cela va être une situation de charge élevée, vous devez jouer un peu avec le réglage MONO_THREADS_PER_CPU jusqu'à ce que vous trouviez le bon nombre de threads pour le ThreadPool .

Sur linux, Mono utilise epoll lorsqu'il est disponible (ce qui est toujours de nos jours).

+0

Les réponses ne sont jamais en retard :) Vraiment merci! –

+0

Quand utilise-t-il epoll_ctl?J'ai grep'ed à travers la base de code entière de mono et il n'y a que la définition de celui-ci dans le code de mono.posix –

+1

@AndriusBentkus il est dans le runtime, pas les bibliothèques de classe: https://github.com/mono/ mono/blob/master/mono/métadonnées/tpool-epoll.c – Gonzalo

1

Je ne peux pas parler spécifiquement de la performance de cette fonction sur mono, mais en général mono fonctionne très bien ces jours-ci. 4-500 connexions est comme vous dites, pas très nombreuses, donc je doute que vous ayez des problèmes.

En disant cela, il ne devrait pas être très difficile d'établir un test pour ce genre de chose. Je pense que c'est probablement la seule façon d'obtenir une réponse concluante à votre situation.

+1

Je vous remercie pour votre suggestion! J'ai écrit un logiciel de stress simple qui est capable de configurer un ensemble de connexions tout en envoyant des données, c'est vraiment simple. Tester mon serveur sur Windows avec 3000 connexions simultanées a montré que mon serveur gérerait environ 250 connexions, mais je pense que cela dépend de ma machine cliente (celle qui exécute le logiciel de stress) parce qu'un vieux centrino 2ghz avec 1 Go de mémoire (= peut exécuter un seul thread à la fois). J'ai besoin de faire quelques corrections, mais cet après-midi je vais essayer ce truc sur ma machine de test Linux! –