系统性能调优必知必会
陶辉
智链达 CTO,前阿里云 P8 高级技术专家
36367 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 47 讲
系统性能调优必知必会
15
15
1.0x
00:00/00:00
登录|注册

大咖助场1 | 李玥:高并发场景下如何优化微服务的性能?

异步模型的优势
IO多路复用
异步IO vs. 同步IO
数据库连接池大小的影响
最佳线程数的确定
线程数越多性能越差的原因
异步 vs. 同步性能比较
线程上下文切换影响性能
线程在CPU中执行
IO多路复用的实现方式
异步模型
线程数量与性能
线程执行
思考题
高并发场景下微服务性能优化
性能优化

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

你好,我是李玥。相信这里有部分同学对我是比较熟悉的,我在极客时间开了两门课,分别是《消息队列高手课》《后端存储实战课》。今天很荣幸受邀来到陶辉老师的专栏做一期分享。
陶辉老师的这门课程,其中的知识点都是非常“硬核”,因为涉及到计算机操作系统底层的这些运行机制,确实非常抽象。我也看到有些同学在留言区提到,希望能通过一些例子来帮助大家更好地消化一下这些知识。那么这期分享呢,我就来帮陶辉老师做一次科普,帮助同学们把“基础设施优化”这一部分中讲到的一些抽象的概念和方法,用举例子的方式来梳理一遍。总结下的话,就是帮你理清这些问题:
线程到底是如何在 CPU 中执行的?
线程上下文切换为什么会影响性能?
为什么说异步比同步的性能好?
BIO、NIO、AIO 到底有什么区别?

为什么线程数越多反而性能越差?

今天的课程,从一个选择题开始。假设我们有一个服务,服务的业务逻辑和我们每天在做的业务都差不多,根据传入的参数去数据库查询数据,然后执行一些简单的业务逻辑后返回。我们的服务需要能支撑 10,000TPS 的请求数量,那么数据库的连接池设置成多大合适呢?
我给你二个选项:
A. 32
B. 2048
我们直接公布答案,选项 A 是性能更好的选择。连接池的大小直接影响的是,同时请求到数据库服务器的并发数量。那我们直觉的第一印象可能是,并发越多总体性能应该越好才对,事实真的是这样吗?下面我们通过一个例子来探究一下这个问题的答案。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

在本文中,李玥分享了在高并发场景下优化微服务性能的关键知识。他通过生动的比喻和例子,解释了线程在CPU中执行、线程上下文切换对性能的影响、异步与同步性能的比较,以及BIO、NIO、AIO的区别。他指出,对于请求/响应模型的服务,最佳的并发线程数设置为CPU核数N倍,N的经验值范围是[2, 10]。此外,他强调了使用异步模型编写微服务,配合异步IO或者IO多路复用,可以有效地避免线程等待,用少量的线程处理大量并发请求,从而提升服务总体性能。最后,他留下了一个思考题,让读者深入了解IO多路复用的不同实现方式。这篇文章通俗易懂地帮助读者理解了在高并发场景下优化微服务性能的关键知识点,对于需要进行性能优化的技术人员具有很高的参考价值。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《系统性能调优必知必会》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(7)

  • 最新
  • 精选
  • 點點點,点顛
    先回答一下思考题: 首先是poll和 select 函数对比, poll 函数和 select 不一样的地方就是,在 select 里面,文件描述符的个数已经随着 fd_set 的实现而固定,没有办法对此进行配置;而在 poll 函数里,我们可以控制 pollfd 结构的数组大小,这意味着我们可以突破原来 select 函数最大描述符的限制,在这种情况下,应用程序调用者需要分配 pollfd 数组并通知 poll 函数该数组的大小。 epoll 与poll相对比,epoll不同于 poll 的是,epoll 不仅提供了默认的 level-triggered(条件触发)机制,还提供了性能更为强劲的 edge-triggered(边缘触发)机制。条件触发的意思是只要满足事件的条件,比如有数据需要读,就一直不断地把这个事件传递给用户;而边缘触发的意思是只有第一次满足条件的时候才触发,之后就不会再传递同样的事件了。一般我们认为,边缘触发的效率比条件触发的效率要高,这一点也是 epoll 的杀手锏之一。 答案来源主要是极客专栏盛延敏老师的《网络编程实战》。 非常的喜欢李玥老师,老师的两门课都收获很多。比如《消息队列高手课》里面实现一个简单的RPC框架,真的是意外之喜,买一送一。还有《后端存储实战课》,意外之喜就是结束语了,感觉又是买一送一了,让我学到了很多技术之外的东西,感谢李玥老师。(也许秋招我可以投京东试一试😄)

    作者回复: ^_^

    2020-06-26
    3
    3
  • west
    线程数量需要根据业务特征io密集,计算密集型 计算密集型线程数量 CPU核数+1 IO密集型 线程数量=(CPU空闲时间+CPU工作时间)/CPU工作时间 + 1
    2020-07-30
    1
    11
  • 战斗机二虎🐯
    感觉说得太绝对了,现网DB链接池配置32不现实,业务侧mysql访问组件一个进程就会建立几个链接,多起几个进程mysql就受不了了
    2020-06-29
    2
    2
  • 程序员老王
    select、poll、epoll 不是aio 模型。
    2021-06-27
  • 🎧重返归途
    对于独立应用socket 的网关服务和处理服务的线程数实际上是很低的,多数只能达到应用瓶颈而不会出现服务器CPU或IO瓶颈。Linux内核的select方式在处理socket似乎优于后面两个,曾经在一个项目中遇到了这个问题,选择select 在超过线程数的并发下服务器不会出现拒绝连接的响应。
    2020-07-19
  • 。。。
    如果是应用服务器有20多台,数据库是一台master3台salve的话,这样的数据库连接池怎么设置呢?希望老师能回答
    2020-06-28
    3
  • 凉人。
    老师你好,我有两个问题想请教一下。 1 多工位解决等待问题,这部分应该解决的是io读写的时间吧? 2 异步io,在发送信号之前是在做下一个请求么?如果是在处理下个请求,那么信号唤醒,这里会涉及线程的切换么?
    2020-06-26
    2
收起评论
显示
设置
留言
7
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部