2009-11-07 3 views
5

Il existe des limites imposées par la mémoire disponible, la bande passante, le processeur et, bien sûr, la connectivité réseau. Mais ceux-ci peuvent souvent être mis à l'échelle verticalement. Y a-t-il d'autres facteurs limitatifs sur Linux? Peuvent-ils être surmontés sans modifications du noyau? Je soupçonne que, si rien d'autre, le facteur limitant deviendrait le gigabit ethernet. Mais pour des protocoles efficaces, il pourrait falloir 50K de connexions simultanées pour le swamp. Est-ce que quelque chose d'autre se briserait avant que je puisse avoir ce niveau?Combien de connexions udp ou tcp/ip ouvertes peuvent avoir une machine Linux?

Je pense que je veux un logiciel udp et/ou équilibreur de charge tcp/ip. Malheureusement, rien de tel dans la communauté open-source ne semble exister, à l'exception du protocole http. Mais ce n'est pas au-delà de mes capacités d'en écrire une en utilisant epoll. Je m'attends à ce qu'il y ait beaucoup de peaufinage pour le faire évoluer, mais c'est un travail qui peut être fait progressivement, et je serais un meilleur programmeur pour cela.

Répondre

1

Pour votre question, vous êtes limité par des limitations matérielles. C'était la philosophie de conception pour les systèmes Linux. Vous décrivez exactement quels seraient vos facteurs limitants.

4

Le paramètre dont vous aurez probablement quelques difficultés est gigue. Si vous avez mis à l'échelle le nombre de connexions par boîte, vous mettriez sans doute de la pression sur toutes les ressources dudit système. Par conséquent, les caractéristiques jitter de la fonction d'acheminement en souffriront probablement.

En fonction de vos besoins cibles, qui pourraient ou non être un problème: si vous envisagez de soutenir principalement élastique trafic (trafic qui ne souffre pas beaucoup de gigue et latence) alors il est ok. Si la proportion de trafic inélastique est élevée (par exemple interactif voix/vidéo), cela peut être plus problématique.

Bien sûr, vous pouvez toujours sur ingénieur dans ce cas ;-)

+0

Vous soulevez un bon point sur la gigue et la latence et l'effet sur le trafic inélastique – Eloff

+4

serait le personne qui a voté vers le bas mon poste pour expliquer? drive-by down-vote sans commentaire est tout simplement grossier. – jldupont

+0

Pour TCP, l'autre préoccupation concerne la quantité de données entrantes. Les données entrantes occupent les tampons du noyau jusqu'à ce qu'elles soient traitées par un processus utilisateur. Si votre application ne traite pas la mémoire "assez vite", alors le noyau peut manquer de mémoire tampon et de panique. Cela peut être amélioré en définissant une petite taille de tampon Rx sur chaque socket. –

2

Si vous avez l'intention d'avoir un serveur qui contient un socket ouvert par client, il doit être conçu avec soin afin qu'il puisse vérifier efficacement les données entrantes des clients 10k +. Ceci est connu comme le problème 10k.

Les noyaux Linux modernes peuvent gérer plus de 10k connexions, généralement au moins 100k. Vous aurez peut-être besoin de réglages, en particulier les nombreux délais d'attente TCP (si vous utilisez TCP) pour éviter les sockets de fermeture/périmés utilisant beaucoup de ressources si beaucoup de clients se connectent et se déconnectent fréquemment.

Si vous utilisez le module conntrack de netfilter, cela peut également nécessiter un réglage pour suivre ces nombreuses connexions (ceci est indépendant des sockets tcp/udp).

Il existe de nombreuses technologies pour l'équilibrage de charge, la plus connue étant LVS (Linux Virtual Server) qui peut servir de frontal à un cluster de serveurs réels. Je ne sais pas combien de connexions il peut gérer, mais je pense que nous l'utilisons avec au moins 50k en production.

0

Essayez équilibreur de charge logiciel HAProxy: (.-À-dire précisément le genre de trafic que vous utilisez UDP pour)

http://haproxy.1wt.eu/

Questions connexes