在 Ubuntu 上,可以打开的最大套接字数似乎受以下控制:
$ cat /proc/sys/net/ipv4/tcp_max_orphans
262144
根据 Rick Reed(来自 WhatsApp)的一次演示,这些人使用 FreeBSD 和 ErLang 在“单个服务器”上实现了高达 200 万个并发连接。我的理解是我们总是需要内核的一些支持。是的,看起来像是对 FreeBSD 进行了调整以实现此功能能力 http://blog.whatsapp.com/index.php/2012/01/1-million-is-so-2011/:
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
那么,考虑到我们有足够的内存,看起来可以调整内核以支持如此多的物理连接,对吗?如果是的话,那么它看起来很简单,那么它有什么炒作呢?或者我错过了什么?
Thanks.
如果你有足够的 RAM,在 Linux 上处理 1M 或更多的连接并不是太难。这些家伙 http://web.archive.org/web/20150905220053/https://mrotaru.wordpress.com/2015/05/20/how-migratorydata-solved-the-c10m-problem-10-million-concurrent-connections-on-a-single-commodity-server/使用常规 CentOS 内核并进行一些 sysctl 调整,在单个机器上处理了 1000 万个 Java 应用程序连接:
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 更好地处理大页面:
sysctl -w vm.nr_hugepages=30720
有两个 6 核 CPU,负载率为 57%served http://web.archive.org/web/20130701232157/https://mrotaru.wordpress.com/2013/06/20/12-million-concurrent-connections-with-migratorydata-websocket-server/2013 年超过 12M 连接达到 1Gbps。
但为此你需要大量的内存。上述测试是在具有 96GB RAM 的服务器上进行的,其中 36GB 被内核用于 12M 套接字的缓冲区。
要使用类似的设置提供 1M 连接,您需要一台至少具有 8GB RAM 的服务器,其中 3-4GB 仅用于套接字缓冲区。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)