专栏首页用户4352451的专栏浅析线程池参数设置

浅析线程池参数设置

背景

首先先明确一下线程池的主要作用是什么 线程池解决的核心问题就是资源管理问题。在并发环境下,系统不能够确定在任意时刻中,有多少任务需要执行,有多少资源需要投入。这种不确定性将带来以下若干问题:

  1. 频繁申请/销毁资源和调度资源,将带来额外的消耗,可能会非常巨大。创建一个线程不仅会消耗内存资源,并且会增加CPU的线程的上下文切换频繁,当线程达到一定的极限的时候CPU就只能忙的切换线程,而其他什么事情也不做了。
  2. 对资源无限申请缺少抑制手段,易引发系统资源耗尽的风险。当我们无限的去申请线程的时候就有可能产生OOM等问题
  3. 系统无法合理管理内部的资源分布,会降低系统的稳定性。比如说我们的mysql有自己的池,我们的redis也有自己的池。还比如我们使用的队列消费也有自己的池。这也就是一种安全隔离
  4. 那就是快速的处理请求,一个人工作怎么有多个人工作快呢?这里也牵扯到一个多人合作的配合问题,也就是线程线程的切换问题,我们都知道Java语言的线程切换方式采用的是抢占式,意思就是由系统来分配资源。线程太多的时候系统就会有忙不过来的情况。

我们如果使用Java语言的话,我们来分析一下Java线程池。

Java中的ThreadPoolExecutor

理论上线程池的参数设置情况

  1. 理论必定只是理论,到真实的场景中我们的目的性是不一样的。有的是追求快,有的时候机器资源很充足,有的是追求稳的。
  2. 所以在设置线程池的时候我们还是确定一个最后权重比较大的目标去设置。

线程池的目的我们也知道了,大概设置的基础理论也清楚了。看看美团技术团队给的两个场景。

快速响应用户请求

描述:用户发起的实时请求,服务追求响应时间。比如说用户要查看一个商品的信息,那么我们需要将商品维度的一系列信息如商品的价格、优惠、库存、图片等等聚合起来,展示给用户。

分析:从用户体验角度看,这个结果响应的越快越好,如果一个页面半天都刷不出,用户可能就放弃查看这个商品了。而面向用户的功能聚合通常非常复杂,伴随着调用与调用之间的级联、多级级联等情况,业务开发同学往往会选择使用线程池这种简单的方式,将调用封装成任务并行的执行,缩短总体响应时间。另外,使用线程池也是有考量的,这种场景最重要的就是获取最大的响应速度去满足用户,所以应该不设置队列去缓冲并发任务,调高corePoolSize和maxPoolSize去尽可能创造多的线程快速执行任务。

总结:将核心线程数和最大线程数设置到最大。这里的最大也就是我们在不影响其他接口或业务的情况下,还有就是机器资源OK的情况下。现在我们的机器都是分布式,在CPU或内存超过某一个阀值的时候就会自动扩容弹机器。还有就是队列的使用,也就是看你用户的峰值会有多少,设置一个有界队列当突然流量,比如100个同时请求,这个时候我们的系统最大承受能力是80个线程数,哪我们就设置个核心线程数设置的是20个,那么我们就搞100。个大小容量的队列。然后避过这个高峰我们的线程继续去消费。但是在我们目前这种场景是不设置队列的。设置位0,因为用户对等待是零容忍的。

快速处理批量任务

描述:离线的大量计算任务,需要快速执行。比如说,统计某个报表,需要计算出全国各个门店中有哪些商品有某种属性,用于后续营销策略的分析,那么我们需要查询全国所有门店中的所有商品,并且记录具有某属性的商品,然后快速生成报表。

分析:这种场景需要执行大量的任务,我们也会希望任务执行的越快越好。这种情况下,也应该使用多线程策略,并行计算。但与响应速度优先的场景区别在于,这类场景任务量巨大,并不需要瞬时的完成,而是关注如何使用有限的资源,尽可能在单位时间内处理更多的任务,也就是吞吐量优先的问题。所以应该设置队列去缓冲并发任务,调整合适的corePoolSize去设置处理任务的线程数。在这里,设置的线程数过多可能还会引发线程上下文切换频繁的问题,也会降低处理任务的速度,降低吞吐量。

总结:这里的话我们会看到这个是一个稳定的请求过程,不会出现突然的猛增等情况,所以我个人认为在机器资源充分的情况下可以不设置队列,但是就如上文所说,尽量多的并发充分利用资源,所以说这里的话可以使用队列做一个临时缓冲做准备的地方,那我的理解就是,机器资源只有那么多设置的核心线程数和最大线程数不能满足这些大量的请求,但是我又不想让这些请求被拒绝,所以我开个缓冲队列来进行缓冲消费。

总结

  1. 线程池的作用
  2. 线程池理论参数设置参考
  3. 场景分析

参考

美团技术团队-Java线程池实现原理及其在美团业务中的实践

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 如何设置线程池参数大小?

    其实线程池的设置是有方法的,不是凭借简单的估算来决定的。今天我们就来看看究竟有哪些计算方法可以复用,线程池中各个参数之间又存在怎样的关系呢? 本文咱们来慢慢聊。

    田维常
  • Nginx线程池浅析

    Nginx通过使用多路复用IO(如Linux的epoll、FreeBSD的kqueue等)技术很好的解决了c10k问题,但前提是Nginx的请求不能有阻塞操作,...

    用户7686797
  • java-线程池(ThreadPoolExecutor)的参数解析

    很多时候为了省事用的都是Executors的方式去创建,感觉也没什么问题,不过阿里工程师的推荐自然是有道理的,以后还是尽量改用ThreadPoolExecuto...

    李林LiLin
  • 线程池参数详解

    我们知道JUC提供了丰富的并发工具类,其中类似于组的结构叫做线程池。就是说我们可以将我们需要运行的线程加入到这个组内,然后通过启动线程池来执行加入到线程池的所有...

    写一点笔记
  • 从原理上搞懂如何设置线程池参数大小?

    其实线程池的设置是有方法的,不是凭借简单的估算来决定的。今天我们就来看看究竟有哪些计算方法可以复用,线程池中各个参数之间又存在怎样的关系呢? 本文咱们来慢慢聊。

    架构师修炼
  • Java线程池容量设置

    Java中可以通过Executors和ThreadPoolExecutor的方式创建线程池,通过Executors可以快速创建四种常见的线程池,但这种方式在实际...

    阿杜
  • 浅析Tomcat高并发之连接池、线程池

    记得大学的《网络工程》有一个课后作业:用Java实现一个web服务器,当时想的是为了提高吞吐量,可以用多线程实现,即对于每一个客户端请求连接,都启动一个线程来处...

    Bruce Li
  • 线程池大小 + 线程数量到底设置多少?

    抛开一些操作系统,计算机原理不谈,说一个基本的理论(不用纠结是否严谨,只为好理解):一个CPU核心,单位时间内只能执行一个线程的指令 ** 那么理论上,我一个线...

    Java小咖秀
  • 操作系统|显示线程和线程池浅析

    理解线程前先来看一下进程:其就是一个应用程序,当其启动运行时,操作系统就会为其分配一定的内存空间使其正常运行。

    算法与编程之美
  • (十)线程池参数——workQueue用法

    线程池参数的 workQueue 决定了缓存任务的排队策略,对于不同的业务场景,我们可以使用不同的排队策略。

    HaC
  • 2020-10-26:线程池的线程数怎么设置比较好?

    混合型:【cpu核心数 / (1 - 阻塞系数)】,阻塞系数=阻塞时间/(阻塞时间+计算时间)。

    福大大架构师每日一题
  • 一篇文章浅析Python自带的线程池和进程池

    我们都知道,不管是Java,还是C++,还是Go,还是Python,都是有线程这个概念的。

    Python进阶者
  • Java线程池详解

    构造一个线程池为什么需要几个参数?如果避免线程池出现OOM?Runnable和Callable的区别是什么?本文将对这些问题一一解答,同时还将给出使用线程池的常...

    java架构师
  • 如何合理设置线程池大小

    对于不同性质的任务来说,CPU密集型任务应配置尽可能小的线程,如配置CPU个数+1的线程数,IO密集型任务应配置尽可能多的线程,因为IO操作不占用CPU,不要让...

    AlbertZhang
  • 线程池参数原理及应用 原

        Java创建一个线程很方便,只需new Thread()就可以, 但是当有多个任务需要进行进行处理时,频繁的进行创建和启用线程同样需要系统开销,也不利于...

    chinotan
  • Java中线程池的参数有几个?

    在使用线程池时,为了获取最佳的性能,常常需要手动指定线程池的参数,ThreadPoolExecutor是最常用的线程池执行器,它有四个构造方法,参数最多的构造方...

    小诸葛
  • Java 线程池 ThreadPoolExecutor 八种拒绝策略浅析

    谈到 Java 的线程池最熟悉的莫过于 ExecutorService 接口了,jdk1.5 新增的 java.util.concurrent 包下的这个 ap...

    zhisheng
  • 再聊线程池

    引言 最近恰好在组内分享线程池,又看了看四年前自己写的线程池文章,一是感叹时光荏苒,二是感叹当时的理解太浅薄了,三是感叹自己这么多年依然停留在浅薄的理解当中,没...

    高爽
  • Java线程池---execute函数解析

    None_Ling

扫码关注云+社区

领取腾讯云代金券