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