假设我有一台带有12MB缓存的6核机器。我将它用于具有几千兆字节堆的服务器应用程序(大部分是二级Hibernate缓存)。
我注意到,大部分时间我都有一些主动服务客户端请求(烧录CPU并与DB通信)的少数线程,以及大约30-50个仅与客户端进行良好同步网络IO的线程。
在我学习Java内存模型时,我想知道这是否会影响性能。许多网络IO线程之一的上下文切换是否会破坏“活动”线程的线程/ CPU缓存?这种并发级别本身是否有害(内存缓存除外)?
考虑到CPU缓存相对于整个应用程序内存的小小,这真的很重要吗?如何确定边界的位置?
答案 0 :(得分:3)
许多网络IO线程之一的上下文切换会破坏“活动”线程的线程/ CPU缓存吗?
没有硬保证,但我的直觉是,在实践中,CPU缓存比调度程序切换线程更频繁地按顺序更新。如果是这种情况,那么与已经发生的缓存更新相比,线程上下文切换所需的缓存更新是非常小的开销。
如何确定边界的位置?
通过实验和测量(分析),与大多数与性能相关的问题一样。简单的理论近似是行不通的,因为现代PC中真正正在发生的现实比任何合理的近似更复杂。
答案 1 :(得分:2)
当你有比cpus更多的活动线程时,会产生一些影响。但是,抖动通常被认为是相对较小的10到100微秒。
您可以让线程竞争缓存资源,但除了减少每个线程使用的活动数据量之外,您无法做很多事情。这可以将你的CPU负载减少2倍或更多,但涉及很多工作,可能是一个完整的重写(包括一些JDK和第三方库),它可能没什么好处。例如你需要多少CPU负载才能降低。