The C10K problem

连接池、短连接、长连接、连接复用的不同;C10K的难度等?

1 C10K问题定义

单台Server同时有超过10K个连接,如何优化网络套接字来处理它们。

当并发数量超过1K的时候,操作系统的处理能力就开始出现明显下降,因为有太多的CPU时间都消耗在系统上下文切换。

由此催生了C10K编程,指的是服务器同时支持成千上万个连接,也就是concurrent 10 000 connection(这也是C10K这个名字的由来)。由于硬件成本的大幅度降低和硬件技术的进步,加上一台服务器同时能够服务更多的客户端,就意味着服务每一个客户端的成本大幅度降低,从这个角度来看,C10K问题显得非常有意义。

注意:并发链接数和RPS(requests per second)虽然类似,但它们不一样:处理RPS需要高吞吐量(快速处理它们),处理大量的并发链接需要对链接进行有效的调度(while high number of concurrent connections requires efficient scheduling of connections)。

1.1 Linux上如何得到网络链接数?

netstat -antp|wc -l 基本就是这个数字了

1.2 解决C10K问题策略

  • 单个进程或线程可以服务于多个客户端请求
  • 事件触发替代业务轮询
  • IO采用非阻塞方式,减少额外不必要性能损耗

2 什么导致C10K问题?

最初的服务器都是基于进程/线程模型的,新到来一个TCP连接,就需要分配1个进程(或者线程)。而进程又是操作系统最昂贵的资源,一台机器无法创建很多进程。如果是C10K就要创建1万个进程,那么操作系统是无法承受的。如果是采用分布式系统,维持1亿用户在线需要10万台服务器,成本巨大,也只有Facebook,Google,雅虎才有财力购买如此多的服务器。这就是C10K问题的本质。

服务器侦听的端口数不会随客户端连接数增加(文件描述符和内存会),TCP区分连接的四个因子:服务端与客户端的lP和Port. TCP区分一个连接是通过四个因子。在服务器的IP和port都固定的情况下,理论上来说,可以接收2^32个IP(每个IP有2^16个端口),即2^48个链接,而实际情况则受文件描述符和内存的限制。

3 Epoll异步非阻塞

既然有了C10K问题,程序员们就开始行动去解决它。于是FreeBSD推出了kqueue,Linux推出了epoll,Windows推出了IOCP。这些操作系统提供的功能就是为了解决C10K问题。因为Linux是互联网企业中使用率最高的操作系统,Epoll就成为C10K killer、高并发、高性能、异步非阻塞这些技术的代名词了。

4 协程(Coroutine)

这个技术本质上也是异步非阻塞技术,它是将事件回调进行了包装,让程序员看不到里面的事件循环。

References

  1. The C10K problem
  2. The Secret To 10 Million Concurrent Connections
  3. 大战C100K之1-开篇
  4. 关于C10K、异步回调、协程、同步阻塞
  5. 关于 TCP 并发连接的几个思考题与试验
  6. 如何做到C100K–基于Mina高性能服务器设计(一)
  7. C10K问题的译文

results matching ""

    No results matching ""