IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

[Questions] Développement côté serveur.


Sujet :

C#

  1. #1
    Candidat au Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Mars 2015
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Mars 2015
    Messages : 7
    Points : 2
    Points
    2
    Par défaut [Questions] Développement côté serveur.
    Bonjour tout le monde
    J'avais déjà posé des questions il y a quelques mois, et je remercie encore les personnes m'ayant répondu !

    Mon projet actuel concerne un serveur de jeu ayant en moyenne 2000 clients connectés.

    L'objectif que je me suis fixé est de rendre fluide ou du moins d’exécuter dans des délais extrêmement faibles n'importe quelle requête du client (Tout comme chaque bon développeur de serveur )

    Cela fait déjà quelques temps que je me renseigne sur comment optimiser et gagner un maximum de performances sur son code, à un tel point que j'en suis perdu !

    Premièrement, je suis un peu perdu sur l'utilisation des Threads :

    - Faut-il utiliser des Threads, des Tasks, quelle est la différence entre les deux ?

    - Peut-on "attribuer" un Thread à une classe, et faire en sorte que dès qu'une fonction appartenant à cette classe est lancée, celle-ci soit exécutée sur le Thread attribué à la classe ?

    - J'ai entendu dire que le ThreadPool du Framework .Net contenait un certain nombre de Thread, et que si les tous les Threads étaient utilisés en même temps, les fonctions ne seraient plus exécutées jusqu'à tant que le pool se libère (Du coup très mauvais pour un serveur )

    -J'entend beaucoup parler de Async et Await, je ne sais pas si le fait d'avoir des Threads et des opérations Asynchrones soit conseillé ?

    Ensuite, je suis bloqué sur les Collections :

    - J'ai eu l'occasion de voir sur des sites que les performances du Dictionnary<> étaient beaucoup plus intéressantes que celles de la List<> .. faut-il bannir les listes et n'utiliser que les dictionnaires ? (A part quand l'utilisation du dictionnaire se voit impossible )

    - J'utilise "readerwriterlockslim" afin de sécuriser l’accès à mes collections. Mais si, admettons 20 Threads viennent essayer de lire des donnés dans une seule collection, toutes les opérations seront-elles exécutées simultanément ou les unes à la suite des autres ?

    - J'ai mis le doigt sur le "HashSet", je ne comprends pas comment retrouver un objet, par exemple un client, dans ce fameux "HashSet", si cela est possible

    J'essaye de communiquer avec ma base de données le moins possible, en stockant un maximum d'information parce que je sais que les requêtes avec la base de données sont souvent la cause de latences extrêmes ..

    Voilà, je pense avoir fais le tour . Si vous pensez pouvoir nous apporter des techniques supplémentaires, n'hésitez pas ! Ce sont vraiment des sujets flous dans ma tête, soyez cool si des questions vous semblent ridicules

    Merci d'avance à ceux qui prendront la peine de m'aider

  2. #2
    Expert confirmé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2006
    Messages
    3 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 580
    Points : 5 195
    Points
    5 195
    Par défaut
    Thread ou Task :

    Les tasks vont s'appuyer sur des Thread mais en rendre l'utilisation un peu plus agréable... On peut dire que Task est un objet de plus au niveau que les Threads..

    D'après mes recherches, lectures, pas de réelle différence de performance entre les deux...

    Collections:
    Oui, les Dictionary est plus rapide... est-ce significatif pour 2000 objets.. pas forcément de façon énorme.

    Après, si tu accèdes à ta list / dictionary en mode lecture, je ne pense pas que celà soit génant que plusieurs Thread y accèdent simultanément.

    Par contre, si un Thread peut modifier un objet de la liste, il est préférable de locker l'accès durant la modification de l'objet uniquement !!!

    Si tu veux optimiser ton serveur, la première chose à faire est d'essayer de trouver les points qui ralentisse tes opérations... et donc, de "monitorer" le temps
    d'éxécution des opérations pour identifier les opérations qui seraient un peu longue et voir comment y remédier...

    Parfois, on atteint la limite du code et les optimisations n'apportent rien... et là, celà veut dire qu'il faut passer sur une machine (serveur) plus puissant..
    The Monz, Toulouse
    Expertise dans la logistique et le développement pour
    plateforme .Net (Windows, Windows CE, Android)

  3. #3
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    Citation Envoyé par Tazman99 Voir le message
    - Faut-il utiliser des Threads, des Tasks, quelle est la différence entre les deux ?
    thread est la classe historique permettant de faire du multithreading (avec le threadpool)
    microsoft a ensuite développer des sous classes pour facilter l'utilisation (task, async et await qui sont basés sur les taks ...)

    le threadpool est à éviter dans ton cas, il n'y a que x threads simultannéments, x étant en général le nombre de coeur
    de ce fait si tu dis au threadpool de faire 30 trucs il va en lancer x puis et dès qu'un se fini un autre se lance
    alors que souvent dans un code, il y a des latences (base de données ou autre) qui font que démarrer plus de threads que de coeur vaut le coup
    si tu démarres 30 threads d'un coup ca ira souvent plus vite
    task je n'ai pas trop regardé comment c'était codé derrière, mais à moins d'en vérifier le code je pense que tu devrais rester sur les threads simples

    Citation Envoyé par Tazman99 Voir le message
    - Peut-on "attribuer" un Thread à une classe, et faire en sorte que dès qu'une fonction appartenant à cette classe est lancée, celle-ci soit exécutée sur le Thread attribué à la classe ?
    non pas vraiment
    enfin tout est bricolable ^^
    un thread démarre sur une méthode, et s'arrête à la fin de celle ci (pour un thread sans fin c'est un while true)
    et puis une méthode sur une classe ca ne veut pas forcément dire grand chose
    un thread par instance ca a déjà plus de sens et c'est faisable
    après je partirais plus sur un ou plusieurs threads par clients, et un thread par instance de fonctionnalité du jeu


    Citation Envoyé par Tazman99 Voir le message
    - J'ai eu l'occasion de voir sur des sites que les performances du Dictionnary<> étaient beaucoup plus intéressantes que celles de la List<> .. faut-il bannir les listes et n'utiliser que les dictionnaires ? (A part quand l'utilisation du dictionnaire se voit impossible )
    le dictionary est un genre de list dont la clé est du type qu'on veut, et ne se suit pas forcément
    un list ca va de 0 à n, quand tu demandes l'instance à l'index 8 ca te le retourne tout de suite
    le dictionary ayant des clés d'un type autre qu'int32 a un mécanisme derrière lui permettant d'être très performant
    il hashe l'instance de la clé, et garde un index pour utilisation par dichotomie, il retrouve donc une instance liée à une clé en quelques itérations (genre une petite dizaine) au lieu de parcourir toute la collection
    si tu utilises ton list avec accès direct le dictionary ne t'amènera rien
    par contre chaque fois ou tu fais une boucle pour retrouver quelque chose dedans oui ca sera utile
    et tu peux faire plein de dictionary qui stocke les mêmes infos, pour faire des caches
    genre un dictionary<direction,list<joueur>> comme ca tu peux retourver tous ceux qui vont dans un sens précis
    après il faut gérer la modification des indexes en fonction du changement des données, ce qui peut impacter les performances

    Citation Envoyé par Tazman99 Voir le message
    - J'utilise "readerwriterlockslim" afin de sécuriser l’accès à mes collections. Mais si, admettons 20 Threads viennent essayer de lire des donnés dans une seule collection, toutes les opérations seront-elles exécutées simultanément ou les unes à la suite des autres ?
    le lock tout court interdit 2 threads d'accéder au verrous
    par contre le readerwriterlockslim ne bloquent tous les threads seulement si un est en écriture
    si 20 threads veulent l'accès en lecture les 20 l'ont
    lecture et écriture ne sont ici que des termes, dans les fait on fait ce qu'on veut une fois le verrou acquis

    Citation Envoyé par Tazman99 Voir le message
    - J'ai mis le doigt sur le "HashSet", je ne comprends pas comment retrouver un objet, par exemple un client, dans ce fameux "HashSet", si cela est possible
    jamais utilisé, mais si j'en crois msdn c'est ce qui est utilisé par le dictionary pour aller vite (hashage)

    Citation Envoyé par Tazman99 Voir le message
    J'essaye de communiquer avec ma base de données le moins possible, en stockant un maximum d'information parce que je sais que les requêtes avec la base de données sont souvent la cause de latences extrêmes ..
    une base de données ca peut s'optimiser aussi (schéma, indexes ...)
    après ca n'ira jamais aussi vite qu'un cache en .net
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  4. #4
    Candidat au Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Mars 2015
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Mars 2015
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Merci pour vos réponses ! ça devient de plus en plus clair

    Pol63 quand vous dites "un ou plusieurs threads par clients, et un thread par instance de fonctionnalité du jeu", je ne comprends pas vraiment comment faire cela, parce qu'un Thread s'arrête après l’exécution d'une method

  5. #5
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    comme je l'ai dit un thread ne s'arrête pas si on met un while true
    par contre un while true consomme trop si on ne met pas de thread.sleep

    je ne sais pas si tu en as besoin dans ton cas mais un des scenarii possible c'est qu'un client flag un truc (ou ajoute quelque chose à une collection thread safe)
    et un thread s'occupe de le traiter

    (c'ests du vb.net mais ca peut se traduire en c#)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    while true
      try
        if quelque chose à traiter then
            /// code
        end if 
      catch ex as exception
          // log
      end try
      system.threading.thread.sleep(5) 'sleep à faire varier selon le niveau d'urgence entre 1 et beaucoup, mais sans le sleep cette boucle va consommer 100% sur un coeur
    end while
    ceci fait un thread qui ne s'arrête pas et qui fait un traitement quand il y a besoin
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  6. #6
    Candidat au Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Mars 2015
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Mars 2015
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Ah oui d'accord j'ai compris

Discussions similaires

  1. Développer un serveur SOAP dedié...
    Par cheprod dans le forum XML/XSL et SOAP
    Réponses: 2
    Dernier message: 09/02/2006, 11h56
  2. Question sur les serveurs (suite)
    Par ChriGoLioNaDor dans le forum C++
    Réponses: 2
    Dernier message: 12/01/2006, 01h03
  3. Question sur les serveurs
    Par ChriGoLioNaDor dans le forum C++
    Réponses: 2
    Dernier message: 07/01/2006, 00h55
  4. Question (migration de serveur)
    Par Fabsou dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 16/08/2004, 11h36
  5. Quel outil pour du développement Client/Serveur (Win XP) ?
    Par jey_bonnet dans le forum Débats sur le développement - Le Best Of
    Réponses: 5
    Dernier message: 02/11/2002, 14h57

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo