网络编程实战
盛延敏
前大众点评云平台首席架构师
立即订阅
6034 人已学习
课程目录
已完结 39 讲
0/4登录后,你可以任选4讲全文学习。
开篇词 (1讲)
开篇词 | 学好网络编程,需要掌握哪些核心问题?
免费
第一模块:基础篇 (9讲)
01 | 追古溯源:TCP/IP和Linux是如何改变世界的?
02 | 网络编程模型:认识客户端-服务器网络模型的基本概念
03丨套接字和地址:像电话和电话号码一样理解它们
04 | TCP三次握手:怎么使用套接字格式建立连接?
05 | 使用套接字进行读写:开始交流吧
06 | 嗨,别忘了UDP这个小兄弟
07 | What? 还有本地套接字?
08 | 工欲善其事必先利其器:学会使用各种工具
09丨答疑篇:学习网络编程前,需要准备哪些东西?
第二模块:提高篇 (10讲)
10 | TIME_WAIT:隐藏在细节下的魔鬼
11 | 优雅地关闭还是粗暴地关闭 ?
12 | 连接无效:使用Keep-Alive还是应用心跳来检测?
13 | 小数据包应对之策:理解TCP协议中的动态数据传输
14丨UDP也可以是“已连接”?
15 | 怎么老是出现“地址已经被使用”?
16 | 如何理解TCP的“流”?
17 | TCP并不总是“可靠”的?
18 | 防人之心不可无:检查数据的有效性
19丨提高篇答疑:如何理解TCP四次挥手?
期中复习周 (2讲)
期中大作业丨动手编写一个自己的程序吧!
免费
期中大作业丨题目以及解答剖析
免费
第三模块:性能篇 (12讲)
20 | 大名⿍⿍的select:看我如何同时感知多个I/O事件
21 | poll:另一种I/O多路复用
22 | 非阻塞I/O:提升性能的加速器
23 | Linux利器:epoll的前世今生
24 | C10K问题:高并发模型设计
25 | 使用阻塞I/O和进程模型:最传统的方式
26 | 使用阻塞I/O和线程模型:换一种轻量的方式
27 | I/O多路复用遇上线程:使用poll单线程处理所有I/O事件
28 | I/O多路复用进阶:子线程使用poll处理连接I/O事件
29 | 渐入佳境:使用epoll和多线程模型
30 | 真正的大杀器:异步I/O探索
31丨性能篇答疑:epoll源码深度剖析
第四模块:实战篇 (4讲)
32 | 自己动手写高性能HTTP服务器(一):设计和思路
33 | 自己动手写高性能HTTP服务器(二):I/O模型和多线程模型实现
34 | 自己动手写高性能HTTP服务器(三):TCP字节流处理和HTTP协议实现
35 | 答疑:编写高性能网络编程框架时,都需要注意哪些问题?
结束语 (1讲)
结束语丨我相信这不是结束,让我们江湖再见
网络编程实战
登录|注册

24 | C10K问题:高并发模型设计

盛延敏 2019-10-02
你好,我是盛延敏,这里是网络编程实战第 24 讲,欢迎回来。
在性能篇的前 4 讲里,我们陆续讲解了 select、poll、epoll 等几种 I/O 多路复用技术,以及非阻塞 I/O 模型,为高性能网络编程提供了必要的知识储备。这一讲里,我们了解一下历史上有名的 C10K 问题,并借着 C10K 问题系统地梳理一下高性能网络编程的方法论。

C10K 问题

随着互联网的蓬勃发展,一个非常重要的问题摆在计算机工业界面前。这个问题就是如何使用最低的成本满足高性能和高并发的需求。这个问题在过去可能不是一个严重的问题,但是在 2000 年前后,互联网用户的人数井喷,如果说之前单机服务的用户数量还保持在一个比较低的水平,比如说只有上百个用户,那么在互联网逐渐普及的情况下,服务于成千上万个用户就将是非常普遍的情形,在这种情形下,如果还按照之前单机的玩法,成本就将超过人们想象,只有超级有钱的大玩家才可以继续下去。
于是,C10K 问题应运而生。C10K 问题是这样的:如何在一台物理机上同时服务 10000 个用户?这里 C 表示并发,10K 等于 10000。得益于操作系统、编程语言的发展,在现在的条件下,普通用户使用 Java Netty、Libevent 等框架或库就可以轻轻松松写出支持并发超过 10000 的服务器端程序,甚至于经过优化之后可以达到十万,乃至百万的并发,但在二十年前,突破 C10K 问题可费了不少的心思,是一个了不起的突破。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《网络编程实战》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(16)

  • ly
    netty看过它的一些源码,感觉像是倒数第二种“非阻塞 I/O + readiness notification + 多线程”。它默认有2组eventloop线程,一组是用来监听事件,叫主eventloop,监听完以后将事件发给另外一组eventloop线程,这组线程叫工作eventloop。不知道对不对,请老师点评,另外对netty很有好感,但是还没有研究好它的源码。

    作者回复: 基本上是对的,我管这个叫主-从reactor模型。你可以认为netty在Linux下就是用epoll实现的。

    2019-11-05
    1
    2
  • 传说中的成大大
    这篇课程虽然全是理论 但是我不知道为啥还是认认真真的读了两遍才去看问题和写评论,感觉这篇文章的理论基础很承上启下啊
    这里直接回答第二问 实现应该是能实现 挑战和瓶颈在于 首先操作系统方面能否支持千万级别数量的套接字,其次内存方面 能否有足够的内存提供千万级别的套接字读缓冲区和写缓冲区, 第三内核能否同时处理千万级别描述符的事件 第四应用层方面虽然采用了线程池减少了线程的创建开销,但是如果同时在线的连接数量还是很大的话 线程的切换和调度也会很耗性能,大概能想到这些问题
    2019-10-10
    1
    1
  • 张立华
    C10M,10个处理epoll队列的线程。 每个线程处理一个epoll队列,每个epoll队列容纳最多100万个socket

    作者回复: 这个已经很猛很猛了。

    2019-10-03
    1
  • 刘丹
    可以介绍一下C1M的解决方案吗?毕竟C10M很少有需求。

    作者回复: 软硬结合,绕过协议栈等等

    2019-10-02
    1
  • 程序水果宝
    C10M问题应该不能再通过应用层和硬件资源的优化来解决了,性能瓶颈应该是冗长的内核协议栈了,要通过已经有的解决方案有dpdk

    作者回复: 是一个很好的方向。

    2019-10-02
    1
  • 有铭
    看过一些关于C10M的资料,说到Unix(Linux)本身是为电话机交换设计的系统,在内核上存在一些局限性,如果想达到10M,必须像协程取代线程那样,摆脱内核,完全由程序自身机制来控制。但是具体的实现是啥样,我貌似没见人做出来过
    2019-12-10
  • godtrue
    这篇好,承上启下,问题解决方案的发展轨迹也勾勒了出来。
    C10K,第一次读到这个词,不知道啥意思,嘿嘿,现在明白啦!
    C10K=C+10K=Concurrty+10*1000,是指单台物理机如何能同时支持1万并发连接的问题,C10M问题同理

    面对的问题估计是类似的,内存够不够?带宽够不够?网络响应是否及时?

    值得反复看
    2019-11-24
  • 林林
    上面提到的主从处理,主和从能否分别是不同的进程?acceptor进程通过消息队列把监听到的新连接fd发到reader进程进行读写操作?

    作者回复: 也不是不可以,实战中很少有人这么干,因为一般都是一个进程处理了所有accept和I/O事件。

    2019-11-22
  • 西兹兹
    老师好,这就是所谓的主从 reactor 模式。 这句有疑惑,我专门查了一下,网上说的主从不是指多核多线程就是主从reactor。主从是指两个线程池,主处理accptor,从处理read write

    作者回复: 两个线程池,主处理accptor,从处理read write。我指的这个。

    2019-11-06
    1
  • GeekAmI
    Netty是用的“非阻塞 I/O + readiness notification + 多线程”。
    当serverBootstrap.channel(NioServerSocketChannel.class)时,用的poll事件分发器;
    当serverBootstrap.channel(EpollServerSocketChannel.class)时,用的epoll事件分发器。
    ps:BioServerSocketChannel一般不考虑。

    作者回复: Netty还自己用epoll实现了一把封装,也是拼了。

    2019-10-29
  • 阿卡牛
    文中假设每个连接每秒的传输速率1KB是否离现实情况太远了?

    作者回复: 嗯,似乎是,你觉得合理的值是多少?1M?10M?

    2019-10-24
  • 阿卡牛
    是否使用了select poll epoll等就是非阻塞了?

    作者回复: 不是的,非阻塞是指套接字类型,不是指网络事件模型,这个一定要分清楚。

    2019-10-24
    1
  • 徐凯
    在哪些地方会有C10M的出现呢,会有千万级同时在线的公司,服务器不都是分布式的,分配到每个服务器上连接应该不至于太多把,可以让那些用户连接的时候通过keepalive模块进行负载均衡,返回新的节点地址让它去连,这样用户请求就不至于都积压到一块去了。

    作者回复: 你说的方法确实大家也都在使用,但是,人们探索未来、解决疑难问题的欲望是无止境的,具体到C10M,说实话,单机到这种规模确实罕见,这是人们从C10K往下求索的一个自然延伸吧。

    2019-10-22
  • 无名
    tcp_wmem和tcp_rmem文件中的缓冲区值,单位是bit?不是byte吗?

    作者回复: 我查了下资料,应该是byte,修正了计算的部分,等待编辑更新,感谢指正。

    2019-10-17
  • 传说中的成大大
    补充一句 还有带宽限制
    2019-10-10
  • 衬衫的价格是19美元
    c10M的话,前面分析的缓存大小和带宽分别要放大1000倍,也就是,需要1.2 * 1000 = 1.2T的内存,80Mbps *1000 = 80Gbps 的带宽, 同时,连接数也要达到10000000
    2019-10-04
收起评论
16
返回
顶部