假设我有 2 个四核处理器 (8x 2,13Ghz)。服务器运行多个程序,这些程序只能同时使用 1 个核心 + Nginx 和 Apache 工作器。
问题是,Linux 是否有效地将单线程程序分配给每个核心,以便每个程序都可以充分利用 1 个核心的全部功能,并且不会干扰 Apache 和 Nginx 的负载。因此,基本上要确保所有核心都得到使用,而不是堆积,否则程序最终可能会滞后?
答案1
对你的问题的一个好的答案对于 SF 来说太复杂了。简短的回答是“是”,Linux 和大多数现代操作系统可以非常有效地平衡准备在可用处理器上运行的进程。
有一些技术可以修改进程分配资源的方式,包括更改调度程序将进程分配给特定的处理器,但我不建议在不真正了解它们的作用或使用它们来解决特定问题的情况下使用任何这些技术。
此外,nginx 和 Apache httpd 默认都是多线程/多进程。如果它们以单个进程运行,那就太奇怪了。它们不轮询网络连接/流量,而是使用内核调用在无事可做时停止运行,并在有事可做时自动唤醒。
答案2
Linux 主要关注通过在所有可用核心上平衡线程负载来最大化 CPU 利用率。这并不意味着 Linux 任意决定将某些线程放在某些核心上,而是它使用进程调度算法来决定在所有核心上分配线程的最有效方法。所以你的问题的答案是肯定的。如果你想了解更多,我建议你阅读 Bovet & Cesati 的《理解 Linux 内核》。
答案3
如果您所说的“多个只能使用 1 个核心的程序”是指可以修改源代码的程序,请考虑在线程初始化期间添加对 sched_setscheduler() 的调用,以便向调度程序提示您希望如何调度每个线程。在我看来,Linux 调度程序非常了不起,但它拥有的信息越多,它就能更好地完成工作!sched_setscheduler() 是一个特权系统调用,调用它的线程必须至少具有 CAP_SYS_NICE 功能,可能还有其他功能。