web-dev-qa-db-ja.com

WhatsAppはどのようにしてサーバーあたり200万の接続を実現しましたか?

Ubuntuでは、開くことができるソケットの最大数は次のように管理されているようです:

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

(WhatsAppからの)Rick Reedによるプレゼンテーションの1つによれば、これらの人たちはFreeBSDとErLangを使用する「単一サーバー」で最大200万の同時接続を獲得しました。私の理解では、常にカーネルからのサポートが必要です。そして、はい、FreeBSDを調整してこれを実現したようです capability

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

それで、十分な量のメモリがあれば、カーネルを調整して非常に多くの物理接続をサポートできるように見えますよね?はいの場合、それはかなりシンプルに見えますが、それについての誇大宣伝は何ですか?または、何か不足していますか?

ありがとう。

29
Piyush Kansal

ここには3つの点があることに注意してください。

  1. サーバーが200万の接続をサポートするようにする。これは通常、同時接続の数が許可され、各接続に関連付けられたコンテキストが(有線)メインメモリに収まるようにカーネルを調整するだけです。後者は、各接続にメガバイトのバッファスペースを割り当てることができないことを意味します。

  2. 接続ごとに何かを行う。それらをプロセス(この場合はErlang)でユーザー空間にマップします。ここで、各接続がユーザー空間レベルで割り当てたデータが多すぎる場合、正方形に戻ります。できません。

  3. 接続で何かをするために複数のコアを取得する。これは、実行する作業の量が非常に多いために必要です。また、ロックしすぎないようにする場合などにも役立ちます。

あなたは1.だけに集中しているようです。

20

十分なRAMがあれば、Linuxで1M以上の接続を処理することはそれほど難しくありません。 これらの人 は、いくつかのsysctlの調整を伴う通常のCentOSカーネルを使用して、単一のボックスでJavaアプリケーションを使用して1000万の接続を処理しました。

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

また、ネットワークアダプタの/ proc/irq /のバランスを取り、巨大なページでのJVMの動作を改善するためのTweakを追加しました。

sysctl -w vm.nr_hugepages=30720

2つの6コアCPUに57%がロードされている 2013年に1Mの接続を介して1Gbpsでサービスされます

ただし、そのためにはRAMが大量に必要です。上記のテストは、96GBのRAMを搭載したサーバーで行われ、そのうち36GBがカーネルで12Mソケットのバッファーに使用されました。

同様の設定で1Mの接続を提供するには、少なくとも8GBのRAMを備えたサーバーが必要であり、そのうちの3〜4GBがソケットバッファーにのみ使用されます。

25
Guest