假设我有2个quadcore处理器(8×2,13Ghz)。 服务器运行多个程序,只能同时使用1个核心+ Nginx和Apache worker。
问题是,Linux是否有效地将单线程程序分配给每个内核,以便每个程序可以利用1个内核的全部function,而不会干扰Apache和Nginx的负载。 所以基本上确保所有内核都被使用,而不是堆,所以程序可能会落后?
你的问题的一个很好的答案是SF太复杂了。 简单的回答是“是”,Linux和大多数现代操作系统平衡了可以非常有效地在可用处理器上运行的进程。
有些技术可以修改如何将进程分配给资源,包括更改调度程序将进程分配给特定的处理器,但是如果不真正了解它们的function或使用它们来解决特定问题,我不推荐使用它们中的任何一个。
此外,默认情况下,nginx和Apache的httpdmultithreading/多进程。 他们作为一个单独的过程运行是很奇怪的。 他们不会轮询networking连接/stream量,他们使用内核调用在无所事事时停止运行,并在有需要时自动唤醒。
Linux主要关注通过对所有可用内核上的线程进行负载均衡来最大化CPU利用率。 这并不意味着Linux任意决定将某些线程放在某些内核上,但它使用进程调度algorithm来决定在所有内核上分配线程的最有效方式。 所以你的问题的答案是肯定的。 如果你想更多,我会build议由Bovet&Cesati“理解Linux内核”。
如果“多个只能使用1个内核的程序”指的是程序可以修改源程序,可以考虑在线程初始化期间添加对sched_setscheduler()的调用,以便为调度程序提供一个关于如何安排每个线程的提示。 Linux的调度程序是相当惊人恕我直言,但更多的信息它可以完成它的工作更好! sched_setscheduler()是一个priviledge系统调用,调用它的线程必须至less具有CAP_SYS_NICEfunction,可能还有其他function。