![启动多个实例和性能](https://linux22.com/image/1589772/%E5%90%AF%E5%8A%A8%E5%A4%9A%E4%B8%AA%E5%AE%9E%E4%BE%8B%E5%92%8C%E6%80%A7%E8%83%BD.png)
我正在做一些基准测试,我使用“truebench”。这是一个简单的 C 程序,只需多次执行 memset 和 memcpy。在我的笔记本电脑上,当我只启动一个实例时,我获得 62 秒,但当我启动 4 次(这样 4 个进程同时运行:全部在后台运行)时,我为每个实例获得 303 秒。我的笔记本电脑有 8 个核心,我没想到在 4 个实例的情况下会花费这么多时间,我预计会获得类似的性能。你知道为什么会有这样的差异吗?谢谢你的帮助。LMM。
答案1
尽管您拥有大量的核心,但它们无法完全并行工作,因为计算机的其他元素没有重复。
以 RAM 内存为例:如果您有 N 根双通道 RAM,则只能并行进行 2xN 次访问。如果 RAM 是单通道的,则该数字会降至 N 次访问。
另一方面,操作系统不会对请求的内存分配位置进行优化,也不会尝试在所有 RAM 棒之间均匀分配内存分配。因此,如果所有分配都在同一单通道 RAM 棒上进行,则每次只能进行一次访问,并且所有进程实际上都是串行的。
CPU 缓存的情况也一样,情况更糟,因为它比 RAM 小得多,所以一个进程会交换其他进程的数据,从而导致争用。(我在这里略过了 CPU 缓存的 I 级和 II 级之间的差异。)
您没有提供您尝试分配的内存总量的信息。如果该总量超过了可用 RAM 量,则您将在方程式中添加来回磁盘交换,这将严重影响性能。
答案2
CPU 使用缓存来加速内存访问。您的基准测试程序可能会随机访问内存(或分配更多内存),因此 CPU 会不断等待内存提取。似乎一个正在运行的实例已经饱和了可用的 RAM 带宽,因此四个实例只会引起更多争用。