TCP/IP - Résolution de la C10K avec le fil par l'approche client
Après la lecture de la célèbre C10k article et la recherche sur le web au sujet de la façon dont les choses ont évolué depuis qu'il a été écrit, je voudrais savoir si il serait possible pour un standard d'aujourd'hui server pour gérer les >10000 simultanées connexions à l'aide de un thread par connexion (éventuellement avec l'aide d'un pool de threads pour éviter la création/mise à mort).
Certains détails qui peuvent influer sur l'approche du problème:
- D'entrée, de traitement intermédiaires et de sortie.
- Longueur de chaque connexion.
- Spécifications techniques du serveur (cœurs de processeurs, RAM, etc...)
- Combiner ce système avec d'autres techniques comme l'AIO, de sondages, de fils verts, etc...
Évidemment, je ne suis pas un expert en la matière, de sorte que toutes les remarques et conseils seront très appréciés 🙂
- Très brièvement: il est donc possible, c'est rarement une bonne idée (avec du fil de frais de changement de atteindre les 100K de cycles CPU facilement, d'avoir un trop grand nombre de threads se coûteux pour aucune raison apparente).
Vous devez vous connecter pour publier un commentaire.
Absolument. Un serveur peut gérer plus de 10K connexions simultanées en utilisant le modèle avec un thread par connexion. Je dois construire une telle demande, et il y a cinq ans, il a été en cours d'exécution avec plus de 50 connexions simultanées par processus sur un serveur Linux. De nos jours, il devrait être possible d'exécuter la même application avec plus de 250 connexions simultanées sur le matériel actuel.
Il ya seulement quelques choses à garder à l'esprit:
SO_REUSEPORT
.open files
(par défaut 1.024),max user processes
/proc/sys/kernel/pid_max
(par défaut 32K),/proc/sys/kernel/threads-max
, et/proc/sys/vm/max_map_count
(par défaut 65K).La demande mentionnée ci-dessus a été initialement conçu pour gérer uniquement les 2K de connexions simultanées. Cependant, avec la croissance de l'utilisation, nous n'avons pas eu à faire d'importantes modifications au code afin de l'échelle jusqu'à 50 connexions.
read()
à l'appel suivant, selon les données arrivent. Il fonctionne, évidemment, mais il y a plus évolutif dessins.Vous aimeriez un suivi récent sur le sujet: Le Secret De 10 Millions De Connexions Simultanées -Le Noyau Est Le Problème, Pas La Solution.
Les approches habituelles pour les serveurs sont soit: (a) un thread par connexion (souvent avec un pool de threads), ou (b) à thread unique avec asynchrone IO (souvent avec epoll ou kqueue). Ma pensée est que certains éléments de ces approches peut, et doit souvent être associée à l'utilisation asynchrone IO (avec epoll ou kqueue), puis transmettre la demande de connexion à un pool de threads pour traiter. Cette approche permettrait de combiner l'efficacité de l'envoi asynchrone IO avec le parallélisme fournis par le pool de threads.
J'ai écrit un serveur pour le fun (en C++) qui utilise epoll sur Linux et kqueue sur FreeBSD et OSX avec un pool de threads. J'ai juste besoin de le lancer à travers ses rythmes lourds dans les essais, faire un peu de nettoyage de code, puis le jeter sur github (bientôt je l'espère).
epoll
n'était pas exactement asynchrone. Après quelques recherches j'ai trouvé plusieurs textes disant queAIO
serait mieux travailler en combinaison avec un pool de threads, etepoll
avec un seul thread: la Comparaison de l'aio et epoll.AIO
, il est peut-être encore plus rentable d'utiliser leepoll
+ pool de threads approche. whats-the-difference-between.... Ma propre idée à ce sujet est qu'il serait possible d'utiliser directement un thread du pool à main de chaque de connexion jusqu'à ce que le nombre de connexions simultanées à l'approche du nombre maximal de threads que le système peut supporter, et ensuite on peut utiliser le...