【发布时间】:2010-08-15 22:58:53
【问题描述】:
我最近对 .NET 4 垃圾收集器进行了基准测试,从多个线程集中分配。当分配的值被记录在一个数组中时,我观察到没有像我预期的那样可伸缩性(因为系统争用对共享老年代的同步访问)。但是,当分配的值立即被丢弃时,我惊恐地发现当时也没有可伸缩性!
我曾预计临时案例几乎可以线性扩展,因为每个线程都应该简单地将nursery gen0 清理干净并重新开始,而不会争夺任何共享资源(没有任何东西可以保留给老一代,也没有 L2 缓存未命中,因为 gen0 很容易适合 L1 缓存)。
无同步分配在多处理器系统上,托管堆的第 0 代被分成多个内存区域,每个线程使用一个区域。这允许多个线程同时进行分配,因此不需要对堆的独占访问。
谁能验证我的发现和/或解释我的预测和观察之间的差异?
【问题讨论】:
-
定义“无可扩展性”的含义。
-
您最好发布您的确切方法、测量的内容、测量方式和测量值。
-
我在这里猜测,但我可能 Jon Harrop 正在 N 核计算机上运行他的测试,并使用 n = 1 到 N 个线程进行基准测试。缩放就是基准速度如何随 n 变化。
-
@Martin:没错。随着分配线程数的增加,总分配率是恒定的。
-
你确定每个线程都在自己的核心上吗?
标签: c# f# garbage-collection multicore