我在Linux中使用进程创建/调度。作为其中的一部分,我有许多并发线程从内存缓冲区中的共享计算基本哈希函数。每个线程都是使用clone创建的,我正在尝试,我正在玩各种标志,堆栈大小,测量进程创建时间等等(因此使用克隆)
我的实验是在启用了超线程的2核i7上运行的。
在这种情况下,我发现,在启用了所有标志(CLONE_VM,CLONE_SIGHAND,CLONE_FILES,CLONE_FS)的情况下,当我运行4个进程(每个逻辑cpu一个ak)时,计算n个哈希函数所需的时间会翻倍。运行2个进程。我的理解是超线程有助于进程等待IO时,因此对于CPU绑定进程,它几乎没有任何影响。它是否正确?
第二个观察结果是,在计算这些哈希函数时,我观察到相当高的方差(最多2秒)(我计算哈希值为1 000 000次)。他的系统上没有运行其他进程(尽管有一些后台线程)。我很难理解为什么这么多变化?是否严格地由于调度程序如何安排进程?我知道如果不使用sched_affinity,就不能保证它们会位于不同的cpu上,那么只能将它们放在同一个CPU上来解释它吗?
有没有其他方法可以保证在不依赖sched_affinity的情况下提高可靠性?
第三个观察结果是,即使我只使用2个线程运行(所以当每个线程都应该在差异CPU上进行调度时),我发现性能下降(不是很多,而是一点点)。我很难理解为什么会这样?它是相同的只读缓冲区,适合缓存。访问页表时是否存在争用?那么最好是创建两个具有不同地址空间的进程并明确地共享该段,将其标记为只读吗?
答案 0 :(得分:-1)
不同的线程仍然在一个进程的上下文中运行,因此它们应该在运行进程的同一个CPU上运行(通常一个进程在一个CPU上运行但不保证)。 当您运行两个线程而不是进程时,您需要切换线程的开销,您执行的计算越多,此切换需要完成的次数越多,因此它将比在一个线程中完成的计算速度慢。 此外,如果您在不同的进程中运行相同的计算,那么在进程之间切换会产生更大的开销,但是您有更多的机会在不同的CPU上运行,因此从长远来看,这可能会更快,而不是简短的计算。
即使您认为自己没有其他正在运行的进程,操作系统仍然需要做很多工作,并切换到您自己并不总是知道的进程。
所有这些都源于切换的随机性。希望我帮了一下。