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密集型选择相关推荐

  1. 线程及同步的性能 – 线程池/ ThreadPoolExecutors/ ForkJoinPool

    线程池和ThreadPoolExecutors 虽然在程序中可以直接使用Thread类型来进行线程操作,但是更多的情况是使用线程池,尤其是在Java EE应用服务器中,一般会使用若干个线程池来处理来自 ...

  2. 游戏服务器内三类线程池的划分与使用

    在游戏服务器开发中,对于服务器的性能要求特别高,主要的指标就是整个系统的吞吐量,就是平时所说的QPS.目前使用的服务器都是多核的,想要提升系统的QPS,就需要使用到多线程,但是线程资源对于服务器来说非 ...

  3. Java 确定线程池中工作线程数的大小

    以问答形式展开,会更有针对性: 1.工作线程是不是越多越好? 不是.a.服务器cpu核数有限,所以同时并发或者并行的线程数是有限的,所以1核cpu设置1000个线程是没有意义的. b.线程切换也是有开 ...

  4. 线程池中各个参数如何合理设置

    欢迎大家关注我的公众号[老周聊架构],Java后端主流技术栈的原理.源码分析.架构以及各种互联网高并发.高性能.高可用的解决方案. 一.前言 在开发过程中,好多场景要用到线程池.每次都是自己根据业务场 ...

  5. 进程池和线程池,协程,IO多路复用

    进程池.线程池: 开进程池和线程池都是要消耗资源的,只不过比较而言消耗的资源进程池多一点,线程池少一点 就是在计算机硬件能承受的最大范围内去利用计算机. 什么是池? 就是在保证计算机硬件安全的情况最大 ...

  6. juc线程池原理(六):jdk线程池中的设计模式

    一.jdk中默认线程池中的代理模式 单例类线程池只有一个线程,无边界队列,适合cpu密集的运算.jdk中创建线程池是通过Executors类中提供的静态的方法来创建的,其中的单例类线程池的方法如下: ...

  7. [.Net线程处理系列]专题二:线程池中的工作者线程

    目录: 一.上节补充 二.CLR线程池基础 三.通过线程池的工作者线程实现异步 四.使用委托实现异步 五.任务 六.小结 一.上节补充 对于Thread类还有几个常用方法需要说明的. 1.1 Susp ...

  8. 线程池中阻塞队列的作用?为什么是先添加列队而不是先创建最大线程?线程池中线程复用原理

    1.一般的队列只能保证作为一个有限长度的缓冲区,如果超出了缓冲长度,就无法保留当前的任务了,阻塞队列通过阻塞可以保留住当前想要继续入队的任务.阻塞队列可以保证任务队列中没有任务时阻塞获取任务的线程,使 ...

  9. Java并发编程之线程池中的Future

    线程池中的Future: 线程池的典型使用场景 ExecutorService executorService = Executors.newFixedThreadPool(10);//此处Task为 ...

最新文章

  1. javascript的正则表达式
  2. 无招胜有招之Java进阶JVM(三)内存模型
  3. 使用 InSpec 实现符合性即代码
  4. 微信小程序知识点GET
  5. 尤其适合程序员使用的TextMate for Mac
  6. 中国宽带最新速率状况报告 你家达标了吗?
  7. 什么是java虚拟机?
  8. 王道机试指南读后总结-1
  9. hmaster和datanaode启动后很快停止_室内消火栓系统消防泵启动方法
  10. Spring MVC 3.0 深入
  11. RACCommand
  12. 扩展欧几里得算法(求逆元)总结
  13. Kali Linux信息收集工具
  14. JavaScript 全栈工程师培训教程 - 阮一峰
  15. 华为nova8pro和荣耀60pro哪个好
  16. 前领导想挖我去新公司,有坑吗?
  17. 面试经历深信服面试问题
  18. C#窗体猜数字小游戏AB
  19. Apache Impala: Impala的java开发
  20. Bakkt能否开启下一轮牛市?这篇「Bakkt专访」一窥究竟

热门文章

  1. 执行脚本,无故多出来两个进程号
  2. 交换机设置trunk端口报错:Command rejected: An interface whose trunk encapsulation is “Auto“
  3. python保存plot图片_Matplotlib savefig只保存图像,不保存行
  4. android通知栏屏蔽访客模式
  5. 客户端评论盖楼(内涵段子评论盖楼)实现思路
  6. java求第k个斐波那契数_Java程序查找第n个斐波那契数
  7. ker矩阵是什么意思_变换矩阵与投影
  8. 有关人工智能的硕士点整理
  9. 移动后端即服务(BaaS)市场现状及未来发展趋势
  10. 笑话集网站最近更新网站内容采集