最近我尝试了很多应用程序评测(使用Visual Studio性能向导)。在使用并发指示器时,我注意到当应用程序以多个线程(包括后台和前台)运行时,跨核心上下文切换率非常高。
我知道,通常情况下,大量的跨核心上下文切换可能会损害应用程序的性能,因此我希望将其减少到最低限度。
在.NET应用程序中,除了最小化并发运行的线程数量之外,还有什么可能的方法可以做到这一点呢?
发布于 2010-07-28 23:40:00
您可以将这些线程中的一些线程关联到单个核心。但是你必须使用be extremely careful when doing so --因为这实际上可能会降低性能,因为它会阻止CLR/OS将线程调度到可用的核心。
为此,可以使用BeginThreadAffinity方法强制线程保持固定到特定处理器或内核的标识。
发布于 2013-06-26 04:55:42
实际上,跨核心上下文切换不太可能损害应用程序性能。
任何上下文切换都会产生大约1-4微秒的直接成本来保存/恢复线程状态,外加缓存预热的间接成本。间接成本取决于许多因素,例如数据局部性和访问模式,并且变化很大:从数百纳秒到数百微秒,总成本增加了两个数量级。
尽管预期跨内核上下文切换的缓存预热时间会更长(如果新内核不与旧内核共享缓存),但将线程调度到同一内核仍然需要缓存预热,因为线程的部分或全部数据将被中间在该内核上执行的其他线程从缓存中逐出。
在任何情况下,与大约30-120毫秒的线程执行量(上下文切换之间的时间)相比,上下文切换的总成本仍然是不可察觉的。
只有在病态情况下,即当线程使用完全适合非共享缓存的相同数据集长时间工作时,跨核上下文切换才会对性能产生明显影响。大多数时候,它们不会成为瓶颈。
顺便说一句,与LBushkin的建议相反,BeginThreadAffinity不会在处理器亲和性方面帮助您:它只将.NET线程固定到特定的OS线程,而不是将固定到特定的内核。
有用的链接:
1
2
3
https://stackoverflow.com/questions/3354514
复制相似问题