[thread] Nombre de thread Max

Applications, problèmes de configuration réseau
Répondre
kunsochi
Daikyu
Messages : 71
Inscription : lun. 01 sept. 2014, 21:07

[thread] Nombre de thread Max

Message par kunsochi »

Bonjour,
Le nombre de thread max sur une distrib linux est bien donné dans le fichier : /proc/sys/kernel/thread-max ? Mais je crois que ca ce change

Pour un ordinateur Intel Core I7, 16 Go Ram, on peut avoir combien de thread max, pour le bon fonctionnement de la machine ?

En faite, je suis entrain de développer un jeu et le serveur est sur une distrib linux. Et à chaque fois qu'un client se connecte au serveur, je créer un thread pour le client (qui dure tant que le client est connecté au serveur), pour pouvoir gérer un grand nombre de client, sans monopoliser le serveur.
Mais ça fait beaucoup de thread s'il y a beaucoup de client...
Avatar de l’utilisateur
benjarobin
Maître du Kyudo
Messages : 17186
Inscription : sam. 30 mai 2009, 15:48
Localisation : Lyon

Re: [thread] Nombre de thread Max

Message par benjarobin »

Bonjour,
Avoir beaucoup de thread qui ne font rien n'est pas un problème, cela consomme juste un peu de RAM.
Par contre avoir trop de thread actif en même temps n'est pas une bonne idée.

Je ne pense pas qu'avoir un thread par client soit une très bonne idée, faire les choses de manière événementielle avec un nombre limité de thread est la bonne façon de faire.
Que fais tu dans le thread du client ?
Zsh | KDE | PC fixe : core i7, carte nvidia
Titre d'un sujet : [Thème] Sujet (état) / Règles du forum
kunsochi
Daikyu
Messages : 71
Inscription : lun. 01 sept. 2014, 21:07

Re: [thread] Nombre de thread Max

Message par kunsochi »

Salut,
Chaque thread est en attente d'une requête du client, puis traite la requête et renvoie une réponse.
Après, si je ne fais pas un thread pour chaque client, s'il y a plusieurs client qui se connecte en même temps ca ne vas pas aller.
Et quand je suis en attente d'une requête il faut que je spécifie sur quel client (socket du client) j'attends...
Avatar de l’utilisateur
benjarobin
Maître du Kyudo
Messages : 17186
Inscription : sam. 30 mai 2009, 15:48
Localisation : Lyon

Re: [thread] Nombre de thread Max

Message par benjarobin »

C'est là où tu te trompes (où alors tu as vraiment un problème de design), tu peux très bien avoir qu'un seul thread (après tu pourras améliorer pour avoir un pool de thread) et cela marchera très bien.
Trust me I am an engineer :-) Très sérieusement c'est presque mon cœur de métier.

Quand tu parles de
kunsochi a écrit : jeu. 08 juin 2017, 15:31puis traite la requête et renvoie une réponse.
Qu'est ce que cela fait ? Tu fais quoi concrètement ?

D'ailleurs sait tu que créer un thread est assez couteux ? Après tout est relatif, mais quand tu parles de performance ceci n'est pas négligeable surtout si tu veux pouvoir répondre en moins d'une milliseconde.

Même si tu fais des traitements très lourds cela ne changera rien d'avoir plusieurs threads.
Imagine que tu n'as qu'un processeur avec un seul cœur, on est d'accord qu'il ne peut faire qu'une seule chose à la fois en même temps ? Si tu as 2 threads qui doivent faire des calcules, avec un seul cœur les calcules seront fait les un après les autres. Donc avoir plusieurs threads ne résout absolument pas ton problème.

Aujourd'hui avec le multi-cœur, pour utiliser tous les cœurs efficacement on utilise plusieurs threads (avant on le faisait aussi mais par simplicité ou mauvais design), dans l'idéal on utilise un nombre de cœur égale au nombre de core virtuel du processeur.
Chacun de ces cœurs est en écoute sur "accept" (cela fonctionne sans aucun souci sous Linux, je ne parles pas de Windows), c'est le premier thread de libre qui prends la socket du client. Et ainsi tu n'as même pas besoin de thread principal qui dispatche les requêtes.

Ne te fais pas avoir, au plus tu augmentes le nombre de thread, au plus ton programme sera lent, à cause du contexte switching, des caches miss, etc... Dans certains cas un programme mono threadé bien écrit peut être plus rapide qu'un programme multi threadé même sur un core i7...
Zsh | KDE | PC fixe : core i7, carte nvidia
Titre d'un sujet : [Thème] Sujet (état) / Règles du forum
kunsochi
Daikyu
Messages : 71
Inscription : lun. 01 sept. 2014, 21:07

Re: [thread] Nombre de thread Max

Message par kunsochi »

Mon programme était structué comme ça :

Code : Tout sélectionner

Create Connection

Listen

While True
    Accept
    Thread_Client
Donc si j'enlève le thread, et que je laisse la connexion ouverte avec le client, il ne reviendra jamais sur le Accept pour accepter d'autres client ?
Avatar de l’utilisateur
waitnsea
Maître du Kyudo
Messages : 2114
Inscription : jeu. 15 mars 2012, 05:08

Re: [thread] Nombre de thread Max

Message par waitnsea »

Bonjour,
Je me demande s'il n'y a pas un problème de vocabulaire entre thread au sens multithreading et threads comme ici :https://unix.stackexchange.com/question ... thread-max ou http://dustycodes.wordpress.com/2012/02 ... r-process/ car # cat /proc/sys/kernel/pid_max retourne 127072 chez moi
Avatar de l’utilisateur
benjarobin
Maître du Kyudo
Messages : 17186
Inscription : sam. 30 mai 2009, 15:48
Localisation : Lyon

Re: [thread] Nombre de thread Max

Message par benjarobin »

Si tu veux garder la connexion ouverte avec le client, cela ne change pas grand chose :

Code : Tout sélectionner

Creation threads clients...
Create Connection
Listen

While True
    Accept
    
    Passe/ajoute la connexion à un thread (on ajoute le fd au tableau de poll du thread)
    Notifie le thread d'une nouvelle connexion (via notifyfd)
    
    Ou utilisation de epoll
Dans le thread client

Code : Tout sélectionner

Attente sur poll ...
Alors oui cela semble plus compliqué (et cela l'est), mais bien fait c'est plus rapide, et utilise très très peu de thread
Zsh | KDE | PC fixe : core i7, carte nvidia
Titre d'un sujet : [Thème] Sujet (état) / Règles du forum
kunsochi
Daikyu
Messages : 71
Inscription : lun. 01 sept. 2014, 21:07

Re: [thread] Nombre de thread Max

Message par kunsochi »

Donc si j'ai bien compris, ici il y a un seul thread qui contient un tableau de tous les fd, et ce thread va servir à communiquer avec tous les clients ?
Donc dans le thread, je fais une boucle qui fait un recv non bloquant sur tous les fd, pour voir si je recois quelque chose d'un client.
Et des que je recois une requête, je la traite, puis je recommence à boucler sur les fd pour attendre une requete ?
Quelque chose du genre :

Donc mon thread ressemblerait à un truc comme ca : ?

Code : Tout sélectionner

While True
    Tableau /* Tableau des fd */
    For fd In Tableau
        buffer = Recv Non Bloquant Sur fd
        
        /* Si je reçois une requête */
        If buffer Not Null
            /* Je traite la requête du client */
Avatar de l’utilisateur
benjarobin
Maître du Kyudo
Messages : 17186
Inscription : sam. 30 mai 2009, 15:48
Localisation : Lyon

Re: [thread] Nombre de thread Max

Message par benjarobin »

Alors oui et non pour le un seul thread, tu peux très bien en avoir plusieurs et répartir les fd des clients entre les différents threads...

Et Non on ne fait pas une boucle comme un malade sur un recv, mais tu as compris l'idée. Tu as poll (avant tu avais select) pour ceci, ou encore mieux epoll (mais bien plus complexe à mettre en place, si tu as beaucoup de connexion c'est ce qu'il y a de mieux. Quand je parle de beaucoup c'est > 1000). C'est une fonction qui dispatch les événements sur fd

Comme tu ne dois pas bloquer sur un recv, tu dois construire le message dynamiquement, car il peut être fragmenté, tu peux recevoir qu'un seul morceau et la suite plus tard. Je t'avais prévenu que c'était plus complexe à faire...

Sinon plus sérieusement on parle de combien de client max ?
Zsh | KDE | PC fixe : core i7, carte nvidia
Titre d'un sujet : [Thème] Sujet (état) / Règles du forum
kunsochi
Daikyu
Messages : 71
Inscription : lun. 01 sept. 2014, 21:07

Re: [thread] Nombre de thread Max

Message par kunsochi »

benjarobin a écrit : jeu. 08 juin 2017, 17:24 Comme tu ne dois pas bloquer sur un recv, tu dois construire le message dynamiquement, car il peut être fragmenté, tu peux recevoir qu'un seul morceau et la suite plus tard. Je t'avais prévenu que c'était plus complexe à faire...
A oui, c'est vrai. Je n'y avais pas pensé :o
benjarobin a écrit : jeu. 08 juin 2017, 17:24 Sinon plus sérieusement on parle de combien de client max ?
Je ne sais pas trop, mais c'est surement > 1000...
Avatar de l’utilisateur
benjarobin
Maître du Kyudo
Messages : 17186
Inscription : sam. 30 mai 2009, 15:48
Localisation : Lyon

Re: [thread] Nombre de thread Max

Message par benjarobin »

Donc oui utiliser un thread par client n'est pas vraiment une bonne idée
Bref, je te conseil epoll, cela évitera l'utilisation de notifyfd, mais tu me fait un peu peur, sans te vexer, si tu te poses ces questions pour quelques choses d'aussi "complexe", je ne suis pas sûr du résultat...
Zsh | KDE | PC fixe : core i7, carte nvidia
Titre d'un sujet : [Thème] Sujet (état) / Règles du forum
kunsochi
Daikyu
Messages : 71
Inscription : lun. 01 sept. 2014, 21:07

Re: [thread] Nombre de thread Max (résolu)

Message par kunsochi »

Qui ne tente n'a rien n'a rien ;)
Et puis il faut bien commencer quelque part...
Merci pour ton aide en tout cas !
kunsochi
Daikyu
Messages : 71
Inscription : lun. 01 sept. 2014, 21:07

Re: [thread] Nombre de thread Max

Message par kunsochi »

benjarobin a écrit : jeu. 08 juin 2017, 17:24Et Non on ne fait pas une boucle comme un malade sur un recv
Salut,
Mais sur cet exemple : https://github.com/linfan/TCP-IP-Networ ... CPclient.c à la ligne 36, il boucle bien sur un recv, non ?
Avatar de l’utilisateur
benjarobin
Maître du Kyudo
Messages : 17186
Inscription : sam. 30 mai 2009, 15:48
Localisation : Lyon

Re: [thread] Nombre de thread Max

Message par benjarobin »

Oui, mais la socket est en mode bloquant, je parlais bien (implicitement) de ne pas le faire avec une socket ouverte en mode non blockant
Zsh | KDE | PC fixe : core i7, carte nvidia
Titre d'un sujet : [Thème] Sujet (état) / Règles du forum
kunsochi
Daikyu
Messages : 71
Inscription : lun. 01 sept. 2014, 21:07

Re: [thread] Nombre de thread Max

Message par kunsochi »

Ah bon ? Le flag MSG_DONTWAIT de recv() ne permet-il pas ne pas bloquer sur l'attente d'une réponse ?
Avatar de l’utilisateur
benjarobin
Maître du Kyudo
Messages : 17186
Inscription : sam. 30 mai 2009, 15:48
Localisation : Lyon

Re: [thread] Nombre de thread Max

Message par benjarobin »

Oups pas vu, désolé... Mais si tu regardes bien, il quitte la boucle s'il n'a pas reçu un message. Ceci n'est qu'un exemple simplifié...
Zsh | KDE | PC fixe : core i7, carte nvidia
Titre d'un sujet : [Thème] Sujet (état) / Règles du forum
Répondre