264 lines
13 KiB
Go
Executable file
264 lines
13 KiB
Go
Executable file
package linuxmodules
|
||
|
||
import (
|
||
"fmt"
|
||
"rubric/utils"
|
||
)
|
||
|
||
var PerformanceModule = Module{
|
||
Key: "performance",
|
||
Aliases: []string{"perf", "swap", "tuned", "производительность"},
|
||
Title: "Производительность системы",
|
||
Description: "Темы 49–52: виртуальная память, планировщик 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: 0–100
|
||
# 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()
|
||
}
|