2

假设我有一台具有 12MB 缓存的 6 核机器。我将它用于具有几 GB 堆的服务器应用程序(其中大部分是 2 级 Hibernate 缓存)。

我注意到大多数时候我有少数线程主动服务客户端请求(燃烧 CPU 和与 DB 对话),以及大约 30-50 个线程只与客户端进行良好的同步网络 IO。

在学习 Java 内存模型时,我想知道这是否会影响性能。许多网络 IO 线程之一的上下文切换是否会破坏“活动”线程的线程/CPU 缓存?这种级别的并发本身是否有害(除了内存缓存)?

考虑到 CPU 缓存相对于整个应用程序内存有多小,这真的很重要吗?如何确定边界在哪里?

4

2 回答 2

3

许多网络 IO 线程之一的上下文切换是否会破坏“活动”线程的线程/CPU 缓存?

没有硬性保证,但我的直觉是,在实践中,CPU 缓存按数量级更新的频率比调度程序切换线程的频率高。如果是这种情况,那么与已经进行的缓存更新相比,线程上下文切换所需的缓存更新开销非常小。

如何确定边界在哪里?

通过实验和测量(分析),就像大多数与性能相关的问题一样。简单的理论近似是行不通的,因为现代 PC 中实际发生的事情比任何合理的近似都复杂。

于 2012-04-03T09:39:34.267 回答
2

当您的活动线程多于 cpu 时,将会产生影响,并且您会得到一些抖动。然而,抖动通常被认为是相对较小的 10 到 100 微秒。

您可以让线程竞争缓存资源,但除了减少每个线程使用的活动数据量外,您无能为力。这可以将您的 cpu 负载减少 2 倍或更多,但涉及大量工作,可能需要完全重写(包括一些 JDK 和第三方库),并且可能收效甚微。例如,您需要多少 CPU 负载才能降低。

于 2012-04-03T09:36:33.333 回答