多线程也会产生性能问题

190 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第17天,点击查看活动详情

从面试题开始

每次换工作都要大量的刷面试题,八股文等等。多线程的面试问题也是必不可少的一部分。由于之前有做过 NodeJs 也做过 Java 开发,总会被问它们之间的区别或者对它们的看法。

其中经常会说的一个优势点:NodeJs 的单线程机制。没有多线程那就可以不用考虑线程安全的问题,也无需担心多线程切换的开销。NodeJs 开发对于性能方面,通过异步 I/O很好的解决IO密集的问题,实现了高性能的服务器。

像 Java 这种面向对象语言的开发,都提供了多线程支持。让多个线程同时工作,可以加快程序运行的速度。但同时也是会带来性能的问题。

服务性能指标

所谓的性能问题,经常说的是什么?基本可以从以下方面的表现来体现性能问题:

  • 并发数:同一时间同时请求服务的用户数。
  • 服务响应时间

响应时间就是用户从发出请求到接收完响应之间的耗时。这个过程由网络传输、服务处理等多个部分组成

  • 吞吐量

吞吐指的是服务处理请求的能力。吞吐量越高,代表服务处理效率就越高。换句话说就是网站的性能越高

  • QPS

每秒查询率。在规定时间内所处理流量多少的衡量标准。QPS = 并发数 / 平均响应时间。

多线程产生性能问题

多线程也会带来性能问题。在使用线程会在两方面会带来性能问题:

  • 线程调度

线程数是大于 CPU 核心数。所以在操作系统按照调度算法进行线程调度时,会引起上下文切换。上下文切换会把当前正在执行的线程挂起然后保存起状态,然后寻找下一个可执行的线程,然后唤醒它。这样反复不断执行。

如果下一个可执行的线程只是简单计算工作,那么上下文切换带来的性能开销比执行线程的开销还要大。

在整个不断挂断,唤醒的执行过程,有时候可能会使用缓存来加速正序的运行,但如果缓存失效就需要重新载入缓存,就会造成一定的开销。

  • 线程协作

有时候多个线程之间有共享数据,为保证线程安全,可能需要进行一些安全保证的措施,可能就会导致性能降低。因为线程安全的优先级要比性能优先级更高