gpt4 book ai didi

multithreading - 线程过多会导致颠簸吗?

转载 作者:行者123 更新时间:2023-12-04 15:21:02 24 4
gpt4 key购买 nike

如果每个新线程都想访问内存(在我的情况下特别是同一个数据库)并在其整个生命周期内执行读/写操作,那么线程是否会导致颠簸?

我认为这是真的。如果我的假设是正确的,那么最大化 CPU 利用率的最佳方法是什么?我如何确定某些特定数量的线程将提供良好的 CPU 利用率?

如果我的假设是错误的,请提供适当的插图,让我清楚地了解场景。

最佳答案

垃圾代码导致垃圾。不是线程。所有代码都由一些线程运行,甚至是 main()。临时对象在任何线程上都以相同的方式进行垃圾收集。

微妙的部分是当每个线程预加载自己的对象来执行工作时,这可能会复制许多相同的类。为了获得并发的力量,通常需要做出很小的牺牲。但它不是垃圾(没有泄漏,没有变质)。

有一个异常(exception):当某些 3rd 方代码在线程局部变量中缓存 Material 时……您最终可能会在每个线程上缓存相同的内容。不是真的泄漏,但效率不高。

线程数的经验法则?取决于任务。

如果任务是像数学这样的纯计算,那么您不应超过非超线程内核的数量。

如果作业是内存密集型以及纯计算工作(大多数情况下),那么超线程内核的数量就是您的目标(因为 CPU 会将内存访问的空闲时间用于另一个内核计算)。

如果作业主要是大型顺序磁盘 i/o,那么您的线程数不应超过可供读取的磁盘轴数。这是非常近似的,因为磁盘缓存、DMA、SSD、raid 等完全影响磁盘层如何在不空闲的情况下为您的线程提供服务。当使用随机访问时,这也是有效的。然而,如今的虚拟化会将您的所有估计都抛诸脑后。磁盘 i/o 可能比您想象的更可用,但也更糟。

如果作业主要是网络 i/o 等待,那么它实际上并不受您的限制;我会使用大约 3 倍的内核数量来启动。这个乘数只是假设这样的线程在网络上等待 2/3 的时间。这在实践中非常低。可能 99% 的时间都在等待 nw i/o (100x)。这就是为什么你到处都能看到 NIO 套接字,用较少的繁忙线程处理许多连接。

关于multithreading - 线程过多会导致颠簸吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31309485/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com