美文网首页
高性能网络编程之C10K问题

高性能网络编程之C10K问题

作者: 谭英智 | 来源:发表于2021-03-13 14:26 被阅读0次

    一台服务器最大支持多少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中断

      用户态管理内存,避免不断的向内核申请内存

    相关文章

      网友评论

          本文标题:高性能网络编程之C10K问题

          本文链接:https://www.haomeiwen.com/subject/vosxcltx.html