Comment WhatsApp atteindre 2 millions de connexions par serveur?
Sur Ubuntu, le nombre maximal de sockets qui peut être ouvert semble être régi suivant:
$ cat /proc/sys/net/ipv4/tcp_max_orphans
262144
Comme l'une des présentations par Rick Reed (à partir de WhatsApp), ces gars-là ont pris jusqu'à 2 millions de connexions simultanées sur un "serveur unique" à l'aide de FreeBSD et ErLang. Ma compréhension est que nous aurons toujours besoin d'un certain soutien de l'amande. Et oui, on dirait le tordu le pour FreeBSD cette capacité:
hw.machine: amd64
hw.model: Intel(R) Xeon(R) CPU X5675 @ 3.07GHz
hw.ncpu: 24
hw.physmem: 103062118400
hw.usermem: 100556451840
kb@c123$ uname -rps
FreeBSD 8.2-STABLE amd64
jkb@c123$ cat /boot/loader.conf.local
kern.ipc.maxsockets=2400000
kern.maxfiles=3000000
kern.maxfilesperproc=2700000
Alors, ressemble noyau peut être modifié à l'appui de si nombreuses connexions physiques, étant donné que nous avons une quantité suffisante de mémoire, correct? Si oui, alors il semble assez simple, alors qu'est-ce que le battage médiatique à ce sujet? Ou il me manque quelque chose?
Grâce.
- La différence est FreeBSD Vs Linux. ErLang n'a pas réécrire la pile TCP dans le noyau.
- Donc, FreeBSD est plus puissant que Linux? Pourquoi je ne peux pas faire la même chose sous Linux?
- Voir highscalability.com/blog/2014/2/26/...
- Il ya un vieux dicton sur BSD vs Linux: "BSD est que lorsque vous obtenez un tas d'UNIX, les pirates s'asseoir pour essayer de port un système UNIX pour les PC. Linux est que lorsque vous obtenez un tas de PC pirates asseyez-vous et essayez d'écrire un système UNIX pour PC."
- Il n'est toujours pas tout à fait répondu à ma question.
- Son plus sur l'architecture du serveur (code de la perspective). Avec une mauvaise architecture et novice en programmation, votre serveur peut s'être accroché, même à des milliers de connexions.
Vous devez vous connecter pour publier un commentaire.
Note il y a trois choses ici:
Arriver le serveur à l'appui de deux millions de connexions. Ce n'est généralement qu'à peaufiner le noyau tels que le nombre de connexions simultanées sont autorisées et que le contexte associé à chaque connexion s'inscrivent dans (par câble) mémoire principale. Ce dernier signifie que vous ne pouvez pas avoir un mégaoctet de mémoire tampon de l'espace alloué pour chaque connexion.
De faire quelque chose avec chaque connexion. Vous carte dans l'espace utilisateur dans un processus (Erlang dans ce cas). Maintenant, si chaque connexion alloue trop de données à l'utilisateur le niveau d'espace, nous sommes de retour à la case départ. Nous ne pouvons pas le faire.
Obtenir de multiples cœurs de faire quelque chose avec les connexions. Cela est nécessaire en raison de la quantité de travail à faire. C'est aussi le point où vous souhaitez éviter le blocage de trop et ainsi de suite.
Vous semblez être porté sur 1. seul.
Si vous avez suffisamment de RAM c'est pas trop dur à gérer 1M ou plus de connexions sur linux. Ces gars-là traités de 10 millions de connexions avec une application java sur une seule zone à l'aide régulière CentOS noyau avec un peu de sysctl tweaks:
Aussi ils équilibrée /proc/irq/s de la carte réseau et l'ajout d'un tweak pour mieux JVM de travailler avec une grande pages:
Avoir deux 6-core, 57% chargés ils servi 1 gbit /s, plus de 12M de connexions en 2013.
Mais vous avez besoin ÉNORME quantité de RAM pour que. Le test ci-dessus a été sur un serveur avec 96GB de RAM, et 36 GO de ceux qui ont été utilisés par le noyau pour les tampons de 12M sockets.
Pour servir 1M connexions avec les mêmes paramètres que vous aurez besoin d'un serveur avec au moins 8 go de RAM et 3-4 GO serait utilisé seulement pour la prise de tampons.