18

关于 Linux 上同一进程的线程之间的上下文切换成本是否有任何好的经验数据(主要是 x86 和 x86_64)?我说的是一个线程在自愿或非自愿进入睡眠之前在用户空间中执行的最后一条指令与同一进程的不同线程在同一 cpu/核心上唤醒后执行的第一条指令之间的周期数或纳秒数.

我写了一个快速测试程序,它rdtsc在分配给同一个 cpu/core 的 2 个线程中不断执行,将结果存储在一个 volatile 变量中,并与其姊妹线程的相应 volatile 变量进行比较。第一次检测到姊妹线程的值发生变化时,它会打印差异,然后返回循环。我在 Atom D510 cpu 上以这种方式获得了大约 8900/9600 个周期的最小/中值计数。这个程序是否合理,数字是否可信?

我的目标是估计,在现代系统上,每个连接的线程服务器模型是否可以与选择类型的多路复用竞争甚至胜过选择类型的多路复用。这在理论上似乎是合理的,因为从对 fd 执行 IO 到 fd 的转换XY涉及在一个线程中休眠并在另一个线程中唤醒,而不是多个系统调用,但这取决于上下文切换的开销。

4

1 回答 1

16

(免责声明:这不是问题的直接答案,只是一些我希望对您有所帮助的建议)。

首先,你得到的数字肯定听起来像是在球场内。但是请注意,实现相同 ISA 的不同 CPU 模型之间的中断/陷阱延迟可能会有很大差异。如果您的线程使用了浮点或向量操作,这也是另一回事,因为如果它们没有,内核会避免保存/恢复浮点或向量单元状态。

您应该能够通过使用内核跟踪基础架构获得更准确的数字 -perf sched特别是旨在测量和分析调度程序延迟。

如果您的目标是为每个连接的线程建模服务器,那么您可能不应该测量非自愿上下文切换延迟 - 通常在这样的服务器中,大多数上下文切换将是自愿的,因为线程阻塞read()等待更多数据从网络。因此,更好的测试平台可能涉及测量从一个线程阻塞read()到另一个线程从同一线程唤醒的延迟。

请注意,在重负载下编写良好的多路复用服务器中,从 fdX到 fd的转换Y通常会涉及相同的单个系统调用(因为服务器迭代从单个返回的活动文件描述符列表epoll())。一个线程也应该比多个线程拥有更少的缓存占用空间,只需通过只有一个堆栈即可。我怀疑解决问题的唯一方法(对于“解决”的某些定义)可能是进行基准枪战......

于 2011-05-11T04:17:19.057 回答