У меня есть доступ к веб-серверу CentOS 6 (форум PHP / MySQL) с Apache 2.2.15 и MySQL 5.1.52. Эта коробка имеет двухъядерные процессоры Xeon.
Что я обнаружил, просматривая графики ЦП, так это то, что первые два ядра (0 и 1) достигли 90% использования, в то время как остальные четырнадцать достигли использования только 30-40%. Ядро 8, которое, как я считаю, является первым ядром второго процессора, демонстрирует высокую степень использования (до 90%), но затем, как уже упоминалось, все остальные низкие.
Apache запускает около 20 процессов, и я подозреваю, что в состоянии по умолчанию он не может понять и использовать все ядра естественным образом. Я думаю, это должна быть работа ядра (может кто-нибудь подтвердить?). Однако, когда эти ядра исчерпаны, наблюдается заметное падение производительности, несмотря на наличие свободной оперативной памяти и дискового ввода-вывода.
Есть ли что-то, что я могу настроить в Apache, чтобы он «знал» обо всех других ядрах, или, возможно, программу переноса ядра, чтобы назначить определенный процесс определенным ядрам? Могу ли я исключить, например, ядра 0 и 1 из использования для Apache и MySQL?
Не весь трафик приложений хорошо распараллеливается. У нас есть внутреннее веб-приложение, которое является абсолютно однопоточным, даже когда оно работает на 24-ядерном монстре. В нашем случае веб-сервер с радостью будет использовать столько ядер, сколько мы ему добавим для статического обслуживания; но при привязке к определенному серверу приложений он остается с ним.
Если мы посмотрим на использование ядра, когда этот однопоточный процесс выполняется, каждое ядро будет работать с процентом 100 * (1 / n). Ядро перемещает нагрузку между несколькими ядрами, как и должно, но когда-либо используется только 100% мощности одного процессора.
В нашем случае мы запускаем стек LAMx. Где (x) в этом ответе не определено. Как оказалось, очень важно то, что представляет (x). Итак, да, возможность использования большого количества ядер зависит от всех шагов в стеке, а не только от частей LAM.
Связь процесса настройки с набором задач
например, назначить текущий процесс процессору 0,1,3
$ taskset -cp 0,1,3 $$
Текущий список соответствия pid 21698: 0-7
Новый список интересов pid 21698: 0,1,3
Изолируйте ЦП только для запуска определенного процесса. Параметр ядра «isolcpus» может изолировать определенные процессоры от выполнения других задач. Вместе с набором задач у вас могут быть определенные ЦП для выполнения только определенных задач. Например, если в grub.conf указать «isolcpus = 2,3», ЦП 2 и 3 будет изолирован.
http://honglus.blogspot.com/2011/03/tune-interrupt-and-process-cpu-affinity.html
Это действительно задача ядра - планировать задачи. В многоядерной среде иногда (но не всегда) ядро назначает задание всем ядрам, но на одно или два ядра назначаются все тяжелые процессы, такие как apache.
В идеале ваше ядро уже должно знать, что на вашем компьютере несколько ядер. По-прежнему выполните следующее, чтобы подтвердить статус суперпользователя:
dmidecode|grep Core
На моей двухъядерной машине написано:
Version: Intel(R) Core(TM) i5-2410M CPU @ 2.30GHz
Core Count: 2
Core Enabled: 2