并发:C10K 问题 & C10M 问题

1. C10K 问题

1.1. 什么是 C10K 问题

  • C10K 问题,即单机 10000 个并发连接问题;

1.2. 为什么有 C10K 问题

  • Web2.0时代到来后,一方面,互联网普及率大大提高了,用户群体几何倍增长;另一方面,互联网不再是单纯地浏览 www 网页,逐渐开始进行交互,而且应用程序的逻辑也变得更复杂。从简单的表单提交,到即时通信和在线实时互动,C10K的问题才体现出来了。因为每一个用户都必须与服务器保持连接,才能进行实时数据交互。诸如Facebook这样的网站,同一时间的并发TCP连接很可能已经过亿。
  • 最初的服务器都是基于进程/线程模型的,新到来一个TCP连接,就需要分配1个进程(或者线程)。进程又是操作系统最昂贵的资源,一台机器无法创建很多进程。如果是C10K,就要创建1万个进程,那么就单机而言,操作系统是无法承受的(往往出现效率低下、甚至完全瘫痪)。如果是采用分布式系统,维持1亿用户在线需要10万台服务器,成本巨大,也只有Facebook、Google、Apple等巨头,才有财力购买如此多的服务器。
  • 基于上述考虑,如何突破单机性能局限,是高性能网络编程所必须要直面的问题。这些局限和问题,最早被Dan Kegel 进行了归纳和总结,并首次系统地分析和提出了解决方案。后来,这种普遍的网络现象和技术局限,都被大家称为 C10K 问题。

1.3. C10K 问题的本质是什么

  • C10K问题,本质上是操作系统的问题。对于Web1.0/2.0时代的操作系统而言, 传统的同步阻塞I/O模型都是一样的,处理的方式都是requests per second,并发10K和100的区别关键在于CPU。

  • 创建的进程、线程多了,数据拷贝频繁(缓存I/O、内核将数据拷贝到用户进程空间、阻塞), 进程/线程上下文切换消耗大, 导致操作系统崩溃。

  • 由于硬件成本的大幅度降低和硬件技术的进步,如果一台服务器能够同时服务更多的客户端,那么也就意味着服务每一个客户端的成本大幅度降低;

1.4. C10K 问题的解决思路是什么

  • 解决C10K问题的关键就是:尽可能减少CPU等核心资源消耗,从而榨干单台服务器的性能,突破C10K问题所描述的瓶颈。
  • 为每个连接分配一个独立的线程/进程
  • 同一个线程/进程同时处理多个连接(IO多路复用)

2. C10M问题

  • 如何利用 8 核 CPU、64G 内存,在 10GBPS 的网络上保持 1000万 的并发连接;

你可能感兴趣的:(并发:C10K 问题 & C10M 问题)