Sha*_*ank 6 multithreading cpu-usage
如果每个新线程想要访问内存(在我的情况下特别是相同的数据库)并在其生命周期内执行读/写操作,那么线程是否会导致颠簸?
我认为这是真的.如果我的假设是正确的,那么最大化CPU利用率的最佳方法是什么?我如何确定某些特定数量的线程将提供良好的CPU利用率?
如果我的假设是错误的,请做适当的插图让我清楚地了解情景.
垃圾代码会导致垃圾。不是线程。所有代码都由某些线程运行,甚至是 main()。临时对象在任何线程上都以相同的方式进行垃圾收集。
微妙的部分是每个线程预加载自己的对象来执行工作,这可能会重复许多相同的类。为了获得并发的力量,通常需要做出一些小小的牺牲。但它不是垃圾(没有泄漏,没有变质)。
有一个例外:当某些第三方代码在线程局部变量中缓存材料时......您最终可能会在每个线程上缓存相同的内容。不是真正的泄漏,但效率不高。
线程数的经验法则?取决于任务。
如果任务是像数学一样的纯计算,那么您不应超过非超线程核心的数量。
如果作业是内存密集型以及纯计算工作(大多数情况),那么超线程核心的数量就是您的目标(因为 CPU 将使用内存访问的空闲时间进行另一个核心计算)。
如果作业主要是大型顺序磁盘 I/O,那么线程数不应高于可读取的磁盘轴数。这是非常近似的,因为磁盘缓存、DMA、SSD、raid 等完全影响磁盘层如何在不空闲的情况下为线程提供服务。当使用随机访问时,这也是有效的。然而,如今的虚拟化将使您所有的估计都落空。磁盘 I/O 的可用性可能比您想象的要高得多,但也可能比您想象的要差得多。
如果作业主要是网络 i/o 等待,那么它对你来说并没有真正的限制;我会从大约 3 倍的核心数量开始。该乘数只是假设此类线程在网络上等待 2/3 的时间。这在实践中是非常低的。可能 99% 的时间都在等待 nw i/o (100x)。这就是为什么你到处都能看到 NIO 套接字,用更少的繁忙线程来处理许多连接。
| 归档时间: |
|
| 查看次数: |
1021 次 |
| 最近记录: |