Sunbet

Sunbet www.006yb.com是Sunbet申博公司指定亚洲官方直营现金网,官方授权,老品牌信誉有“『保』”障.Sunbet携手上海市申博机械科《技有限公司欢迎》您加入我们。

,

我相信大家都用过线程池,但是线程池数量设置为〖多〗少比较合理呢?

【线程数的设】置的最主要的目的是为了充分并合『理地使用』 CPU 和内存“等”『资源』,从而最大限度地提高程序的性能,因此让我们一起去探索吧!

首先要考虑到 CPU 『<{核心数}>』,那么在 Java “中”如何获取核心线程数?

可以使用 Runtime.getRuntime().availableProcessor() 【方法来获取】(可能不准确,作为参考)

在确认了『<{核心数}>』(后),再去判断是 CPU ‘密’集[型任务还是 IO ‘密’集[型任务:

  • CPU ‘密’集[型任务:‘比如’像加解密,压缩、「计算」“等”一系列需要大量耗费 CPU 『资源』的任务,大部分场景下都是纯 CPU 「计算」
  • IO ‘密’集[型任务:‘比如’像 MySQL 数据库、【文件的读】写、〖网络通信“等”任务〗,这类任务不会特别消耗 CPU 『资源』,但是 IO 操作比较耗时,会占用比较多时间

在知道如何判断任务的〖类别(后)〗,让我们分两个场景进行讨论:

CPU ‘密’集[型任务

(「对」于) CPU 〖‘密’集型「计算」〗,多线程本质上是提升多核 CPU 的【利用】率,“所以对”于一个 8 核的 CPU,每个核一个线程,理论上创建 8 个线程就可以了。

如果设置过多「的线程数」,实际上并不会起到很好《的效果》。此时假设我们设置「的线程数」量是 CPU 『<{核心数}>』的 2 倍,因为「计算」任务非常重, 会占用大量的[ CPU 『资源』,所以这时 CPU 的每个核心工作基本都是满负荷的,而我们又设置了过多的线程,每个线程都想去【利用】 CPU 『资源』来执行自己的任务,这就会造成不必要的上{下文切换},此时线程数的增多并没有让性能提升,反而由于线程数量过多会导致性能下降。

因此,(「对」于) CPU ‘密’集型的「计算」场景,理论上线程的数量 = CPU {核数}就是最合适的,不过通常把线程的数量设置为CPU {核数} +1,<会实>现最优的【利用】率。即使当‘密’集型的线程由于偶尔的内存页失效或其他原因导致阻塞时, 这个额外的线程[也能确“『保』” CPU 的时钟周期不会被浪费,从而“『保』”证 CPU 的【利用】率。

如下图就是在一个 8 核 CPU 的电脑上,通过修改线程数来测试对 CPU ‘密’集[型任务(素数「计算」)的性能影响。

可以看到线程数小于 8 时,《性》能是很差的,在线程数多于处理器『<{核心数}>』对性能的提升也很小,〖因此〗可以验证公式还是具有一定适用性的。

『除此之外』,我们最好还要同时考虑在同一台机器上还有哪些其他会占用过多 CPU 『资源』的程序在运行,然(后)对『资源』使用做整体的平衡。

IO ‘密’集[型任务

(「对」于) IO ‘密’集[型任务最大线程数一般会大于 CPU 『<{核心数}>』很多倍,因为 IO 读写速度相比于 CPU 的速度而言是比较慢的,「如果我们设置」过少「的线程数」,(就可能导致) CPU 『资源』的浪费。而如果我们设置更多「的线程数」,“那么当一部分线程正在”“等”待 IO 的时候,它们此时并不需要 CPU 来「计算」,那么另外的线程便可以【利用】 CPU 去执行其他的任务,互不影响,这样的话在任务队列“中”“等”待的任务就会减少,可以更好地【利用】『资源』。

(「对」于) IO 〖‘密’集型「计算」〗场景,最佳「的线程数」是与程序“中” CPU 「计算」和 IO 〖操作的耗时比〗(相关的),《Java并发编程实战》的作者 Brain Goetz 推荐的「计算」方法如下:

线程数 = CPU 『<{核心数}>』 * (1 + IO 耗时/ CPU 耗时)

(通过这个公式),我们可以「计算」出一个合理「的线程数」量,「如果任」务的平均“等”待时间长,线程数就随之增加,而如果平均工作时间长,也就是(「对」于)我们上面的 CPU ‘密’集[型任务,《线程数就随之减》少。可以采用 APM 《“工具统计”》到每个方法的耗时,便于「计算」 IO 耗时和 CPU 耗时。

在这里引用Java并发编程实战“中”的图,方便大家更容易理解:

还有一派的「计算」方式是《Java〖虚〗拟机并发编程》“中”提出的:

线程数 = CPU 『<{核心数}>』 / (1 - 阻塞系数)

其“中”「计算」‘密’集型阻塞系数为 0,IO 「‘密’集型阻塞系」数接近 1,一般认为在 0.8 ~ 0.9 「之间」。‘比如’ 8 核 CPU,按照公式就是 2 / ( 1 - 0.9 ) = 20 (个线程数)

上图是 IO ‘密’集[型任务的一个测试,是在双核处理器上开不(同的线程)数(从 1 到 40)来测试对程序性能的影响,【可以看到线程池】数量达到 20 之(后),<曲线逐>渐水平,{说明}开再多的线程对程序的性能提升也毫无帮助。

太少「的线程数」会使得程序整体性能降低,而过多的线程也会消耗内存“等”其他『资源』,所以如果想要更准确的话,可以进行压测,监控 JVM 的线程情况以及 CPU 的负载情况,「根据」实际情况衡量应该创建「的线程数」,合理并充分【利用】『资源』。

同时,有很多线程池的应用,‘比如’ Tomcat、Redis、Jdbc “等”,每个应用设置「的线程数」也是不同的,‘比如’ Tomcat 为流量入口,那么线程数的设置可能就要比其他应用要大。

总结

<通过对线程数设置的探>究,我们可以得知线程数的设置首先和 CPU 『<{核心数}>』『有莫大关』联,『除此之外』,《我们需要根据任务类型》《的不同选择对》应的策略,线程的平均工作时间所占比例越高,就需要越少的线程;线程的平均“等”待时间所占比例越高,〖就需要越多的线〗程;针对不同的程序,进行对应的实际测试就可以得到最合适的选择。

参考

《Java并发编程实战》

《Java〖虚〗拟机并发编程》

Java并发编程实战

Java< 并发编程核心[>

Allbet欧博官网声明:该文看法仅代表作者自己,与本平台无关。转载请注明:(赣州)seo:线程数,‘射多少’更舒适?
评论关闭

分享到:

超显腿长的平底鞋,巴黎世家这双平底鞋超显腿长,是深夜灰色哟,不是玄色哈,唯一瑕玷就是鞋头太尖太长了,后面的带子时而不跟脚,然则悦目的鞋子