前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >系统性能调优必知必会 (2)

系统性能调优必知必会 (2)

作者头像
程序员小王
发布2023-03-21 14:56:36
5610
发布2023-03-21 14:56:36
举报
文章被收录于专栏:架构说
输出结果
  1. 执行线程在需要调用外部服务的时候, 如何避免线程等待外部服务, 同时还要保证及时处理返回的响应呢?

答:等到数据到打 而不是就绪。

  1. 异步会比同步更快吗?

答:

异步模型并不会让程序的业务逻辑执行得更快,

但是它可以非常有效地避免线程等待,

大幅减少 CPU 在线程上下文切换上浪费的时间

  1. 多进程和多线程、协程实现的并发编程,各自的优势和劣势是什么 答:并发粒度, 进程:水平扩展,进程之间一个core,不影响另外一个。通过管道 信号 tcp 通讯

线程:垂直扩展,利用多核, 实现异步。缺点:cas 安全

协程:1 交替执行 2. 实现同步,异步io

可以暂停 恢复函数。

  1. 面试算法:斐波那契数列时间复杂度为 O(1) 的解法,你会吗?

答:数据公式 https://houbb.github.io/2020/01/23/data-struct-learn-07-base-dp-fib

https://code-examples.net/zh-CN/q/5812c

过程

加餐3 | 大厂面试到底在考些什么?

大厂面试到底在考些什么?相信绝大多数同学都经历过技术面试,你肯定发现,小厂与大厂的面试题差距很大,其中,大厂特别关注程序性能,为什么呢?

在我看来有这样 3 个原因:

首先,大厂产品的用户基数大,任何微小的性能提升都会被庞大的用户数放大。因此,员工具备性能优先的思维,有利于提升产品竞争力。

其次,大厂经常会重新造轮子,不管原因是什么,造轮子都需要深厚的底层知识,而性能是其中的核心要素。

而且,愿意花时间去掌握底层知识的候选人,学习动力更强,潜力也会更好。

最后,大厂待遇好,成长空间大,是典型的稀缺资源,大家都打破了头往里挤。

在这样优中选优的情况下,有区分度的性能题就是最好的面试题,通过快速筛选不同档次的候选人,可以节约招聘成本。那么,对于候选人来说,到底怎样才能答好性能面试题呢?

首先,背网上流传的大厂面试题,绝对不是个好主意,这是因为大厂的面试题并不是固定的,

往往都是考官自备的面试题,这与每位考官的个人经历有关,所以你押中面试题的概率非常低。

可见,这么一道简单的题目,就可以考察递归编码能力、递推解法、公式解法、矩阵解法、时间复杂度的推算、计算机浮点运算特性等许多知识点。

而且,随着你回答时涉及到更多的知识点,面试官会基于自己的经验进一步延伸提问。所以我不推荐你押题,把基础技能掌握好才是最有效的面试备战法。

  • 这道题目只是入门的算法题,如果你应聘的是 Google、头条之类非常重视算法的公司,那么你还必须掌握动态规划、贪心算法、图算法等高级算法等等。
  • 任何大厂都非常强调团队协作,

如果员工遇到难题时,只会闷头冥想,这样的时间成本太高,既有可能延迟项目进度,

也不利于充分发挥大厂高手如林、资源丰富的优势。

所以,如果你在面试中,表现出善于沟通、乐于求助的特性,都是加分项。

  • https://zhuanlan.zhihu.com/p/165877869 为啥是2 N次方呢。

求解斐波那契数列的F(n)

有两种常用算法:递归算法和非递归算法。

试分析两种算法的时间复杂度。

时间的复杂度为O(2^n),即2的n次方

https://wmjtxt.github.io/2018/12/26/three_method_of_fibonacci/

大咖助场4|傅健:那些年,影响我们达到性能巅峰的常见绊脚石(下)

摘要

  • 进程之间空间是隔离的,但是磁盘是共享的,磁盘在通用块有调度算法。
  • 网络抖动

网络抖动 --网络分区--p2p

CAP原则的精髓就是要么AP,要么CP,要么AC,但是不存在CAP。

  • Availability

大咖助场3|傅健:那些年,影响我们达到性能巅峰的常见绊脚石(上)

资料

  • https://gitee.com/geektime-geekbang/geek_netty

摘要

  • 场景 1:重试、重定向
代码语言:javascript
复制

//构建http client
CloseableHttpClient httpClient = HttpClients.custom().
      setConnectionTimeToLive(3, TimeUnit.MINUTES).
      //省略其它非关键代码
      setServiceUnavailableRetryStrategy(new DefaultServiceUnavailableRetryStrategy(1, 50)).
      //设置了一个自定义的重试规则
      setRetryHandler(new CustomizedHttpRequestRetryHandler()).
            build();
  
//自定义的重试规则
@Immutable
public class CustomizedHttpRequestRetryHandler implements HttpRequestRetryHandler {

   private final static int RETRY_COUNT = 1;

   CustomizedHttpRequestRetryHandler() {}

   @Override
   public boolean retryRequest(final IOException exception, final int executionCount, final HttpContext context) {
      //控制重试次数
      if (executionCount > RETRY_COUNT) {
         return false;
      }
      //遇到下面这些异常情况时,进行重试
      if (exception instanceof ConnectTimeoutException || exception instanceof NoHttpResponseException || exception instanceof SocketTimeoutException) {
        return true;
      }
      
      //省略其它非关键代码
      return false;
   }
}
  • gc 没有看懂

线上系统频繁Full GC问题排查【map 里面数据不释放】

https://dongzl.github.io/2019/09/20/05-online-system-frequent-full-gc-bug/index.html

map 怎么除非gc问题

  • jvm G1源码分析和调优

https://network.51cto.com/art/202105/662175.htm

加餐4|百万并发下Nginx的优化之道

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

用举例子的方式来梳理一遍。总结下的话,就是帮你理清这些问题:

  • 线程到底是如何在 CPU 中执行的?
  • 线程上下文切换为什么会影响性能?
  • 为什么说异步比同步的性能好?
  • BIO、NIO、AIO 到底有什么区别?

摘要

  • 一个 8 核的 CPU,8 个线程的情况下效率是最高的。这时,每个 CPU 核心正好对应一个线程
  • 异步 IO 模型(AIO,Asynchronous I/O) Linux 内核从 2.6 开始才加入了 AIO 的支持
  • IO 多路复用本质上还是一种同步 IO 模型
  • 很多编程语言中,都有一些网络 IO 框架,封装了这些 IO 模型,来帮我们解决这个问题,

比如 Java 语言中的 BIO、NIO、AIO 分别对应了同步 IO 模型、IO 多路复用模型和异步 IO 模型

异步模型并不会让程序的业务逻辑执行得更快, 但是它可以非常有效地避免线程等待, 大幅减少 CPU 在线程上下文切换上浪费的时间。

  • 上面描述 并没有详细描述,需要自己多看其他东西才能理解。因为上面内容 最核心一个观点 是避免线程等待

思考题

最后留给你一道思考题。

IO 多路复用,它只是一种 IO 模型,

实际上有多种实现。在 Linux 中,有 select、poll、epoll 三种实现方式,

课后请你去查阅一下资料,看看这三种实现方式有什么区别?

  • kqueue, kevent, kevent64 and kevent_qos -- kernel event notification mechanism

https://docs.google.com/presentation/d/1TjYZOqYhAbOjv-a2oWQrCxk6HStoiCI9P4_5Ba3ZriY/edit#slide=id.gdc1225ce97_0_320

https://www.cnblogs.com/freebird92/archive/2011/06/28/2092795.html

Proactor模式给出了如何构造应用程序与系统, 高效的利用操作系统提供的异步机制。

When an application invokes an asynchronous operation, the OS performs the oper- ation on behalf of the application.

当一个应用程序调用一个异步操作时,操作系统来具体执行异步操作。

This allows the application to have multiple operations running simultaneously without requiring the application to have a corresponding number of threads.

这样允许应用程序同时请求多个异步操作,而不需要启动相应个数的线程

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-06-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Offer多多 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 过程
    • 加餐3 | 大厂面试到底在考些什么?
      • 大咖助场4|傅健:那些年,影响我们达到性能巅峰的常见绊脚石(下)
        • 大咖助场3|傅健:那些年,影响我们达到性能巅峰的常见绊脚石(上)
          • 资料
          • 摘要
        • 加餐4|百万并发下Nginx的优化之道
          • 大咖助场1 | 李玥:高并发场景下如何优化微服务的性能?
            • 摘要
        相关产品与服务
        Prowork 团队协同
        ProWork 团队协同(以下简称 ProWork )是便捷高效的协同平台,为团队中的不同角色提供支持。团队成员可以通过日历、清单来规划每⽇的工作,同时管理者也可以通过统计报表随时掌握团队状况。ProWork 摒弃了僵化的流程,通过灵活轻量的任务管理体系,满足不同团队的实际情况,目前 ProWork 所有功能均可免费使用。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档