[thread] Nombre de thread Max
[thread] Nombre de thread Max
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...
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...
- benjarobin
- Maître du Kyudo
- Messages : 17187
- Inscription : sam. 30 mai 2009, 15:48
- Localisation : Lyon
Re: [thread] Nombre de thread Max
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 ?
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
Titre d'un sujet : [Thème] Sujet (état) / Règles du forum
Re: [thread] Nombre de thread Max
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...
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...
- benjarobin
- Maître du Kyudo
- Messages : 17187
- Inscription : sam. 30 mai 2009, 15:48
- Localisation : Lyon
Re: [thread] Nombre de thread Max
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
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...
Trust me I am an engineer Très sérieusement c'est presque mon cœur de métier.
Quand tu parles de
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
Titre d'un sujet : [Thème] Sujet (état) / Règles du forum
Re: [thread] Nombre de thread Max
Mon programme était structué comme ça :
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 ?
Code : Tout sélectionner
Create Connection
Listen
While True
Accept
Thread_Client
Re: [thread] Nombre de thread Max
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
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- benjarobin
- Maître du Kyudo
- Messages : 17187
- Inscription : sam. 30 mai 2009, 15:48
- Localisation : Lyon
Re: [thread] Nombre de thread Max
Si tu veux garder la connexion ouverte avec le client, cela ne change pas grand chose :
Dans le thread client
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
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
Code : Tout sélectionner
Attente sur poll ...
Zsh | KDE | PC fixe : core i7, carte nvidia
Titre d'un sujet : [Thème] Sujet (état) / Règles du forum
Titre d'un sujet : [Thème] Sujet (état) / Règles du forum
Re: [thread] Nombre de thread Max
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 : ?
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 */
- benjarobin
- Maître du Kyudo
- Messages : 17187
- Inscription : sam. 30 mai 2009, 15:48
- Localisation : Lyon
Re: [thread] Nombre de thread Max
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 ?
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
Titre d'un sujet : [Thème] Sujet (état) / Règles du forum
Re: [thread] Nombre de thread Max
A oui, c'est vrai. Je n'y avais pas pensé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...
Je ne sais pas trop, mais c'est surement > 1000...benjarobin a écrit : ↑jeu. 08 juin 2017, 17:24 Sinon plus sérieusement on parle de combien de client max ?
- benjarobin
- Maître du Kyudo
- Messages : 17187
- Inscription : sam. 30 mai 2009, 15:48
- Localisation : Lyon
Re: [thread] Nombre de thread Max
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...
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
Titre d'un sujet : [Thème] Sujet (état) / Règles du forum
Re: [thread] Nombre de thread Max (résolu)
Qui ne tente n'a rien n'a rien
Et puis il faut bien commencer quelque part...
Merci pour ton aide en tout cas !
Et puis il faut bien commencer quelque part...
Merci pour ton aide en tout cas !
Re: [thread] Nombre de thread Max
Salut,benjarobin a écrit : ↑jeu. 08 juin 2017, 17:24Et Non on ne fait pas une boucle comme un malade sur un recv
Mais sur cet exemple : https://github.com/linfan/TCP-IP-Networ ... CPclient.c à la ligne 36, il boucle bien sur un recv, non ?
- benjarobin
- Maître du Kyudo
- Messages : 17187
- Inscription : sam. 30 mai 2009, 15:48
- Localisation : Lyon
Re: [thread] Nombre de thread Max
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
Titre d'un sujet : [Thème] Sujet (état) / Règles du forum
Re: [thread] Nombre de thread Max
Ah bon ? Le flag MSG_DONTWAIT de recv() ne permet-il pas ne pas bloquer sur l'attente d'une réponse ?
- benjarobin
- Maître du Kyudo
- Messages : 17187
- Inscription : sam. 30 mai 2009, 15:48
- Localisation : Lyon
Re: [thread] Nombre de thread Max
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
Titre d'un sujet : [Thème] Sujet (état) / Règles du forum