从 0 开始学架构
李运华
网名“华仔”,前阿里资深技术专家(P9)
152577 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已完结/共 66 讲
结束语 (1讲)
结课测试 (1讲)
从 0 开始学架构
15
15
1.0x
00:00/00:00
登录|注册

加餐|单服务器高性能模式性能对比

epoll不适用于连接数过多的场景
触发C10K问题
C10K问题
epoll在并发数超过10000时性能开始下降
poll模式随并发数增多稳定下降
prethreaded模式在12000并发连接时性能急剧下降
高并发时只有pthreaded和epoll能继续运行
并发2000以内,preforked、prethreaded、epoll性能相近
创建进程消耗是创建线程的4倍
prethreaded模式性能下降
preforking、prethreaded、epoll性能相近
原作者代码实现的HTTP服务器
原作者测试代码GitHub仓库地址
原作者系列文章
发现与解读
纵向看转折
横向看对比
拓展阅读与学习指南
测试数据对比
Reactor与Proactor
PPC与TPC
单服务器高性能模式性能对比

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

你好,我是华仔。
我们架构课的第 18 讲第 19 讲主题是单服务器高性能模式,我们讲了 PPC 与 TPC、Reactor 与 Proactor,从理论上跟你详细讲述了不同模式的实现方式和优缺点,但是并没有给出详细的测试数据对比,原因在于我自己没有整套的测试环境,也不能用公司的服务器做压力测试,因此留下了一个小小的遗憾。
幸运的是,最近我在学习的时候,无意中在网络上找到一份非常详尽的关于 Linux 服务器网络模型的详细系列文章。作者通过连载的方式,将 iterative、forking(对应专栏的 PPC 模式)、preforked(对应专栏的 prefork 模式)、threaded(对应专栏的 TPC 模式)、prethreaded(对应专栏的 prethread 模式)、poll、epoll(对应专栏的 Reactor 模式)共 7 种模式的实现原理、实现代码、性能对比都详尽地进行了阐述,完美地弥补了专栏内容没有实际数据对比的遗憾。
因此我把核心的测试数据对比摘录出来,然后基于数据来进一步阐释,也就有了这一讲的加餐。我想第一时间分享给你,相信今天的内容可以帮助我们加深对课程里讲过的理论的理解。
下面是作者对 7 种模式的性能测试对比结果表格,作者在文章中并没有详细地介绍测试环境,只是简单提到了测试服务器是租来的云服务器,CPU 只有 1 核(没有说明具体的 CPU 型号),对于内存、带宽、磁盘等信息并没有介绍,我们假设这些硬件相关性能都足够。从理论上来说,网络模型的核心性能部件就是 CPU,因此如下数据是具备参考意义的。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文详细介绍了作者对Linux服务器网络模型的性能测试对比结果,包括iterative、forking、preforked、threaded、prethreaded、poll、epoll等7种模式的实现原理、实现代码、性能对比。作者通过横向对比和纵向转折的方式解读了测试数据,得出了一些重要发现:创建进程的消耗是创建线程的消耗的4倍左右;在并发数较低时,preforked和prethreaded模式的性能相近,甚至有时稍高;当并发数达到8000以上,只有pthreaded和epoll模式能够继续运行,但性能也有下降;epoll在并发数超过10000的时候性能开始下降,但下降比较平稳。此外,作者还提到了C10K问题对性能的影响,以及不同模式在不同应用场景下的适用性。总的来说,本文通过详细的性能测试数据对比,为读者提供了对不同网络模型性能特点的深入理解,并指导了在实际架构设计中选择合适模式的建议。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《从 0 开始学架构》
新⼈⾸单¥68
立即购买
登录 后留言

全部留言(8)

  • 最新
  • 精选
  • 两只狮子
    华哥,请教一下concurrence列下面的数据是指的绝对并发数还是指的每秒的请求量呢?

    作者回复: 并发连接数,每个连接压满,然后计算得到每秒请求数

    2021-02-20
    9
  • YHK
    prethread 好强啊。比 poll和select都强,那epoll没出来之前,怎么还有人用多路复用

    作者回复: prethread解决不了c10k问题,其实c10k问题出现前,多路复用用的不多

    2021-05-26
    4
  • leesper
    我用Go写过一个网络库,得益于Go语言的强大,我对每个网络连接开了三个goroutine,一个负责读,一个负责写,一个负责配合工作者线程执行业务逻辑,但我一直想写一个基于epoll的网络库出来,https://github.com/leesper/tao

    作者回复: 自己练手java可以直接参考Doug lee 的Java NIO编程的PPT,里面给个样例。 Go语言这样设计我感觉没有发挥Go的优势,三个goroutine之间的消息传递可能比较耗费性能,我觉得直接用一个goroutine处理一个连接比较好,意见供参考

    2021-01-13
    4
  • Geek_798202
    看了老师的分析后,反思自己对技术太浅尝辄止了,只是做到了理解,然后缺少总结和实践,后面希望自己能加强学习,认识到差距

    作者回复: 多实践,多问问为什么,你也可以做到的 :)

    2023-09-22归属地:广东
    1
  • Join
    太棒了华仔, 之前看Linux高性能服务器开发中提到Reactor模式,可以没有测试数据支撑,这下可以弥补这个缺失了

    作者回复: 找了好久才找到 :)

    2022-03-10
    1
  • Geek_c25f25
    神文,都说reactor模式好,但是到底怎么个好还是要有测试数据支撑。老师的分析能力好强大啊,特别是redis,c10k这两个分析真的太精彩了,其他地方看不到这两个情况的分析。

    作者回复: 如果有多核服务器测试,效果会更明显 :)

    2021-12-01
    1
  • FuriousEric
    老师,请教下,表格中concurrency(并发连接数)这栏,作者是使用什么工具模拟这么多并发连接数的呢?也就是用啥工具测试的能产生这么多concurrency, 一般我做测试,用wrk, connections设置20个左右。但是图中concurrency高达1w+,是怎么模拟出来的?

    作者回复: jmeter,ab,loadrunner这些测试工具都可以设定并发数(或者叫线程数),然后在多台机器上启动多个测试工具一起压测就可以达到很大的并发数了。

    2022-08-02归属地:广东
  • Geek_c25f25
    从表格中发现另外一个数据,不管并发连接数是多少个,从epoll的数据看,都是2000+一点,也就是这个系统的QPS只能达到2000+。

    作者回复: 对的,单核2000已经不错了 :)

    2021-12-01
收起评论
显示
设置
留言
8
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部