web-dev-qa-db-fra.com

Comment WhatsApp a-t-il atteint 2 millions de connexions par serveur?

Sur Ubuntu, le nombre maximal de sockets pouvant être ouverts semble être régi par les éléments suivants:

$ cat /proc/sys/net/ipv4/tcp_max_orphans
262144

Selon l'une des présentations de Rick Reed (de WhatsApp), ces gars-là ont pris jusqu'à 2 millions de connexions simultanées sur un "serveur unique" utilisant FreeBSD et ErLang. Je crois comprendre que nous aurons toujours besoin d'un certain soutien du noyau. Et oui, on dirait que le FreeBSD a été modifié pour avoir ceci 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

Donc, il semble que le noyau puisse être modifié pour prendre en charge autant de connexions physiques, étant donné que nous avons suffisamment de mémoire, n'est-ce pas? Si oui, alors cela semble assez simple, alors quel est le battage médiatique à ce sujet? Ou je manque quelque chose?

Merci.

29
Piyush Kansal

Notez qu'il y a trois choses ici:

  1. Faire en sorte que le serveur prenne en charge deux millions de connexions. Il s'agit généralement de peaufiner le noyau de sorte que le nombre de connexions simultanées soit autorisé et que le contexte associé à chaque connexion tienne dans la mémoire principale (câblée). Ce dernier signifie que vous ne pouvez pas avoir un espace tampon de mégaoctets alloué pour chaque connexion.

  2. Faire quelque chose avec chaque connexion. Vous les mappez dans l'espace utilisateur dans un processus (Erlang dans ce cas). Maintenant, si chaque connexion alloue trop de données au niveau de l'espace utilisateur, nous revenons à la case départ. On ne peut pas le faire.

  3. Obtenir plusieurs cœurs pour 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 voulez éviter de trop verrouiller et ainsi de suite.

Vous semblez être concentré sur 1. seul.

20

Si vous avez suffisamment de RAM ce n'est pas trop difficile de gérer 1M ou plus de connexions sous linux. Ces gars-là ont géré 10 millions de connexions avec une application Java sur une seule boîte en utilisant le noyau CentOS standard avec quelques réglages sysctl:

sysctl -w fs.file-max=12000500
sysctl -w fs.nr_open=20000500
ulimit -n 20000000
sysctl -w net.ipv4.tcp_mem='10000000 10000000 10000000'
sysctl -w net.ipv4.tcp_rmem='1024 4096 16384'
sysctl -w net.ipv4.tcp_wmem='1024 4096 16384'
sysctl -w net.core.rmem_max=16384
sysctl -w net.core.wmem_max=16384

Ils ont également équilibré/proc/irq/de l'adaptateur réseau et ajouté un Tweak pour un meilleur travail JVM avec des pages énormes:

sysctl -w vm.nr_hugepages=30720

Ayant deux processeurs 6 cœurs chargés à 57%, ils ont servi 1 Gbit/s sur 12 millions de connexions en 2013.

Mais vous avez besoin d'énormes quantités de RAM pour cela. Le test ci-dessus était sur un serveur avec 96 Go de RAM, et 36 Go de ceux-ci ont été utilisés par le noyau pour les tampons de sockets 12M.

Pour servir des connexions 1M avec des paramètres similaires, vous aurez besoin d'un serveur avec au moins 8 Go RAM et 3 à 4 Go d'entre eux seraient utilisés uniquement pour les tampons de socket.

25
Guest