c - 内存共享 C - 性能

标签 c linux cpu scheduling

我正在 Linux 中尝试进程创建/调度。作为其中的一部分,我有许多并发线程从共享内存缓冲区中计算基本哈希函数。每个线程都是使用克隆创建的,我正在尝试并使用各种标志、堆栈大小、来测量进程创建时间等。(因此使用克隆)

我的实验是在启用了超线程的 2 核 i7 上运行的。

在这种情况下,我发现,在启用所有标志(CLONE_VM、CLONE_SIGHAND、CLONE_FILES、CLONE_FS)的情况下,当我运行 4 个进程(即每个逻辑 CPU 一个)时,计算 n 个哈希函数所需的时间会加倍。运行2个进程。我的理解是,当进程等待 IO 时,超线程会有所帮助,因此对于 CPU 密集型进程来说,它几乎没有效果。它是否正确?

第二个观察结果是,在计算这些哈希函数(我计算哈希值 1 000 000 次)时,我观察到相当高的方差(最多 2 秒)。系统上没有其他进程正在运行(尽管有一些后台线程)。我很难理解为什么差异如此之大?这是否严格取决于调度程序如何安排进程?据我所知,如果不使用 sched_affinity,就不能保证它们将位于不同的 cpu 上,所以这可以通过将它们放置在同一 CPU 上来解释吗?

是否有其他方法可以在不依赖 sched_affinity 的情况下保证更高的可靠性?

第三个观察结果是,即使我只运行 2 个线程(因此每个线程都应该在 diff CPU 上调度),我发现性能会下降(不是很多,而是一点点)。我很难理解为什么会这样?它是相同的只读缓冲区,并且适合缓存。访问页表时是否存在争用?那么是否最好创建两个具有不同地址空间的进程并显式共享该段,将其标记为只读?

最佳答案

不同的线程仍然在一个进程的上下文中运行,因此它们应该在运行进程的同一个 CPU 上运行(通常一个进程在一个 CPU 上运行,但这不能保证)。 当您运行两个线程而不是进程时,您会产生切换线程的开销,您执行的计算越多,需要执行的切换就越多,因此它会比在一个线程中完成的相同计算慢。 此外,如果您在不同的进程中运行相同的计算,那么在进程之间切换的开销会更大,但您更有可能在不同的 CPU 上运行,因此从长远来看,这可能会更快,但对于短期计算而言,速度不会那么快。

即使您认为没有其他进程在运行,操作系统也会一直有很多事情要做,并会切换到您并不总是意识到的自己的进程。

这一切都源于切换的随机性。希望我能帮一点忙。

关于c - 内存共享 C - 性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25988092/

相关文章:

无法在 C 中模拟 write() 系统调用

c - gets() 到达 '\r' 或 '\n' 或 '\r\n' 时是否停止读取?

Linux 网络命名空间 : process remains after killing container

LINUX "CD"命令在 shell 脚本中不起作用

c++ - 为什么处理多个数据流比处理一个数据流慢?

linux - 如何在 Linux 上获得整体 CPU 使用率(例如 57%)

c - 在 C 字符串上放置一个掩码

c - 发送到特定远程 ip 的第一条 UDP 消息丢失

linux - MAC 上 Cmd-Right 的 .screenrc 绑定(bind) key

cpu - CISC 与 RISC