首页 > 其他分享 >关于适配服务器创建多线程任务的一些见解

关于适配服务器创建多线程任务的一些见解

时间:2023-02-13 13:46:33浏览次数:40  
标签:适配 任务 密集型 内存 服务器 线程 多线程 CPU

1、首先理解I/O密集和CPU密集

CPU密集型

CPU密集型,也叫计算密集型,一般是指服务器的硬盘、内存硬件性能相对CPU好很多,或者使用率低很多。系统运行CPU读写I/O(硬盘/内存)时可以在很短的时间内完成,几乎没有阻塞(等待I/O的实时间)时间,而CPU一直有大量运算要处理,因此CPU负载长期过高。

CPU密集几乎无I/O阻塞,CPU一直会全速运行。如果是单核情况下,开多线程是没有意义的,说白了就是一个CPU来回切着运行而已,徒增线程切换的资源消耗,卵用没有。可见,CPU密集任务只有在多核CPU上、开多线程才可能提速。

CPU使用率较高时,通常线程数只需要设置为CPU核心数的线程个数就可以了。单CPU对应单线程效率最高。

一般其计算公式可遵循:CPU密集型核心线程数 = CPU核数。

I/O密集型

I/O密集型相反,一般是指服务器CPU的性能相对硬盘、内存硬件好很多,或者使用率低很多。系统运行多是CPU在等I/O (硬盘/内存) 的读写操作,此类情景下CPU负载并不高。

I/O密集型的程序一般在达到性能极限时,CPU占用率仍然较低。这可能是因为任务本身需要大量I/O操作,而程序的逻辑做得并不好,没有充分利用CPU能力,导致线程空余时间很多。通常我们会开CPU核心数数倍的线程,在线程进行 I/O 操作 CPU 空闲时,启用其他线程继续使用 CPU,以提高 CPU 的使用率,充分利用CPU资源。

一般其计算公式可遵循:I/O密集型核心线程数 = CPU核数 / (1-阻塞系数)

阻塞系数在在0到1范围内。一般为0.8~0.9之间,也可以取0.8或者0.9。对于双核CPU来说,它比较理想的线程数就是20,当然这都不是绝对的,需要根据实际情况以及实际业务来调整。

得出结论:

I/O密集型:当线程等待时间所占比例越高,需要越多线程,启用其他线程继续使用CPU,以此提高CPU的利用率;
CPU密集型:当线程CPU时间所占比例越高,需要越少的线程。任务越多,花在进程、线程切换的时间就越多,通常线程数和CPU核数一致即可,这一类型在开发中主要出现在一些计算业务频繁的逻辑中。
I/O密集型任务的特点是CPU消耗很少,任务的大部分时间都在等待I/O操作完成(磁盘I/O远低于内存、CPU速度)。涉及到网络、磁盘I/O的任务多是I/O密集型任务。I/O密集型任务,线程数越多,CPU效率越高,但也有相对限度。

2、了解两种多线程任务

   1):ForkJoinPool线程池最大的特点就是分叉(fork)合并(join),将一个大任务拆分成多个小任务,并行执行,再结合工作窃取模式(worksteal)提高整体的执行效率,充分利用CPU资源,参考          parallelStream与CompletableFuture。

   2):ThreadPoolExecutor中的线程无法选择优先执行子任务,要完成各自任务时,就需要创建多少个线程;参考多线程普通创建方法

 

标签:适配,任务,密集型,内存,服务器,线程,多线程,CPU
From: https://www.cnblogs.com/innocenter/p/17116056.html

相关文章

  • 国内免备案服务器是怎么来的呢?
        建过网站的朋友一定知道,使用国内服务器建站是需要备案域名的,因为无论是在大陆的服务器是什么端口,什么协议,都必须受到国家的监控。如果没有备案,在大陆是不能进......
  • 云服务器搭建
    ​ 首先申请一个云服务器,连接放在下方 安装ubantu16.04系统之后,用xshell登录​编辑 启动nginxservicenginxstart用命令vi/etc/nginx/nginx.confnginx做一个......
  • 在AWS云服务器里用lambda操作rds的mysql数据库
    yuminstall-ymysql  #在EC2的服务器里安装mysql主要是在服务器里做连接mysql用(mysql -hrds-instance-endpoint -uadmin-P3306-p12345678)pip3install--......
  • 天翼云服务器购买之后如何使用?
    第一步:查看机房点击下面的链接,在浏览器里打开,然后点击【详情】,查看机房是哪里的https://www.ctyun.cn/h5/bcc/order如上图所示,通过查询,可以看到机房是【陕西-西安3】......
  • MAC 安装docker,下载镜像并压缩转移到LINUX服务器
    MAC安装docker前提-已经安装homebrew(如果未安装,可以打开终端,输入以下命令安装Homebrew)/usr/bin/ruby-e"$(curl-fsSLhttps://raw.githubusercontent.com/Homebrew/i......
  • 学习笔记jira项目20-服务器错误
     ......
  • office 365 白p指南KMS本地服务器部署详细步骤
    免费激活officeofficehttps://help.coolhub.top/zh-cn/activate/activate-steps.html#密钥激活-联网激活零售(Retail)许可证零售许可证只能使用密钥激活,对于Microsoft......
  • 多线程2(设置线程名,同步代码块:给线程加锁)
    继承,不能继承父类的构造方法,如果想要使用,需要重写构造器,然后调用super关键字,就可使用父类的构造方法了(setName方法)给线程设置名字,1用setName方法,2构造器方法   同......
  • JAVA多线程(一)--实现/创建方式
    JAVA多线程(一)--实现/创建方式一、继承Thread类Thread类本质上是一个实现了Runnable接口的实例,代表一个线程的实例。启动线程的唯一方法是调用Thread类的start()方法,sta......
  • SpringBoot实现多线程
    多线程方式一:实现AsyncConfigurer接口配置类实现接口AsyncConfigurer,返回一个ThreadPoolTaskExecutor线程池对象。@Configuration@EnableAsyncpublicclassAsyncCon......