io密集服务器cpu性能,线程池中CPU密集型和IO密集型选择
cpu密集型:cpu使用率较高(也就是一些复杂运算,逻辑处理),所以线程数一般只需要cpu核数的线程就可以了。这一类型的在开发中多出现的一些业务复杂计算和逻辑处理过程中。
IO密集型:cpu使用率较低,程序中会存在大量IO操作占据时间,导致线程空余出来,所以通常就需要cpu核心的两倍的线程,当线程进行I/O操作空暇时启用其他线程继承使用cpu,提高使用率通过上述可以总结出:
最佳线上数目 = ((线程等待时间 + 线程CPU时间 )/线程CPU时间) * CPU数目,线程等待时间所占比例越高,需要越多线程。
线程CPU时间所占比例越高,需要越少线程。
接下来我们进行一一分析:
1:高并发、任务执行时间短的业务,线程池线程数可以设置为CPU核数+1,减少线程上下文的切换
2:并发不高、任务执行时间长的业务这就需要区分开看了:
a)假如是业务时间长集中在IO操作上,也就是IO密集型的任务,因为IO操作并不占用CPU,所以不要让所有的CPU闲下来,可以适当加大线程池中的线程数目,让CPU处理更多的业务
b)假如是业务时间长集中在计算操作上,也就是计算密集型任务,这个就没办法了,和(1)一样吧,线程池中的线程数设置得少一些,减少线程上下文的切换
(其实从一二可以看出无论并发高不高,对于业务中是否是cpu密集还是I/O密集的判断都是需要的当前前提是你需要优化性能的前提下)
3:并发高、业务执行时间长,解决这种类型任务的关键不在于线程池而在于整体架构的设计,
a.看看这些业务里面某些数据是否能做缓存是第一步
b.增加服务器是第二步,至于线程池的设置,设置参考 2 。最后,业务执行时间长的问题,也可能需要分析一下,看看能不能使用中间件(任务时间过长的可以考虑拆分逻辑放入队列等操作)对任务进行拆分和解耦。
服务端优化中的并发处理需要使用多线程
线程任务分两种:
1 计算(CPU)密集型,举例:计算圆周率、视频高清解码等
特点:占用cpu资源,线程切换无开销
公式: 线程数 = CPU核数+1
2 IO密集型
举例:开发大部分都是WEB应用,涉及到大量的网络传输,不仅如此,与数据库,与缓存间的交互也涉及到IO,一旦发生IO,线程就会处于等待状态,当IO结束,数据准备好后,线程才会继续执行。因此对于IO密集型的应用,我们可以多设置一些线程池中线程的数量,这样就能让在等待IO的这段时间内,线程可以去做其它事,提高并发处理效率。
特点:cpu消耗较少,线程切换有开销
公式:线程数 = CPU核心数/(1-阻塞系数)
这个阻塞系数一般为0.8~0.9之间,也可以取0.8或者0.9。套用公式,对于双核CPU来说,它比较理想的线程数就是20,当然这都不是绝对的,需要根据实际情况以及实际业务来调整。
Python的多线程在多核CPU上,只对于IO密集型计算产生正面效果;而当有至少有一个CPU密集型线程存在,那么多线程效率会由于GIL而大幅下降。
IO是指阻塞,比如:服务器的accept,python 中的input,或者端口占用
GIL是全局排它锁,如果多线程任务是IO密集型,就会直接释放GIL,解除阻塞,提高了性能,如果多线程任务是CPU密集型,因为一个进程只有一个GIL,多个线程共享这一个GIL,所以一个线程释放了GIL,另一个就会唤醒,而释放GIL的线程就会等待下一次被唤醒,导致效率不会提高,不过可以使用多进程解决。
总之:IO密集型使用多线程,CPU密集型使用多进程
io密集服务器cpu性能,线程池中CPU密集型和IO密集型选择相关推荐
- 线程及同步的性能 – 线程池/ ThreadPoolExecutors/ ForkJoinPool
线程池和ThreadPoolExecutors 虽然在程序中可以直接使用Thread类型来进行线程操作,但是更多的情况是使用线程池,尤其是在Java EE应用服务器中,一般会使用若干个线程池来处理来自 ...
- 游戏服务器内三类线程池的划分与使用
在游戏服务器开发中,对于服务器的性能要求特别高,主要的指标就是整个系统的吞吐量,就是平时所说的QPS.目前使用的服务器都是多核的,想要提升系统的QPS,就需要使用到多线程,但是线程资源对于服务器来说非 ...
- Java 确定线程池中工作线程数的大小
以问答形式展开,会更有针对性: 1.工作线程是不是越多越好? 不是.a.服务器cpu核数有限,所以同时并发或者并行的线程数是有限的,所以1核cpu设置1000个线程是没有意义的. b.线程切换也是有开 ...
- 线程池中各个参数如何合理设置
欢迎大家关注我的公众号[老周聊架构],Java后端主流技术栈的原理.源码分析.架构以及各种互联网高并发.高性能.高可用的解决方案. 一.前言 在开发过程中,好多场景要用到线程池.每次都是自己根据业务场 ...
- 进程池和线程池,协程,IO多路复用
进程池.线程池: 开进程池和线程池都是要消耗资源的,只不过比较而言消耗的资源进程池多一点,线程池少一点 就是在计算机硬件能承受的最大范围内去利用计算机. 什么是池? 就是在保证计算机硬件安全的情况最大 ...
- juc线程池原理(六):jdk线程池中的设计模式
一.jdk中默认线程池中的代理模式 单例类线程池只有一个线程,无边界队列,适合cpu密集的运算.jdk中创建线程池是通过Executors类中提供的静态的方法来创建的,其中的单例类线程池的方法如下: ...
- [.Net线程处理系列]专题二:线程池中的工作者线程
目录: 一.上节补充 二.CLR线程池基础 三.通过线程池的工作者线程实现异步 四.使用委托实现异步 五.任务 六.小结 一.上节补充 对于Thread类还有几个常用方法需要说明的. 1.1 Susp ...
- 线程池中阻塞队列的作用?为什么是先添加列队而不是先创建最大线程?线程池中线程复用原理
1.一般的队列只能保证作为一个有限长度的缓冲区,如果超出了缓冲长度,就无法保留当前的任务了,阻塞队列通过阻塞可以保留住当前想要继续入队的任务.阻塞队列可以保证任务队列中没有任务时阻塞获取任务的线程,使 ...
- Java并发编程之线程池中的Future
线程池中的Future: 线程池的典型使用场景 ExecutorService executorService = Executors.newFixedThreadPool(10);//此处Task为 ...
最新文章
- javascript的正则表达式
- 无招胜有招之Java进阶JVM(三)内存模型
- 使用 InSpec 实现符合性即代码
- 微信小程序知识点GET
- 尤其适合程序员使用的TextMate for Mac
- 中国宽带最新速率状况报告 你家达标了吗?
- 什么是java虚拟机?
- 王道机试指南读后总结-1
- hmaster和datanaode启动后很快停止_室内消火栓系统消防泵启动方法
- Spring MVC 3.0 深入
- RACCommand
- 扩展欧几里得算法(求逆元)总结
- Kali Linux信息收集工具
- JavaScript 全栈工程师培训教程 - 阮一峰
- 华为nova8pro和荣耀60pro哪个好
- 前领导想挖我去新公司,有坑吗?
- 面试经历深信服面试问题
- C#窗体猜数字小游戏AB
- Apache Impala: Impala的java开发
- Bakkt能否开启下一轮牛市?这篇「Bakkt专访」一窥究竟
热门文章
- 执行脚本,无故多出来两个进程号
- 交换机设置trunk端口报错:Command rejected: An interface whose trunk encapsulation is “Auto“
- python保存plot图片_Matplotlib savefig只保存图像,不保存行
- android通知栏屏蔽访客模式
- 客户端评论盖楼(内涵段子评论盖楼)实现思路
- java求第k个斐波那契数_Java程序查找第n个斐波那契数
- ker矩阵是什么意思_变换矩阵与投影
- 有关人工智能的硕士点整理
- 移动后端即服务(BaaS)市场现状及未来发展趋势
- 笑话集网站最近更新网站内容采集