🏎 Разгоняем KVM: Тюнинг производительности
«Из коробки» KVM предлагает безопасные и совместимые настройки, но они - враг высокой производительности. Если ваша БД тормозит или сеть не выдает гигабит, скорее всего, проблема не в железе, а в том, как виртуалка с ним общается.
Вот «святая троица» настроек для High Performance.
1. VirtIO: Забудьте про эмуляцию
По умолчанию гипервизор может подсовывать машине эмулируемую сетевую карту (например, e1000) или IDE-диск. Это создает огромный оверхед: CPU тратит такты на то, чтобы притворяться старым железом.
Решение: Используйте паравиртуализированные драйверы VirtIO. Они позволяют гостевой ОС знать, что она виртуальная, и общаться с гипервизором напрямую.
🩵 Диски: Используйте шину
🩵 Сеть: Модель адаптера
Как проверить в XML (
2. Дисковый кэш и I/O
Если вы используете LVM или raw-файлы, стандартный кэш Linux может создавать лишние копии данных в RAM.
Решение:
1. Cache mode: Ставим
2. IO mode: Ставим
3. CPU Pinning (Привязка ядер)
Самый мощный буст для процессорозависимых задач.
По умолчанию планировщик Linux перекидывает потоки vCPU виртуалки между любыми физическими ядрами хоста. Это убивает L1/L2/L3 кэш процессора (Context Switching).
Решение: Жестко привязать виртуальные ядра к физическим.
Пример для 4-ядерной VM (привязываем к ядрам 2,3,4,5 физического хоста):
🚀 Чек-лист для максимальной скорости:
1. Драйверы: Только VirtIO (net + blk).
2. Диски: Формат RAW (или LVM volume), кэш
3. CPU: Pinning + режим
4. Память: Если у вас сотни Гб RAM, включите Hugepages (страницы по 2Mb или 1Gb вместо 4Kb), чтобы разгрузить таблицу страниц памяти.
А вы заморачиваетесь с тюнингом или для ваших задач хватает дефолтных настроек? Делитесь опытом в комментах!
#sysadmin #kvm #performance #tuning #linux #virtio
📲 Мы в MAX
👉 @sysadminof
«Из коробки» KVM предлагает безопасные и совместимые настройки, но они - враг высокой производительности. Если ваша БД тормозит или сеть не выдает гигабит, скорее всего, проблема не в железе, а в том, как виртуалка с ним общается.
Вот «святая троица» настроек для High Performance.
1. VirtIO: Забудьте про эмуляцию
По умолчанию гипервизор может подсовывать машине эмулируемую сетевую карту (например, e1000) или IDE-диск. Это создает огромный оверхед: CPU тратит такты на то, чтобы притворяться старым железом.
Решение: Используйте паравиртуализированные драйверы VirtIO. Они позволяют гостевой ОС знать, что она виртуальная, и общаться с гипервизором напрямую.
VirtIO (или VirtIO-SCSI).virtio.Как проверить в XML (
virsh edit):
<target dev='vda' bus='virtio'/>
<model type='virtio'/>
Важно: Для Windows-гостей понадобятся драйверы virtio-win.iso.2. Дисковый кэш и I/O
Если вы используете LVM или raw-файлы, стандартный кэш Linux может создавать лишние копии данных в RAM.
Решение:
1. Cache mode: Ставим
none. Это отключает кэширование на хосте (Direct I/O). VM сама управляет своим кэшем, что быстрее и безопаснее для баз данных.2. IO mode: Ставим
native. Использует нативный Linux AIO (Asynchronous I/O).
<driver name='qemu' type='raw' cache='none' io='native'/>
3. CPU Pinning (Привязка ядер)
Самый мощный буст для процессорозависимых задач.
По умолчанию планировщик Linux перекидывает потоки vCPU виртуалки между любыми физическими ядрами хоста. Это убивает L1/L2/L3 кэш процессора (Context Switching).
Решение: Жестко привязать виртуальные ядра к физическим.
Пример для 4-ядерной VM (привязываем к ядрам 2,3,4,5 физического хоста):
<cputune>
<vcpupin vcpu='0' cpuset='2'/>
<vcpupin vcpu='1' cpuset='3'/>
<vcpupin vcpu='2' cpuset='4'/>
<vcpupin vcpu='3' cpuset='5'/>
</cputune>
Pro Tip: Не используйте "ядро 0" хоста — оставьте его для самого гипервизора и системных прерываний.
🚀 Чек-лист для максимальной скорости:
1. Драйверы: Только VirtIO (net + blk).
2. Диски: Формат RAW (или LVM volume), кэш
none.3. CPU: Pinning + режим
host-passthrough (чтобы VM видела все инструкции процессора, включая AES-NI и AVX).4. Память: Если у вас сотни Гб RAM, включите Hugepages (страницы по 2Mb или 1Gb вместо 4Kb), чтобы разгрузить таблицу страниц памяти.
А вы заморачиваетесь с тюнингом или для ваших задач хватает дефолтных настроек? Делитесь опытом в комментах!
#sysadmin #kvm #performance #tuning #linux #virtio
📲 Мы в MAX
👉 @sysadminof
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13❤3
🏗 KVM + Terraform: Поднимаем виртуалки как код
Мы научились управлять KVM через
На сцену выходит Terraform. Обычно его ассоциируют с облаками (AWS, Azure), но он прекрасно работает и с «железным» гипервизором через провайдер
🛠 Что нам понадобится?
1. Установленный Terraform.
2. Плагин-провайдер
3. Образ системы (Cloud Image), например, Ubuntu Cloud.
📄 Пишем рецепт (
Создайте папку, положите туда файл
🚀 Запускаем магию
В терминале переходим в папку с файлом и выполняем три команды:
1.
2.
3.
🤔 А как удалить?
Не нужно вспоминать имена машин и удалять диски вручную. Просто введите:
И Terraform аккуратно зачистит за собой всё, что создал.
💡 Почему это круто?
🩵 Воспроизводимость: Вы можете отправить этот файл коллеге, и он поднимет точно такую же среду.
🩵 Git: Вы храните конфигурацию инфраструктуры в репозитории. Видна история изменений.
🩵 Cloud-Init: В Terraform можно добавить конфигурацию
👇 Коллеги, какой инструмент IaC вы предпочитаете? Terraform, Ansible или, может быть, Pulumi?
#sysadmin #devops #terraform #kvm #iac #automation
📲 Мы в MAX
👉 @sysadminof
Мы научились управлять KVM через
virsh, но если вам нужно поднять 10 одинаковых серверов для тестов, а потом удалить их одной командой - ручной ввод утомляет.На сцену выходит Terraform. Обычно его ассоциируют с облаками (AWS, Azure), но он прекрасно работает и с «железным» гипервизором через провайдер
libvirt.🛠 Что нам понадобится?
1. Установленный Terraform.
2. Плагин-провайдер
dmacvicar/libvirt (стандарт де-факто для KVM).3. Образ системы (Cloud Image), например, Ubuntu Cloud.
📄 Пишем рецепт (
main.tf)Создайте папку, положите туда файл
main.tf и опишите желаемое состояние:
terraform {
required_providers {
libvirt = {
source = "dmacvicar/libvirt"
}
}
}
# 1. Подключаемся к локальному KVM
provider "libvirt" {
uri = "qemu:///system"
}
# 2. Скачиваем образ диска (или берем локальный)
resource "libvirt_volume" "ubuntu_base" {
name = "ubuntu-base.qcow2"
pool = "default"
# Ссылка на официальный Cloud-образ
source = "https://cloud-images.ubuntu.com/minimal/releases/jammy/release/ubuntu-22.04-minimal-cloudimg-amd64.img"
format = "qcow2"
}
# 3. Описываем Виртуальную Машину
resource "libvirt_domain" "my_web_server" {
name = "terraform-vm-01"
memory = "1024"
vcpu = 1
network_interface {
network_name = "default" # NAT сеть libvirt
}
disk {
volume_id = libvirt_volume.ubuntu_base.id
}
console {
type = "pty"
target_port = "0"
target_type = "serial"
}
graphics {
type = "spice"
listen_type = "address"
autoport = true
}
}
🚀 Запускаем магию
В терминале переходим в папку с файлом и выполняем три команды:
1.
terraform init - Скачает провайдер libvirt.2.
terraform plan - Покажет, что именно он собирается создать (DRY RUN).3.
terraform apply - Boom! Скачивается образ, создается диск, запускается VM.🤔 А как удалить?
Не нужно вспоминать имена машин и удалять диски вручную. Просто введите:
terraform destroyИ Terraform аккуратно зачистит за собой всё, что создал.
💡 Почему это круто?
cloud-init (создать пользователя, добавить SSH-ключ, установить пакеты при первом старте), чтобы получить полностью готовый сервер, в который даже не нужно заходить.👇 Коллеги, какой инструмент IaC вы предпочитаете? Terraform, Ansible или, может быть, Pulumi?
#sysadmin #devops #terraform #kvm #iac #automation
📲 Мы в MAX
👉 @sysadminof
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10
☁️ KVM + Cloud-Init: Настройка сервера «без рук»
В продолжение поста. Мы научились поднимать "железо" через Terraform. Но что толку от запущенной VM, если в нее нужно заходить через VNC-консоль, вручную создавать пользователя, прописывать пароли и ставить
Это медленно и небезопасно.
Решение Cloud-Init. Это стандарт де-факто для инициализации облачных инстансов (AWS, Azure, DigitalOcean), который прекрасно работает и на локальном KVM.
🎯 Задача
При команде
1. Создать VM.
2. Автоматически создать пользователя
3. Закинуть туда ваш публичный SSH-ключ (чтобы заходить без пароля).
4. Установить Nginx и Docker.
📝 Шаг 1. Пишем конфиг (cloud_init.cfg)
Создайте файл
🔗 Шаг 2. Подключаем к Terraform
В наш файл
🚀 Результат: Вы запускаете
Через 30 секунд у вас есть поднятый сервер с установленным Nginx. Вы просто пишете:
...и сразу попадаете внутрь. Никаких паролей, никаких ручных установок.
💡 Важный нюанс: Cloud-Init работает только на специальных Cloud Images (например,
Если вы попытаетесь скормить ему обычный установочный ISO (Desktop/Server installer), магии не произойдет, там нет демона
Коллеги, а вы используете Cloud-Init или по старинке Ansible/Chef/Puppet накатываете настройки уже после того, как машина загрузилась?
#sysadmin #cloudinit #terraform #kvm #devops #automation #linux
📲 Мы в MAX
👉 @sysadminof
В продолжение поста. Мы научились поднимать "железо" через Terraform. Но что толку от запущенной VM, если в нее нужно заходить через VNC-консоль, вручную создавать пользователя, прописывать пароли и ставить
nginx?Это медленно и небезопасно.
Решение Cloud-Init. Это стандарт де-факто для инициализации облачных инстансов (AWS, Azure, DigitalOcean), который прекрасно работает и на локальном KVM.
🎯 Задача
При команде
terraform apply:1. Создать VM.
2. Автоматически создать пользователя
admin.3. Закинуть туда ваш публичный SSH-ключ (чтобы заходить без пароля).
4. Установить Nginx и Docker.
📝 Шаг 1. Пишем конфиг (cloud_init.cfg)
Создайте файл
cloud_init.cfg. Это обычный YAML, который описывает, что нужно сделать внутри ОС при первом старте.
#cloud-config
hostname: my-web-server
fqdn: my-web-server.local
manage_etc_hosts: true
users:
- name: admin
sudo: ALL=(ALL) NOPASSWD:ALL
shell: /bin/bash
ssh_authorized_keys:
- ssh-rsa AAAAB3Nza... (ваш публичный ключ id_rsa.pub)
packages:
- nginx
- htop
- git
runcmd:
- [ systemctl, enable, nginx ]
- [ systemctl, start, nginx ]
- [ echo, "Hello from Cloud-Init!", >, /var/www/html/index.html ]
🔗 Шаг 2. Подключаем к Terraform
В наш файл
main.tf (из прошлого поста) добавляем ресурс диска Cloud-Init. Terraform создаст маленький ISO-образ с нашим конфигом и подключит его как CD-ROM к виртуалке.
# 1. Читаем конфиг
data "template_file" "user_data" {
template = file("${path.module}/cloud_init.cfg")
}
# 2. Создаем диск с настройками
resource "libvirt_cloudinit_disk" "commoninit" {
name = "commoninit.iso"
user_data = data.template_file.user_data.rendered
}
# 3. Цепляем к машине
resource "libvirt_domain" "vm" {
# ... остальные настройки ...
# Самая важная строчка:
cloudinit = libvirt_cloudinit_disk.commoninit.id
# ...
}
🚀 Результат: Вы запускаете
terraform apply.Через 30 секунд у вас есть поднятый сервер с установленным Nginx. Вы просто пишете:
ssh admin@<ip-address>...и сразу попадаете внутрь. Никаких паролей, никаких ручных установок.
💡 Важный нюанс: Cloud-Init работает только на специальных Cloud Images (например,
Ubuntu Cloud, CentOS GenericCloud, Debian Cloud).Если вы попытаетесь скормить ему обычный установочный ISO (Desktop/Server installer), магии не произойдет, там нет демона
cloud-init, который читает конфиг при загрузке.Коллеги, а вы используете Cloud-Init или по старинке Ansible/Chef/Puppet накатываете настройки уже после того, как машина загрузилась?
#sysadmin #cloudinit #terraform #kvm #devops #automation #linux
📲 Мы в MAX
👉 @sysadminof
❤4👍3🤨2🔥1