Виртуализация: закрепление vCPU с процессором Hyperthreading Host?
Я использую 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 виртуальные машины, каждая с двумя виртуальными процессорами. Чтобы повысить производительность за счет поддержания горячих кэшей, я бы хотел прикрепить виртуальные ядра виртуальных машин к фиксированным ядрам хоста.
Теперь вопрос состоит в том, чтобы сопоставить ядра виртуальных машин с ядрами хоста, учитывая тот факт, что центральный процессор использует гиперпоточность:
Вариант 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), поэтому я знаю, что вопрос носит довольно теоретический характер, но все же я хотел бы знать.
2 ответа
Вы можете задуматься об этом.
Ручное распределение ядер может привести к снижению производительности. В мире VMware мы этого не делаем, если нет особых требований, но для рабочей нагрузки и приложений, которые вы описали, в этом нет необходимости. Пусть KVM наметит вещи и будет сделано. Если есть сомнения, получите больше ядер и розеток. Но процессор не будет ограничивающим фактором в таком маленьком развертывании.
Вариант 1 не должен замедляться в большинстве случаев, но операционная система и программы могут работать в соответствии со своими рабочими нагрузками. Это может быть накоплено. Я думаю, что вариант 2 лучше, если ваш сосед не возражает против крошечного замедления.