J'ai une boîte à 8 cœurs relativement nouvelle exécutant CentOS. Je souhaite développer un serveur de statistiques utilisant TCP. C'est très simple, il accepte une connexion TCP, incrémente un compteur et ferme la connexion. Le hic, c'est qu'il doit le faire au moins 10 000 requêtes par seconde. Je soupçonne que le CPU / la mémoire ne sera pas un problème, mais je suis plus préoccupé par les limites artificielles (comme les connexions semi-ouvertes) que je pourrais avoir besoin de configurer sur mon serveur pour permettre ce type de volume. Alors, est-ce possible? Quels paramètres dois-je connaître? Ma carte réseau ne pourra-t-elle pas le gérer?
18
Réponses:
Ceci est communément appelé le problème c10k . Cette page contient de nombreuses bonnes informations sur les problèmes que vous rencontrerez.
la source
vous devriez pouvoir le faire [bien que ce soit probablement une mauvaise idée].
sur résine appserv, je peux obtenir ~ 5k req / sec sur quad core 2.6ghz xeon. les requêtes invoquent un servlet simple qui lit 1 ligne depuis mysql et envoie une très petite réponse xml.
le test a été fait avec
résultats de test:
mais je pense que vous ferez beaucoup mieux en utilisant un programme c simple, sûrement sans générer de nouveaux threads pour chaque demande. Le lien de Greg Hewgill devrait vous donner une bonne idée.
même pendant un test prolongé, je n'ai aucun problème de connectivité [prises semi-ouvertes mentionnées]; le test s'exécute entre deux boîtiers Linux connectés via Gigabit Ethernet [bien que, comme vous le voyez, la bande passante n'est pas un goulot d'étranglement].
la source
Vous pourriez être intéressé par une limite de noyau Linux que j'ai atteinte lors du test de charge d'Apache. Dans mon cas, le noyau a produit des messages d'erreur utiles, donc mon conseil est d'écrire votre programme et si vous semblez atteindre une limite, faites attention aux journaux du noyau.
la source
J'utiliserais UDP au lieu de TCP si possible. Il devrait être plus léger et donc plus évolutif.
la source
Votre nic devrait être capable de le gérer, mais je remets en question la conception d'avoir 10 000 nouvelles connexions TCP par seconde; si vous créez / détruisez des connexions aussi rapidement, vous devez soit a) les maintenir ouvertes plus longtemps, soit b) utiliser UDP à la place.
Dans le cas où vous avez 1M de clients qui doivent effectuer une requête de temps en temps, mais où la charge atteint 10 000 par seconde, UDP est probablement un meilleur choix.
Dans le cas où vous ne disposez que de 10 000 clients qui doivent effectuer une requête chaque seconde, ils peuvent simplement maintenir les connexions existantes ouvertes et les réutiliser. Ce serait beaucoup plus doux pour le système d'exploitation et produirait également beaucoup moins de latence car il ne nécessiterait pas une nouvelle poignée de main à chaque fois.
Dans le cas où vous avez 10 000 demandes par seconde, j'imagine que vous avez un équilibreur de charge frontal de toute façon, vous devrez donc le tester également.
(NB: je pense que cela appartenait à Stack Overflow)
la source