我可以访问运行 Apache 2.2.15 和 MySQL 5.1.52 的 CentOS 6 Web 服务器(PHP/MySQL 论坛)。此机器有双八核 Xeon。
通过查看 CPU 图表,我发现前两个核心(0 和 1)的使用率达到 90%,而其他 14 个核心的使用率仅为 30-40%。核心 8(我相信是第二个处理器的第一个核心)的使用率很高(高达 90%),但正如前面提到的,其他所有核心的使用率都很低。
Apache 启动了大约 20 个进程,我怀疑在默认状态下,它无法理解并自然地利用所有核心。我认为这应该是内核的工作(有人可以确认吗?)。但是,随着这些核心达到最大限度,尽管有备用 RAM 和磁盘 I/O,但性能还是明显下降。
我可以在 Apache 中调整一些东西来“让它知道”所有其他核心,或者也许可以使用内核参数将特定进程分配给特定核心?例如,我可以排除核心 0 和 1 不用于 Apache 和 MySQL 吗?
答案1
使用任务集调整进程亲和性
例如将当前进程分配给 cpu-core 0,1,3
$任务集-cp 0,1,3 $$
pid 21698 的当前亲和列表:0-7
pid 21698 的新亲和性列表:0,1,3
隔离 CPU 以仅运行特定进程。内核参数“isolcpus”可以隔离特定 CPU 不执行其他任务。与任务集结合,您可以让特定 CPU 仅运行指定的任务。例如,在 grub.conf 中输入“isolcpus=2,3”将隔离 CPU 2 和 3。
http://honglus.blogspot.com/2011/03/tune-interrupt-and-process-cpu-affinity.html
答案2
并非所有应用程序流量都具有高度可并行性。我们内部有一个 Web 应用程序,即使在 24 核怪兽上运行,它也绝对是单线程的。在我们的案例中,Web 服务器很乐意使用我们为其提供的任意多的内核进行静态服务;但当绑定到特定应用服务器时,它只会使用一个内核。
如果我们查看单线程进程运行时每个核心的使用情况,每个核心将以 100*(1/n) 的百分比运行。内核正在按应有的方式将负载转移到多个核心上,但只有一个处理器的容量被 100% 地使用。
在我们的例子中,我们正在运行 LAMx 堆栈。其中 (x) 在此答案中未定义。事实证明,(x) 代表什么相当重要。所以是的,使用大量核心的能力取决于堆栈中的所有步骤,而不仅仅是 LAM 部分。
答案3
调度任务确实是内核的工作。在多核环境中,有时(但并非总是)内核会将作业分配给所有核心,但在一个或两个核心上,所有重负荷进程(如 apache)都会被分配。
理想情况下,您的内核应该已经知道您的机器中有多个核心。仍然以超级用户身份运行以下命令进行确认:
dmidecode|grep Core
在我的双核机器上它显示:
Version: Intel(R) Core(TM) i5-2410M CPU @ 2.30GHz
Core Count: 2
Core Enabled: 2