CPU pinning (аффинность процессора, CPU affinity) — конфигурация виртуализации, при которой vCPU виртуальной машины жёстко привязаны к конкретным физическим ядрам (pCPU) хостового сервера. Без pinning планировщик гипервизора может переносить vCPU с одного физического ядра на другое — это нормально для большинства задач, но вызывает cache misses и NUMA-промахи при нагрузке, чувствительной к задержкам. CPU pinning устраняет эти переключения.
Как работает
В KVM привязка задаётся через vcpupin: в конфигурации QEMU/libvirt указывается маппинг vCPU → pCPU. Пример в конфиге libvirt:
<cputune>
<vcpupin vcpu="0" cpuset="4"/>
<vcpupin vcpu="1" cpuset="5"/>
</cputune>
В Proxmox: qm set 100 -cpuunits 1024 -vcpus 4 и через параметр cpuaffinity в конфиге VM. VMware vSphere использует механизм NUMA-aware scheduling — автоматически размещает VM на одном NUMA-узле без ручного pinning.
При использовании CPU pinning важно учитывать NUMA-топологию: вCPU лучше пинить к ядрам одного NUMA-узла, иначе доступ к памяти второго узла добавляет 40–100 нс задержки. Для серверов с 2 физическими сокетами (2 NUMA-узла) VM с pinning на ядрах первого сокета должна получать память из первого NUMA-узла (параметр memdev в QEMU или NUMA-политика в numactl).
Когда применять
- Real-time и low-latency приложения — финтех, телеком, игровые серверы с tick-rate 128+.
- GPU passthrough — VM с GPU для ML требует стабильного доступа к CPU без прерываний планировщика.
- HPC-вычисления — математические расчёты с высокими требованиями к cache locality.
- Изоляция между VM — разные клиентские VM не пересекаются по ядрам, исключая side-channel атаки типа Spectre/Meltdown.
История
CPU pinning — стандартная функция ядра Linux (taskset, cgroups cpuset), существующая с Linux 2.6 (2003). В контексте виртуализации вошла в практику вместе с KVM (2007) и началом использования серверов NUMA (2-сокетные конфигурации Intel Xeon Nehalem, 2008). Стала критически важна с появлением атак на совместно используемый кэш CPU (Spectre 2018, L1TF 2018), когда изоляция ядер между клиентами стала требованием безопасности для multitenancy хостинга.
На что обращать внимание
CPU pinning снижает гибкость планировщика: если пиннутое ядро простаивает, а другие VM перегружены — ресурс тратится впустую. Это приемлемо для production с предсказуемой нагрузкой, но не для dev-окружений. Также учитывайте, что зарезервированные ядра нельзя использовать для других VM. Для хостинга VDS с гарантированными ресурсами CPU pinning — стандартная практика у качественных провайдеров.
История и применение
CPU pinning как техника оптимизации появился вместе с первыми гипервизорами в середине 2000-х годов. В KVM реализован через параметр vcpupin в libvirt XML: <vcpupin vcpu='0' cpuset='2'/>. В Proxmox настраивается через GUI (секция CPU → NUMA) или командой qm set <vmid> --cpuunits .... Критически важен для low-latency торговых систем, серверов баз данных (PostgreSQL, MySQL) и телефонии на Asterisk.
CPU pinning и NUMA
Для максимального эффекта CPU pinning должен сочетаться с NUMA-pinning: все vCPU и RAM виртуальной машины должны быть привязаны к одному NUMA-узлу. В противном случае ВМ будет обращаться к памяти через межузловую шину (QPI/UPI), что добавляет 60–100 нс задержки на каждый доступ к памяти. В Proxmox включайте опцию NUMA и задавайте numaid совместно с cpupin.