Linux 性能优化实战
倪朋飞
资深 Linux 专家,Kubernetes 项目维护者
87257 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已完结/共 65 讲
结束语 (1讲)
Linux 性能优化实战
15
15
1.0x
00:00/00:00
登录|注册

35 | 基础篇:C10K 和 C1000K 回顾

网络带宽
内存占用
非阻塞 I/O 或异步 I/O
同步阻塞方式
XDP
DPDK
监听到相同端口的多进程模型
主进程+多个 worker 子进程
异步 I/O(AIO)
epoll
select 和 poll
异步、非阻塞 I/O
资源优化
I/O模型问题
2GB内存和千兆网卡
32位系统
分析方法
网络并发相关的性能瓶颈
解决方法
Linux 内核协议栈的限制
中断处理
软件资源使用
物理资源使用
基于 I/O 多路复用和请求处理的优化
工作模型优化
I/O 模型优化
解决思路
背景
网络性能指标
网络协议栈
TCP/IP 模型
思考
C10M 问题
C1000K 问题
C10K 问题
Linux 网络基础原理
C10K 和 C1000K 回顾

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

你好,我是倪朋飞。
前面内容,我们学习了 Linux 网络的基础原理以及性能观测方法。简单回顾一下,Linux 网络基于 TCP/IP 模型,构建了其网络协议栈,把繁杂的网络功能划分为应用层、传输层、网络层、网络接口层等四个不同的层次,既解决了网络环境中设备异构的问题,也解耦了网络协议的复杂性。
基于 TCP/IP 模型,我们还梳理了 Linux 网络收发流程和相应的性能指标。在应用程序通过套接字接口发送或者接收网络包时,这些网络包都要经过协议栈的逐层处理。我们通常用带宽、吞吐、延迟、PPS 等来衡量网络性能。
今天,我们主要来回顾下经典的 C10K 和 C1000K 问题,以更好理解 Linux 网络的工作原理,并进一步分析,如何做到单机支持 C10M。
注意,C10K 和 C1000K 的首字母 C 是 Client 的缩写。C10K 就是单机同时处理 1 万个请求(并发连接 1 万)的问题,而 C1000K 也就是单机支持处理 100 万个请求(并发连接 100 万)的问题。

C10K

C10K 问题最早由 Dan Kegel 在 1999 年提出。那时的服务器还只是 32 位系统,运行着 Linux 2.2 版本(后来又升级到了 2.4 和 2.6,而 2.6 才支持 x86_64),只配置了很少的内存(2GB)和千兆网卡。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入探讨了C10K和C1000K问题,以及解决这些问题的方法。首先介绍了C10K问题的背景和关键解决方法,包括I/O模型优化和I/O多路复用。详细讨论了水平触发和边缘触发两种I/O事件通知方式,并对select、poll和epoll等I/O多路复用方法进行了比较和分析。随后提到了使用异步I/O的方式来处理大量并发请求,并指出了异步I/O的一些局限性。文章还探讨了C1000K和C10M问题,指出了解决这些问题的关键在于深度优化从应用程序到Linux内核、再到CPU、内存和网络等各个层次,特别是需要借助硬件来卸载原来通过软件处理的大量功能。最后,介绍了DPDK和XDP两种常见的机制,它们都能跳过内核协议栈,直接处理网络包,从而提高网络处理效率。整体而言,本文通过深入探讨C10K和C1000K问题,为读者提供了深入了解网络性能优化的知识。文章内容涵盖了从C10K到C1000K问题的演进,以及相应的解决方法,为读者提供了全面的网络性能优化知识。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Linux 性能优化实战》
新⼈⾸单¥68
立即购买
登录 后留言

全部留言(53)

  • 最新
  • 精选
  • Maxwell
    一台机器不是只有65536个端口吗,每个网络请求都需要消耗一个端口,这样大于65536个请求会不会导致端口不够用呢?

    作者回复: 如果是只有一个IP地址的客户端,那的确是受限于端口数量。 不过,如果是服务器端,那可以接受的连接就多得多了(组合客户端IP+端口)。

    2019-02-20
    5
    44
  • 挺直腰板
    老师,很多人都说并发数不能超过65536,假如访问服务器80端口,服务器ip是183.3.226.35这个,客户端ip是58.62.30.2,超过65536端口如何显示,是这样183.3.226.35 58.62.30.2:80?单机最大并发的连接数据是多少?谢谢!

    作者回复: 注意区分客户端还是服务器端:客户端使用单个IP去访问服务器的时候,端口号数是最大限制;服务器端没有这个限制。

    2019-03-31
    3
    21
  • Geek_9815f1
    老师,redis的采用水平触发的epoll。 nginx 采用 垂直触发的epoll 。所以epoll跟 触发方式无关。老师,你的一言一语对于小白 都是圣经, 好好斟酌

    作者回复: 👍 还是要以文档为准

    2020-07-21
    3
    12
  • 我来也
    [D35打卡] 09年那会,我所在公司的服务器端都是单进程+select. 后来把select换为了poll和epoll. 再后来还拆分成了多进程,N个网络收发层+M个业务处理层. 毕竟我们的情况是 业务处理的耗时远大于网络收发的耗时. 目前的网络收发层也只支持最大65530个并发连接,毕竟是单ip单端口的. 如果想支持更多并发连接,就另外再开一个进程. 并没有往C100K甚至是C1000K的方向上努力了.

    作者回复: 其实并不是 65530,Linux使用五元组标志一个连接:协议、源IP、源端口、目的IP、目的端口。根据这些,你可以算下理论上最大支持的连接数。

    2019-02-12
    2
    8
  • 9527
    没碰到单机一千万这么夸张的场景,想问下一千万连接这种场景下,一般机器是什么配置呢 按这么发展下去,以后会不会出现单机1亿连接,那样的话所有处理都得硬件来完成了吧

    作者回复: 这在流量集中的场景是需要的,比如网关或者流量清洗这种安全系统上

    2019-02-11
    3
    6
  • 深海极光
    老师你好,您说到epoll 的边缘触发只在文件描述符可读或可写事件发生时才通知,那么应用程序就需要尽可能多地执行 I/O,并要处理更多的异常事件,我有点不理解这个多执行IO是为什么?是指有一个文件描述符也就是链接可读或者可写时就通知应用程序一次,那么有100个链接同时都可读,就通知应用程序100次吗,应用程序拿到这100个都是可读的。并没有多的IO执行啥,还请老师解惑,谢谢!

    作者回复: 因为一次读有可能不会读到所有数据,但这种情况不会有新的事件通知了

    2019-03-19
    5
  • 杜嘉嘉
    老师,您好。我看IO模型这块老提到文件描述符,这个跟IO模型有啥关系呢?

    作者回复: 还记得虚拟文件系统(VFS)吧,使用套接字接口的时候,也是要分配一个文件描述符,然后后续所有的I/O都通过这个文件描述符来操作(包括IO模型中要判断可读写状态)。

    2019-02-22
    5
  • 科学Jia
    老师,问题1: DPDK和XDP,是不是在qps不能上去的情况下都可以采用的方案?问题2:DPDK和XDP是linux需要额外配置的工具么?

    作者回复: 是的,都需要额外的开发

    2019-03-04
    4
  • Tachone
    推荐陈硕的 muduo网络库,就是采用reator模式(epoll)+线程池实现的,写的非常好

    作者回复: 嗯,不过现在网络库已经不是个大问题了,特别是新型的语言(比如 Go)都内置了很好用的网络库

    2019-02-12
    4
  • shawn
    我理解,流量大于十万就该用集群了吧,一堆小型机的维护和开发成本应该小于一个大家伙吧

    作者回复: 要看场景的,特别是流量集中的位置(比如数据中心的入口或出口处的应用)对 PPS 的要求还是很高的

    2019-02-11
    4
收起评论
显示
设置
留言
53
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部