rubric/modules/linuxmodules/linux_perfomance.go
2026-07-21 14:52:55 +03:00

264 lines
13 KiB
Go
Executable file
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package linuxmodules
import (
"fmt"
"rubric/utils"
)
var PerformanceModule = Module{
Key: "performance",
Aliases: []string{"perf", "swap", "tuned", "производительность"},
Title: "Производительность системы",
Description: "Темы 4952: виртуальная память, планировщик CPU, tuned, Stratis",
Run: showPerformance,
}
func showPerformance() {
utils.Header("Linux — Производительность системы")
// ─── 49. Виртуальная память, swap ────────────────────────────
utils.Section("49. Виртуальная память и swap")
utils.Println("Виртуальная память — механизм ядра, позволяющий процессам иметь")
utils.Println("больше памяти, чем физически установлено, за счёт использования диска.")
fmt.Println()
utils.Println(utils.ColorBold + "Swap — раздел/файл подкачки:" + utils.ColorReset)
utils.Code(`Когда физической RAM не хватает, ядро перемещает
редко используемые страницы памяти на swap.
Это медленнее RAM в сотни раз, но лучше OOM-killer.
Типы swap:
- раздел swap (swap partition) — отдельный раздел диска
- файл swap (swapfile) — обычный файл на любой ФС`)
utils.Println(utils.ColorBold + "Просмотр swap:" + utils.ColorReset)
utils.Command("free -h", "RAM и swap (human-readable)")
utils.Command("swapon --show", "активные swap-устройства")
utils.Command("cat /proc/swaps", "то же через /proc")
utils.Command("vmstat -s", "статистика памяти и swap")
fmt.Println()
utils.Println(utils.ColorBold + "Создание swapfile:" + utils.ColorReset)
utils.Code(`# 1. Создать файл нужного размера:
sudo dd if=/dev/zero of=/swapfile bs=1M count=2048 # 2 ГБ
# или быстрее:
sudo fallocate -l 2G /swapfile
# 2. Установить права (только root):
sudo chmod 600 /swapfile
# 3. Форматировать как swap:
sudo mkswap /swapfile
# 4. Активировать:
sudo swapon /swapfile
# 5. Добавить в /etc/fstab для автоматической активации:
echo '/swapfile none swap defaults 0 0' | sudo tee -a /etc/fstab`)
utils.Println(utils.ColorBold + "Управление swap:" + utils.ColorReset)
utils.Command("swapon /dev/sdb2", "активировать swap-раздел")
utils.Command("swapoff /swapfile", "деактивировать")
utils.Command("swapoff -a", "деактивировать все swap")
utils.Command("swapon -a", "активировать все из /etc/fstab")
fmt.Println()
utils.Println(utils.ColorBold + "vm.swappiness — настройка агрессивности swap:" + utils.ColorReset)
utils.Code(`# swappiness: 0100
# 0 — использовать swap только при нехватке RAM
# 60 — по умолчанию
# 100 — активно перемещать страницы в swap
# Посмотреть:
cat /proc/sys/vm/swappiness
sysctl vm.swappiness
# Изменить временно:
sudo sysctl -w vm.swappiness=10
# Постоянно в /etc/sysctl.d/99-swap.conf:
vm.swappiness = 10
vm.vfs_cache_pressure = 50 # агрессивность освобождения кэша inode`)
utils.Println(utils.ColorBold + "OOM-killer (Out Of Memory):" + utils.ColorReset)
utils.Code(`Когда память (RAM + swap) исчерпана, ядро убивает процессы.
# Посмотреть OOM-события в логах:
dmesg | grep -i "oom\|killed process"
journalctl -k | grep -i oom
# oom_score — чем выше, тем вероятнее убийство:
cat /proc/PID/oom_score
# Защитить процесс от OOM (от -17 до 15):
echo -1000 > /proc/PID/oom_score_adj # максимальная защита
# или через systemd в юните:
OOMScoreAdjust=-1000`)
// ─── 50. Планировщик процессов ───────────────────────────────
utils.Section("50. Планировщик процессов")
utils.Println("Планировщик CPU распределяет процессорное время между процессами.")
fmt.Println()
utils.Println(utils.ColorBold + "Политики планирования:" + utils.ColorReset)
utils.Code(`SCHED_OTHER — обычные процессы (CFS — Completely Fair Scheduler)
SCHED_FIFO — реального времени, без вытеснения
SCHED_RR — реального времени, с квантованием
SCHED_BATCH — фоновые задачи (CPU-bound)
SCHED_IDLE — минимальный приоритет (ниже nice 19)
SCHED_DEADLINE — задачи с дедлайном`)
utils.Println(utils.ColorBold + "nice и renice — управление приоритетом:" + utils.ColorReset)
utils.Code(`# Nice: -20 (высший приоритет) → 19 (низший)
# По умолчанию: 0
# Только root может установить отрицательные значения
# Запустить с пониженным приоритетом:
nice -n 15 make -j8 # фоновая сборка
# Запустить с повышенным (root):
sudo nice -n -10 realtime_app
# Изменить приоритет запущенного процесса:
renice -n 5 -p 1234 # по PID
renice -n 10 -u alice # всем процессам пользователя
sudo renice -n -5 -p 1234 # повысить (нужен root)`)
utils.Println(utils.ColorBold + "chrt — управление политикой планирования:" + utils.ColorReset)
utils.Command("chrt -p 1234", "показать политику процесса")
utils.Command("chrt -f -p 50 1234", "установить FIFO с приоритетом 50")
utils.Command("chrt -r 1234", "установить Round-Robin")
utils.Command("chrt -o -p 0 1234", "обычная политика (SCHED_OTHER)")
utils.Command("chrt -f 50 ./myapp", "запустить с FIFO приоритетом 50")
fmt.Println()
utils.Println(utils.ColorBold + "Просмотр загрузки CPU:" + utils.ColorReset)
utils.Command("mpstat 1 5", "загрузка каждого CPU (пакет sysstat)")
utils.Command("mpstat -P ALL 1", "все ядра каждую секунду")
utils.Command("iostat -x 1", "статистика I/O дисков")
utils.Command("sar -u 1 10", "средняя загрузка CPU 10 раз по 1 сек")
utils.Command("perf top", "top по использованию CPU (нужен perf)")
utils.Code(`# cpupower — управление частотой CPU:
cpupower frequency-info # текущий режим
cpupower frequency-set -g performance # режим производительности
# governors: performance, powersave, ondemand, conservative`)
// ─── 51. tuned ────────────────────────────────────────────────
utils.Section("51. Оптимизация производительности — tuned")
utils.Println("tuned — демон автоматической оптимизации системы по профилям.")
utils.Println("Настраивает CPU, диски, сеть под конкретные сценарии использования.")
fmt.Println()
utils.Println(utils.ColorBold + "Управление tuned:" + utils.ColorReset)
utils.Command("systemctl status tuned", "статус демона")
utils.Command("tuned-adm active", "текущий профиль")
utils.Command("tuned-adm list", "список доступных профилей")
utils.Command("tuned-adm profile throughput-performance", "применить профиль")
utils.Command("tuned-adm recommend", "рекомендованный профиль для этой системы")
utils.Command("tuned-adm off", "отключить tuned")
fmt.Println()
utils.Println(utils.ColorBold + "Встроенные профили:" + utils.ColorReset)
utils.Code(`balanced — баланс производительности и энергопотребления
powersave — минимальное энергопотребление
throughput-performance — максимальная пропускная способность (серверы)
latency-performance — минимальная задержка (без энергосбережения)
network-latency — минимальная сетевая задержка
network-throughput — максимальная сетевая пропускная способность
virtual-guest — оптимизация для виртуальных машин
virtual-host — оптимизация для хоста виртуализации
oracle — для Oracle DB
mssql — для MS SQL Server
desktop — для рабочих станций`)
utils.Println(utils.ColorBold + "Создание собственного профиля:" + utils.ColorReset)
utils.Code(`# Профили хранятся в /usr/lib/tuned/ (системные)
# и /etc/tuned/ (пользовательские)
# Создать профиль на основе существующего:
mkdir /etc/tuned/myprofile
cat > /etc/tuned/myprofile/tuned.conf << 'EOF'
[main]
summary=Мой профиль
include=throughput-performance
[cpu]
governor=performance
energy_perf_bias=performance
[disk]
readahead=>4096
[sysctl]
vm.swappiness=10
net.core.somaxconn=65535
EOF
tuned-adm profile myprofile`)
// ─── 52. Stratis ──────────────────────────────────────────────
utils.Section("52. Управление многоуровневым хранилищем — Stratis")
utils.Println("Stratis — менеджер хранилища от Red Hat (RHEL 8+).")
utils.Println("Упрощает создание пулов, снапшотов и тонкого выделения места.")
utils.Println("Работает поверх LVM и XFS.")
fmt.Println()
utils.Code(`Архитектура Stratis:
Physical Device (/dev/sdb, /dev/sdc)
Pool (пул хранилища)
Filesystem (XFS файловая система)
Особенности:
- Тонкое выделение (thin provisioning)
- Снапшоты (моментальные снимки)
- Кэширование (SSD как кэш для HDD)
- Автоматическое управление XFS`)
utils.Println(utils.ColorBold + "Установка и запуск:" + utils.ColorReset)
utils.Code(`# RHEL/Fedora:
dnf install stratisd stratis-cli
systemctl enable --now stratisd`)
utils.Println(utils.ColorBold + "Работа с пулами:" + utils.ColorReset)
utils.Code(`# Создать пул:
stratis pool create mypool /dev/sdb
stratis pool create mypool /dev/sdb /dev/sdc # из нескольких дисков
# Добавить диск в существующий пул:
stratis pool add-data mypool /dev/sdd
# Добавить кэш (SSD):
stratis pool add-cache mypool /dev/nvme0n1
# Список пулов:
stratis pool list
# Детали пула:
stratis pool info mypool`)
utils.Println(utils.ColorBold + "Работа с файловыми системами:" + utils.ColorReset)
utils.Code(`# Создать ФС в пуле:
stratis filesystem create mypool myfs
# Список ФС:
stratis filesystem list
stratis fs
# Монтирование:
mount /stratis/mypool/myfs /mnt/data
# В /etc/fstab (с x-systemd.requires):
/stratis/mypool/myfs /mnt/data xfs defaults,x-systemd.requires=stratisd.service 0 0
# Создать снапшот:
stratis filesystem snapshot mypool myfs myfs-snapshot
# Удалить ФС:
stratis filesystem destroy mypool myfs
# Удалить пул (сначала удалить все ФС):
stratis pool destroy mypool`)
utils.Note("Stratis автоматически форматирует дискипод XFS. Не используйте mkfs вручную.")
utils.Note("Снапшоты — это отдельные ФС. Можно смонтировать для восстановления файлов.")
utils.Footer()
}