一台服务器最大支持多少TCP并发连接
文件句柄限制
每个socket都是一个文件描述符,一旦文件描述符用完,新的连接就会报错Can't open so many files
进程限制
-
临时修改
ulimit -n 100000
-
永久修改
添加以下内容到/etc/rc.local
ulimit -SHn 100000
全局限制
执行 cat /proc/sys/fs/file-nr 输出 9344 0 592026 ,分别代表
- 已分配的文件句柄数
- 以分配但没有使用的文件句柄数
- 最大句柄数
可以通过修改/etc/sysctl.conf文件
- fs.file-max = 1000000
- net.ipv4.ip_conntrack_max = 1000000
- net.ipv4.netfilter.ip_conntrack_max = 1000000
端口限制
端口的范围是0-2^16(0-65535)
标志一个TCP连接时一个四元组 {local ip, local port,remote ip,remote port}
因此最大的连接数,不是只看端口
而是看ip和端口的组合
那么最大数是2^32 x 2^16
什么是C10k问题
一个基于select的程序在一台旧的server可以很好支持1000个并发的,它在2倍性能新服务器上却处理不了2000的并发。
这是由于select的处理与n是线性相关的。
因此如果server要处理数以万计的并发时,开销会相当大
C10K的本质
问题本质上是操作系统的问题。对于Web1.0/2.0时代的操作系统,使用阻塞的IO模型,多进程多线程处理,数据拷贝频繁,带来上下文切换过多,select/poll在内核低劣的算法,使得CPU做了大量的无用功。
解决方案
- 使用epoll、iocp等高性能的系统接口代替select,poll接口。
- 使用单进程单线程代替每个请求一个线程的模式,减少线程对cpu的竞争。
下个10年的C10M并发问题
对于现代越来越高性能的单机,能否单机就支持千万并发连接?
虽然目前处于大数据架构的时代,但是如果单机可以支持的并发是原来的10倍,那么集群机器的数量的机器就可以下降10倍。
我们都知道,大数据架构下,集群的数量过于庞大会变得难以管理
因此如果单机性能上升10倍,可以让集群更容易管理。
而且目前的单机都是多CPU架构,核数达到上千
在硬件层面上,是足以应对C10M的问题
然而种种实验发现,操作系统内核低劣的设计,并不能支持多核架构下处理大并发
解决方案
-
网络
数据包直接传递到业务层,不经过内核。使用类似于DPDK的第三方库,可以绕开内核复杂核繁琐的协议栈,减少数据的拷贝和数据经过的路径。
-
CPU
单进程单线程,避免CPU cache不必要的同步
CPU绑定,每个进程绑定在单个核上,避免不必要的cache拷贝
由用户态管理CPU
-
内存
使用大页,避免过多的TBL中断用户态管理内存,避免不断的向内核申请内存
网友评论