首页 > 其他分享 >线程池要设置多大

线程池要设置多大

时间:2023-09-30 18:22:18浏览次数:41  
标签:池要 计算 多大 阻塞 线程 IO 密集型 CPU

https://cloud.tencent.com/developer/article/1605149

线程数是怎么设置的呢?

服务器的配置、服务器资源的预算和任务自身的特性。具体来说就是服务器有多少CPU、多少内存、IO支持的最大QPS是多少,任务主要执行的是计算、IO还是混合操作。任务中是否包含数据库连接等的稀缺资源。

假设机器有N个CPU,对于计算密集型的任务,应该设置线程数为N+1;对于IO密集型的任务,应该设置线程数为2N。

而对于同时有计算工作和IO工作的任务,应该考虑使用两个线程池,一个处理计算任务,一个处理IO任务,分别对两个线程池按照计算密集型和IO密集型来设置线程数。

N+1和2N都是经验值。

首先计算CPU的利用率A,为了让CPU到达100%,可以设置A的倒数个线程X。

如果IO操作是DB操作,而DB的QPS上限是1000,这个线程池又该设置为多大呢?

可以先计算出X个线程数的QPS大小,然后和1000比较,按相同比例设置线程的个数。

线程数的第一种计算方法

在一个基准负载下,使用几种不同大小的线程池运行你的应用程序,并观察CPU利用率的水平。

给定下列定义:
Ncpu = CPU的数量
Ucpu = 目标CPU的使用率, 0 <= Ucpu <= 1
W/C = 等待时间与计算时间的比率
为保持处理器达到期望的使用率,最优的池的大小等于:  
Nthreads = Ncpu x Ucpu x (1 + W/C)

第二种计算方法

线程数 = CPU可用核心数/(1 - 阻塞系数),其中阻塞系数的取值在0和1之间。

计算密集型任务的阻塞系数为0,而IO密集型任务的阻塞系数则接近1。

一个完全阻塞的任务是注定要挂掉的,所以我们无须担心阻塞系数会达到1。

阻塞系数可以通过公式:阻塞系数=阻塞时间/(阻塞时间+计算时间),其实也就是上一种算法中的W/C的方式来计算,所以阻塞系数也是可以通过基准程序计算得出的。

所谓的经验值由来

以第一种计算方式来看,对于计算密集型应用,假定等待时间趋近于0,使得CPU利用率达到100%,那么线程数就是CPU核心数,那这个+1意义何在呢?

计算密集型的线程恰好在某时因为发生一个页错误或者因其他原因而暂停,刚好有一个“额外”的线程,可以确保在这种情况下CPU周期不会中断工作。

所以N+1确实是一个经验值。

而对于IO密集型应用

W/C值趋向于1,那么线程数应该去2N。

标签:池要,计算,多大,阻塞,线程,IO,密集型,CPU
From: https://www.cnblogs.com/ckxkexing/p/17738087.html

相关文章

  • python提取论文图片波形数据:pyautogui键盘移动鼠标,跨模块全局变量使用,cv2局部放大窗口
    最近写了一个python提取论文图片波形数据的脚本,代码如下。涉及新知识点:pyautogui键盘移动鼠标,跨模块全局变量使用,cv2局部放大窗口,matplotlib图片在pyQT5lable显示,坐标变换,多线程同时使用。搜索相关关键字去对应代码区看注释就可以了。gui窗口:1#-*-coding:utf-8-*-2......
  • 对线程池设置做压测
    线程池代码@ConfigurationpublicclassThreadPoolConfig{//核心线程池大小privateintcorePoolSize=24;//最大可创建的线程数privateintmaxPoolSize=25;//队列最大长度privateintqueueCapacity=100;//线程池维护线程所允......
  • C++11 多线程< 一>、介绍
    1#include<iostream>2#include<thread>34voidfun1()5{6std::cout<<"fuck"<<std::endl;7}89intmain()//主线程10{11std::threadt1(fun1);//t1线程12//t1.join();//主线程和t1互不干扰,......
  • 对于学习Linux进程与线程的感悟
    进程感觉就像一个应用程序一样,比如QQ,火狐浏览器等等,他们之间互不干扰,可以独立运行。线程就像QQ里的各种功能,比如好友列表,显示当前是在线还是离线,会话窗口等等去实现各种功能,进程死掉的话,这些线程也会跟着结束。经过一段时间的学习,发现线程方便好用,线程与线程之间通信非常......
  • linux磁盘空间满了后怎么去判定哪个地方占了多大的空间并回收
    概述日常工作总会碰到磁盘满的情况,这时候我们需要去判定哪个地方占的存储比较多,看那些文件有没用,如果没用就可以删掉节省空间。下面大概写一下处理的一个过程。1、使用df-h查看磁盘空间占用情况 2、使用du-s/*|sort-nr命令查看那个目录占用空间大 然后那个......
  • 爬虫记录~(多线程爬取图片)
    使用Requests+Re库方法多线程爬取亚马逊商城商品图片,以关键词“书包”搜索页面的商品的图片,爬取0-2页面商品图片。关键词:多线程爬虫程序、商城网站的遍历,链接的查找和访问。巩固搜索接口和翻页处理。importrequestsfromfake_useragentimportUserAgentimportrefrommulti......
  • 面试必问:JS单线程与事件循环,看这篇就够了
    JavaScript是一种单线程语言,它在任何给定时间只能执行一个任务。然而js确能够处理异步操作,这得益于其事件循环(EventLoop)机制。今天这篇文章带领大家深入理解JavaScript单线程特性,以及讲解事件循环和js多线程知识。一、背景:为什么JS是单线程?在最开始设计中,JS的主要用途是处理浏......
  • 10分钟巩固多线程基础
    10分钟巩固多线程基础前言多线程是并发编程的基础,本篇文章就来聊聊多线程我们先聊聊概念,比如进程与线程,串行、并行与并发再去聊聊线程的状态、优先级、同步、通信、终止等知识进程与线程什么是进程?操作系统将资源分配给进程,使用进程进行调度,但进程遇到阻塞任务时,为了提升CP......
  • Java内存分析工具实践之Spark客户端线程死锁
    ......
  • JDK 21新特性---虚拟线程
    虚拟线程是什么虚拟线程是与原来的平台线程类似的线程,它也是Java.Lang.Thread的一个实例,但它是由Jvm进行管理和调度的。与虚拟内存的实现方式类似,在Jvm中会存在一个Map来维护虚拟线程与实际系统线程的对应关系。当虚拟线程运行时,Jvm会把它分配到一个平台线程上,这个平台线程被......