Борьба за производительность

В продолжение истории борьбы за производительность.

Допустим, у нас есть что-то, что обладает каким-то неприличным количеством ядер, например 16.

И нам надо разбалансировать эти ядра между разными «типами» нагрузки. Причём мы точно знаем, сколько ядер нам надо для одного типа, и точно не знаем, сколько нужно для всего остального.

Тут на помощь приходят четыре параметра ядра — isolcpus, nohz_full, rcu_nocbs и irqaffinity.

В рамках решаемого кейса сразу указал на них, что сократило поиск необходимых решений.

По сути, все четыре параметра решают одну задачу — ограничить использование указанных ядер (например, 0–3) процессами, за исключением базовых — init, scsi и прочих.

Роман Шубин
Роман Шубин
CEO & CTO, Главред в «Цифровой улей»
Задать вопрос
Таким образом мы можем через тот же taskset указать вручную на ядра 0–3 те процессы, что нам нужны.

В данной картине мы защищаем этот сегмент от службы irqbalance, которая с завидным упорством будет ребалансировать процессы между ядрами.

Но будьте внимательны при изоляции, так как в случае количества процессоров > 1 нужно чуть иначе выставлять диапазоны, чтобы не угодить в яму NUMA. Там деление ядер от 0 до последнего происходит сегментами по очереди.

Роман Шубин
Роман Шубин
CEO & CTO, Главред в «Цифровой улей»
Задать вопрос
Конкретно мой случай изоляции был применён в рамках разделения нагрузки на сетевые прерывания и Nginx, но в совокупности факторов — параметры ядра, отключённый и маскированный irqbalance, taskset и ещё несколько твиков — давал профит только при утилизации сетевой карты лишь до 70 %, дальше спецэффекты постепенно возвращались.