网络编程实战
盛延敏
前大众点评云平台首席架构师
44207 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 40 讲
网络编程实战
15
15
1.0x
00:00/00:00
登录|注册

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

异步I/O + 多线程
非阻塞I/O + readiness notification + 多线程
非阻塞I/O + readiness notification + 单线程
阻塞I/O + 线程
阻塞I/O + 进程
网络带宽
系统内存
文件句柄
C10K问题解决之道
操作系统层面
概述
思考题
总结
C10K问题
C10K问题:高并发模型设计

该思维导图由 AI 生成,仅供参考

你好,我是盛延敏,这里是网络编程实战第 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/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入探讨了C10K问题,即如何在一台物理机上同时服务10000个用户的高并发网络编程难题。文章从操作系统层面分析了C10K问题的本质,并提出了解决之道。在资源分析中,讨论了文件句柄、系统内存和网络带宽等方面的考量,并指出了C10K问题在系统资源层面是可以解决的。此外,介绍了解决C10K问题的几种解法方案,包括阻塞I/O + 进程、阻塞I/O + 线程、非阻塞I/O + readiness notification + 单线程等方法,并对每种方法的优劣进行了分析。强调了epoll在解决C10K问题中的重要性,指出不同操作系统提供的功能都是为了解决C10K问题。总结指出,解决C10K问题需要重点考虑如何和操作系统配合感知I/O事件的发生以及如何分配和使用进程、线程资源来服务上万个连接。最后,提出了两道思考题,引发读者对C10K解决方法和C10M问题的思考。整体而言,本文对C10K问题的背景、解决方案和技术特点进行了深入浅出的介绍,对高并发网络编程感兴趣的读者具有很高的参考价值。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《网络编程实战》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(24)

  • 最新
  • 精选
  • 忆水寒
    第一个问题,涉及netty的三种模型,常用的是主从reacter模型,分别由eventloopgroup线程池来处理连接和IO事件,底层就是epoll。 第二个问题,要实现 C10M ,就不只是增加物理资源,或者优化内核和应用程序可以解决的问题了。这时候,就需要用 XDP 的方式,在内核协议栈之前处理网络包;或者用 DPDK 直接跳过网络协议栈,在用户空间通过轮询的方式直接处理网络包。

    作者回复: 👍,DPDK和XDP都知道,涨姿势了。

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

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

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

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

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

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

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

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

    2019-11-06
    3
    5
  • 张立华
    C10M,10个处理epoll队列的线程。 每个线程处理一个epoll队列,每个epoll队列容纳最多100万个socket

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

    2019-10-03
    4
  • Geek_68d3d2
    百万啊 端口已经不够用了

    作者回复: 不会啊,端口还是一个服务器端口,每个客户的ip和端口不同而已。

    2019-12-14
    5
    3
  • 阿卡牛
    是否使用了select poll epoll等就是非阻塞了?

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

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

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

    2019-10-17
    3
  • Geek_9adefb
    在服务端上:一个连接套接字需要占用一个新的端口吗? 换句话说,如果想要服务端支持1万个连接,除了进程限制的句柄数要设置到1万以上,还要不要求有1万个空闲端口?

    作者回复: 不是哦。连接可用复用同一个端口。比如说1万个连接,同时建立在12345这个端口上。

    2022-04-19
    2
收起评论
显示
设置
留言
24
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部