根据CPU核心数确定线程池并发线程数

摘要:
目录1.抛出问题2.分析3.实际应用4.总结:回到正文顶部1.抛出关于如何计算并发线程数的问题。通常有两所学校。它们来自两本书,都是好书。哪一个是正确的?跟踪问题后,总结如下:第一个流派:Java并发实践,即Java并发编程实践,如下图所示:如上图所示,在Java并发实践中给出了估计线程池大小的公式:Nthreads=Ncpu*Ucp

正文

一、抛出问题

关于如何计算并发线程数,一般分两派,来自两本书,且都是好书,到底哪个是对的?问题追踪后,整理如下:

第一派:《Java Concurrency in Practice》即《java并发编程实践》,如下图:

根据CPU核心数确定线程池并发线程数第1张

如上图,在《Java Concurrency in Practice》一书中,给出了估算线程池大小的公式:

Nthreads=Ncpu*Ucpu*(1+w/c),其中

Ncpu=CPU核心数

Ucpu=cpu使用率,0~1

W/C=等待时间与计算时间的比率

第二派:《Programming Concurrency on the JVM Mastering》即《Java 虚拟机并发编程》

根据CPU核心数确定线程池并发线程数第2张

线程数=Ncpu/(1-阻塞系数)

二、分析

对于派系一,假设cpu100%运转,即撇开CPU使用率这个因素,线程数=Ncpu*(1+w/c)。

现在假设将派系二的公式等于派系一公式,即Ncpu/(1-阻塞系数)=Ncpu*(1+w/c),===》阻塞系数=w/(w+c),即阻塞系数=阻塞时间/(阻塞时间+计算时间),这个结论在派系二后续中得到应征,如下图:

根据CPU核心数确定线程池并发线程数第3张

由此可见,派系一和派系二其实是一个公式......这样我就放心了......

三、实际应用

那么实际使用中并发线程数如何设置呢?分析如下(我们以派系一公式为例):

Nthreads=Ncpu*(1+w/c)

IO密集型:一般情况下,如果存在IO,那么肯定w/c>1(阻塞耗时一般都是计算耗时的很多倍),但是需要考虑系统内存有限(每开启一个线程都需要内存空间),这里需要上服务器测试具体多少个线程数适合(CPU占比、线程数、总耗时、内存消耗)。如果不想去测试,保守点取1即,Nthreads=Ncpu*(1+1)=2Ncpu。这样设置一般都OK。

计算密集型:假设没有等待w=0,则W/C=0. Nthreads=Ncpu。

至此结论就是:

IO密集型=2Ncpu(可以测试后自己控制大小,2Ncpu一般没问题)(常出现于线程中:数据库数据交互、文件上传下载、网络数据传输等等)

计算密集型=Ncpu(常出现于线程中:复杂算法)

java中:Ncpu=Runtime.getRuntime().availableProcessors()

=========================此处可略过=============================================

当然派系一种《Java Concurrency in Practice》还有一种说法,

根据CPU核心数确定线程池并发线程数第4张

即对于计算密集型的任务,在拥有N个处理器的系统上,当线程池的大小为N+1时,通常能实现最优的效率。(即使当计算密集型的线程偶尔由于缺失故障或者其他原因而暂停时,这个额外的线程也能确保CPU的时钟周期不会被浪费。)

即,计算密集型=Ncpu+1,但是这种做法导致的多一个cpu上下文切换是否值得,这里不考虑。读者可自己考量。

======================================================================

四、总结

选择线程池并发线程数的因素很多:任务类型、内存等线程中使用到所有资源都需要考虑。本文经过对现有文献的分析论证,得出结论,并给出了实际应用公式,实乃工程师之福利,技术之典范......

原文地址:https://www.cnblogs.com/dennyzhangdd/p/6909771.html?utm_source=itdadao&utm_medium=referral

免责声明:文章转载自《根据CPU核心数确定线程池并发线程数》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Delphi中的Sender:TObject对象解析通过案例理解position:relative和position:absolute下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

IIS应用程序池配置详解及优化

参数说明 1.常规 属性名称 属性详解 NET CLR 版本 配置应用程序池,以加载特定版本的 .NET CLR。选定的 CLR版本应与应用程序所使用的相应版本的 .NET Framework 对应。选择“无托管代码”将导致所有的 ASP.NET 请求失败。 队列长度 HTTP.sys 将针对应用程序池排队的最大请求数。如果队列已满,新请...

linux性能评估-磁盘io概念实战篇

1.文件系统和磁盘的 IO 问题的分析(如何找出狂打日志的“内鬼”?) 2.磁盘IO延迟很高,该怎么办? 3.当数据库出现性能问题时,该如何分析和定位它的瓶颈呢? 4.Redis响应严重延迟,该如何分析和定位? 1.文件系统和磁盘的 IO 问题的分析(如何找出狂打日志的“内鬼”?) 预先安装 docker、sysstat 等工具,如 apt ins...

Http协议、线程、线程池

Socket模拟服务端运行代码: 1:启动服务端监听的服务,并接受客户端的连接    1.1 创建Socket    Socket listenSocket=new Socket(AddressFamily.InterNetwork, SocketType.Stream,ProtocolType.Tcp);    1.2绑定端口和ip地址    IPA...

sql server中的工作线程

/*在SQL SERVER 2005 及以后版本中, 使用'MAXworker thread' 来配置可用的线程数,默认设置为0 ,即自动控制线程数计算最大工作线程数:对于32 位系统:逻辑CPU数<= 4 时:max worker threads = 256逻辑CPU数> 4 时: max worker threads = 256 + (lo...

linux rhel unix centos FreeBSD 常用命令

一:使用CentOS常用命令查看cpu more /proc/cpuinfo | grep "model name" grep "model name" /proc/cpuinfo [root@localhost /]# grep "CPU" /proc/cpuinfo model name : Intel(R) Pentium...

解读nginx配置

nginx配置指令   main配置段常见的配置指令   分类:     正常运行必备的配置     优化性能相关的配置     用于调试及定位问题相关的配置     事件驱动相关的配置   正常运行必备的配置    1、user     Syntax:user user [group]:运行nginx所使用的用户     Default:user n...