Назад | Перейти на главную страницу

Виртуализация: закрепление виртуальных ЦП с центральным процессором Hyperthreading?

Я использую KVM / libvirt на сервере Linux с процессором Core i7-2600, который имеет следующую топологию процессора (1 разъем, 4 ядра, 8 потоков):

Physical | Logical
---------+--------
Core 0   | 0, 4
Core 1   | 1, 5
Core 2   | 2, 6
Core 3   | 3, 7

Я обычно запускаю на этом хосте 3 виртуальные машины, каждая с 2 виртуальными процессорами. Чтобы повысить производительность за счет поддержания горячих кешей, я хотел бы привязать виртуальные ядра виртуальных машин к фиксированным ядрам хоста.

Теперь вопрос заключается в сопоставлении ядер виртуальных машин с ядрами хоста, учитывая тот факт, что центральный процессор использует Hyperthreading:

Вариант 1. Одна виртуальная машина на каждое физическое ядро ​​хоста

VM1: logical cores 1, 5
VM2: logical cores 2, 6
VM3: logical cores 3, 7

Таким образом, два виртуальных ядра виртуальной машины будут сопоставлены родственным гиперпотокам на центральном процессоре. Гостевой код получит выгоду от расположения кеша, поскольку два ядра хоста совместно используют некоторые кеши.

Но учитывая тот факт, что два гиперпотока также имеют общие функциональные блоки, они будут замедлять друг друга при вычислительной нагрузке.

Вариант 2: распределенные ядра виртуальных машин

VM1: logical cores 1, 2
VM2: logical cores 3, 5
VM3: logical cores 6, 7

Это сопоставление имеет то преимущество, что если виртуальная машина испытывает вычислительную нагрузку на обоих из двух своих виртуальных ядер, эта нагрузка отображается на двух отдельных физических ядрах на хосте. Если в этот момент никакая другая виртуальная машина не находится под нагрузкой, первая может использовать два физических ядра вместо одного с вариантом 1.

Все виртуальные машины запускают в основном веб-сервисы (Nginx, MySQL, PHP-FPM), поэтому я знаю, что вопрос носит скорее теоретический характер, но все же я хотел бы знать.

Возможно, вы слишком много думаете об этом.

Ручное назначение ядер здесь может фактически привести к снижению производительности. В мире VMware мы не делаем этого, если нет особых требований, но для описанных вами рабочих нагрузок и приложений в этом нет необходимости. Пусть KVM планирует все и будет сделано. Если сомневаетесь, купите больше жил и розеток. Но ЦП не будет ограничивающим фактором в таком небольшом развертывании.

Вариант 1 в большинстве случаев не должен замедляться, но операционная система и программы могут нормально работать с их рабочими нагрузками. Это может накапливаться. Я думаю, что вариант 2 лучше, если ваш сосед не против ~ крошечного ~ замедления.