Подробный гайд по оптимизации производительности KVM в Astra Linux 1.8
Важно:
- Astra Linux 1.8 часто используется в контурах, подпадающих под требования ИБ и сертификации ФСТЭК/Минобороны. Оптимизация не должна нарушать мандатные политики и журналы аудита. Все изменения рекомендуется применять на тестовом стенде, фиксировать в конфигурационном управлении и проверять совместимость с вашими ИБ-профилями.
0. Предварительные требования
- Хост: физический сервер с поддержкой аппаратной виртуализации (Intel VT-x / AMD-V).
- Astra Linux Special Edition 1.8 (Smolensk/Orion) с обновлённым репозиторием.
- Права
rootилиsudo. - Резервные копии
/etc/libvirt/,/etc/default/grub,/etc/sysctl.conf.
1. Проверка аппаратной поддержки и BIOS
# Проверка поддержки виртуализации CPU
lscpu | grep -E "Virtualization|Hypervisor"
cat /proc/cpuinfo | grep -E "vmx|svm"
# Наличие устройства KVM
ls -l /dev/kvm
В BIOS/UEFI:
- Включить
Intel VT-x/AMD-V - Включить
VT-d/AMD IOMMU(если планируется PCI passthrough) - Отключить
C-StatesиP-Statesна уровне BIOS (опционально, для low-latency) - Включить
SR-IOV(если используются сетевые карты с аппаратной виртуализацией)
2. Базовая подготовка хоста (Astra Linux 1.8)
sudo apt update
sudo apt install qemu-kvm libvirt-daemon-system libvirt-clients virtinst bridge-utils cpu-checker
sudo systemctl enable --now libvirtd
sudo usermod -aG libvirt $USER
Проверка:
kvm-ok
virsh version
qemu-system-x86_64 --version
3. Оптимизация ядра и системных параметров
3.1. CPU Governor
Переключите на performance для всех ядер:
sudo apt install linux-cpupower
sudo cpupower frequency-set -g performance
# Для сохранения после перезагрузки:
sudo systemctl enable cpupower
sudo cpupower set -g performance
3.2. Transparent HugePages (THP)
THP может вызывать latency в ВМ.
Отключите:
echo 'vm.nr_hugepages=0' | sudo tee -a /etc/sysctl.d/99-kvm-tuning.conf
echo never | sudo tee /sys/kernel/mm/transparent_hugepage/enabled
echo never | sudo tee /sys/kernel/mm/transparent_hugepage/defrag
Для сохранения:
sudo tee /etc/systemd/system/disable-thp.service <<EOF
[Unit]
Description=Disable Transparent HugePages
[Service]
Type=oneshot
ExecStart=/bin/sh -c 'echo never > /sys/kernel/mm/transparent_hugepage/enabled && echo never > /sys/kernel/mm/transparent_hugepage/defrag'
[Install]
WantedBy=multi-user.target
EOF
sudo systemctl enable disable-thp
3.3. KSM (Kernel Samepage Merging)
Включите для экономии RAM при множестве схожих ВМ.
Отключите для low-latency.
echo 1 | sudo tee /sys/kernel/mm/ksm/run
# Сохранение:
sudo tee /etc/sysctl.d/99-ksm.conf <<EOF
vm.ksm_run = 1
vm.ksm_sleep_millisecs = 20
EOF
3.4. Сетевые параметры ядра
sudo tee /etc/sysctl.d/99-net-kvm.conf <<EOF
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
net.core.netdev_max_backlog = 300000
net.core.somaxconn = 65535
vm.swappiness = 10
vm.vfs_cache_pressure = 50
EOF
sudo sysctl -p /etc/sysctl.d/99-net-kvm.conf
3.5. I/O Scheduler
# Для NVMe/SSD:
echo none > /sys/block/sda/queue/scheduler
# Для HDD/SATA:
echo bfq > /sys/block/sda/queue/scheduler
Автоматизация через udev:
sudo tee /etc/udev/rules.d/60-io-scheduler.rules <<EOF
ACTION=="add|change", KERNEL=="sd[a-z]", ATTR{queue/scheduler}="bfq"
ACTION=="add|change", KERNEL=="nvme[0-9]*n[0-9]*", ATTR{queue/scheduler}="none"
EOF
sudo udevadm control --reload-rules
3.6. GRUB (опционально, для изоляции ядер)
Вместо устаревшего isolcpus используйте cgroups v2 + <cputune> в libvirt.
Если всё же требуется:
# /etc/default/grub
GRUB_CMDLINE_LINUX="... intel_iommu=on iommu=pt default_hugepagesz=1G hugepagesz=1G hugepages=8"
sudo update-grub
Перезагрузите хост.
4. Настройка хранилища и сети
4.1. Диски
- Используйте
virtio-scsiилиvirtio-blkдля всех ВМ. - Формат диска:
rawдля максимальной производительности,qcow2сqemu-imgpreallocation. - Файловая система:
XFSилиEXT4сnoatime,nodiratime,discard. - Выравнивание разделов: кратно 1MiB (
fdisk,parted).
# Создание preallocated raw диска
qemu-img create -f raw vm-disk.raw 100G
4.2. Сеть
- Отключите лишние offloading только для диагностики, в продакшене оставьте включёнными.
- Включите
vhost-net(по умолчанию в Astra 1.8/libvirt >= 7.0). - Для многопоточности в госте:
ethtool -L eth0 combined 4(внутри ВМ).
# Проверка offloading
ethtool -k eth0 | grep -E "tcp|udp|gro|lro|tso|gso"
# Включение
sudo ethtool -K eth0 gro on gso on tso on lro on
5. Тонкая настройка виртуальных машин (Libvirt XML)
Редактирование: virsh edit <domain>
5.1. CPU
<cpu mode='host-passthrough' check='none'/>
<vcpu placement='static'>4</vcpu>
<cputune>
<vcpupin vcpu='0' cpuset='2'/>
<vcpupin vcpu='1' cpuset='3'/>
<vcpupin vcpu='2' cpuset='4'/>
<vcpupin vcpu='3' cpuset='5'/>
<emulatorpin cpuset='0-1'/>
</cputune>
host-passthroughдаёт лучшую производительность, но снижает миграцию. Для live-migration используйтеhost-model.
5.2. NUMA (если многопроцессорный сервер)
<numatune>
<memory mode='strict' nodeset='0'/>
<memnode cellid='0' mode='strict' nodeset='0'/>
</numatune>
Проверка узлов: numactl --hardware
5.3. Память и HugePages
На хосте:
sudo sysctl vm.nr_hugepages=16
sudo mkdir -p /dev/hugepages
sudo mount -t hugetlbfs nodev /dev/hugepages
В XML:
<memory unit='KiB'>16777216</memory>
<currentMemory unit='KiB'>16777216</currentMemory>
<memoryBacking>
<hugepages/>
<nosharepages/>
</memoryBacking>
5.4. Диск
<disk type='file' device='disk'>
<driver name='qemu' type='raw' cache='none' io='threads' discard='unmap'/>
<source file='/var/lib/libvirt/images/vm.raw'/>
<target dev='vda' bus='scsi'/>
<address type='drive' controller='0' bus='0' target='0' unit='0'/>
</disk>
cache='none'требует поддержкиO_DIRECT. Если ФС не поддерживает, используйтеcache='writeback'.
5.5. Сеть
<interface type='bridge'>
<mac address='52:54:00:xx:xx:xx'/>
<source bridge='br0'/>
<model type='virtio'/>
<driver name='vhost' queues='4'/>
</interface>
6. Особенности Astra Linux 1.8
6.1. Мандатный контроль доступа (Parsec / PDPLinux)
Astra использует мандатные политики, которые могут блокировать доступ qemu к /dev/kvm, /dev/vhost-net, огромным страницам.
Решение:
- Не отключайте Parsec полностью.
Создайте профиль для виртуализации:
sudo pdplinux -l
sudo chcon -t virt_image_t /var/lib/libvirt/images/*
sudo chcon -t virt_etc_t /etc/libvirt/qemu/*
- Добавьте исключения в /etc/pdp/pdp.conf (если используется кастомная политика):
allow qemu_t device_t:chr_file { read write open };
allow qemu_t hugetlbfs_t:file { read write open };
- Убедитесь, что пользователь libvirt-qemu имеет нужные контексты:
sudo usermod -aG kvm libvirt-qemu
6.2. Аудит и журналы
auditd добавляет ~2-5% overhead.
Оптимизируйте правила:
sudo auditctl -D
sudo tee /etc/audit/rules.d/99-kvm.rules <<EOF
-w /dev/kvm -p rwxa -k kvm_dev
-w /dev/vhost-net -p rwxa -k vhost_dev
-a never,exit -F arch=b64 -S execve -F exe=/usr/bin/qemu-system-x86_64
EOF
sudo systemctl restart auditd
6.3. Репозитории и ядро
- Не заменяйте сертифицированное ядро Astra на mainline без согласования с ИБ-отделом.
- Обновляйте только через официальные репозитории:
sudo apt install astra-kvm-opt astra-libvirt-extra
7. Мониторинг и диагностика
| Инструмент | Назначение |
|---|---|
virt-top |
Мониторинг ВМ в реальном времени |
virsh domstats <vm> |
CPU, RAM, Disk IO метрики |
perf kvm stat record -a |
Профилирование гипервизора |
iostat -xz 1 |
Дисковая подсистема |
sar -n DEV 1 |
Сетевая подсистема |
vmstat 1 |
Общая нагрузка, своп, прерывания |
dmesg | grep -iE "kvm|vhost|huge" |
Ошибки ядра |
Пример профилирования:
sudo perf kvm stat live -p $(pgrep -f qemu-system)
sudo blktrace -d /dev/vda -o - | blkparse -i -
8. Чек-лист перед вводом в продакшен
- [ ] VT-x/VT-d включены в BIOS
- [ ]
cpupower->performance - [ ] THP отключён, HugePages выделены
- [ ]
cache='none'+io='threads'для дисков - [ ]
virtio+vhost+ многоканальность для сети - [ ] CPU pinning через
<cputune> - [ ] NUMA привязка (если применимо)
- [ ] Parsec/аудит не блокируют доступ QEMU
- [ ] Проведены тесты
fio,iperf3,sysbench - [ ] Зафиксированы изменения в конфигурационном управлении
Примечания по сертификации и ИБ
- В сертифицированных контурах Astra Linux изменения в
/etc/sysctl.d/, GRUB, политиках PDPLinux должны согласовываться с ответственными за ИБ. host-passthroughможет нарушать требования к целостности гостевых ОС. Используйтеhost-modelпри необходимости миграции или аудита.- Для ФСТЭК-сертифицированных ВМ рекомендуется использовать
virtioдрайверы, подписанные в рамках СКЗИ, и отключатьballoonесли требуется детерминированная память.