Skip to content

turkprogrammer/mt

Repository files navigation

mt — Тюнер Go runtime

Go Version

Описание

mt — CLI-утилита для тонкой настройки Go runtime. Управляет параметрами GOGC, GOMEMLIMIT, GOMAXPROCS, debug.SetGCPercent и SetPanicOnFault.

Баланс: производительность ↔ потребление памяти ↔ задержка сборщика мусора ↔ нагрузка на CPU.

Главное преимущество: анализирует логи GODEBUG=gctrace=1 и pprof heap-профили, моделирует разные значения GOGC и показывает результат в виде: «GOGC=50 → heap -30%, CPU +8%, p99 латентность -15ms».

Интерактивная демонстрация

Откройте mtrade.html в браузере для интерактивной симуляции trade-off между heap, CPU и задержкой. Слайдеры позволяют менять baseline GOGC, live heap и CPU fraction в реальном времени.

Установка

Из исходников

go install github.com/turkprogrammer/mt/cmd/mt@latest

Сборка из репозитория

git clone https://github.com/turkprogrammer/mt.git
cd mt
go build -o bin/mt ./cmd/mt

Сборка с версией

go build -ldflags "-X main.version=1.0.0 \
  -X main.commit=$(git rev-parse --short HEAD) \
  -X main.date=$(date -u +%Y-%m-%dT%H:%M:%SZ)" \
  -o bin/mt ./cmd/mt

Быстрый старт

# Показать текущую конфигурацию
mt config

# Применить настройки из mt.yaml
mt tune

# Применить настройки через флаги
mt tune --gogc 50 --gome-mlimit 4GiB

# Проанализировать gctrace лог
mt analyze gctrace.log

# Симулировать разные GOGC
mt simulate gctrace.log --gogc 50,100,200

Команды

Команда Описание
mt tune Применить настройки Go runtime
mt analyze <файл> Анализ gctrace/pprof
mt simulate <файл> Симуляция GOGC с trade-off
mt config Текущая конфигурация
mt version Версия

Конфигурация

Конфигурация загружается из файла mt.yaml в текущей директории или $HOME/mt.yaml.

Порядок приоритетов

  1. Флаги командной строки (наивысший)
  2. Конфигурационный файл
  3. Значения по умолчанию

Пример mt.yaml

# Целевая загрузка heap (в процентах)
# 100 = стандартное поведение, 50 = heap в 1.5x, 200 = heap в 3x
# -1 = отключить GC
gogc: 100

# Ограничение памяти Go runtime
# Примеры: "4GiB", "2048MB", "2147483648" (байты)
gome-mlimit: ""

# Максимальное количество процессоров (GOMAXPROCS)
# 0 = автоматически (NumCPU)
goma-xprocs: 0

# Процент heap перед GC (синоним GOGC)
# 0 = не менять
gc-percent: 0

# Вызывать panic при fault
panic-on-fault: false

# Уровень логирования
log-level: info

Флаги

tune

Флаг Описание По умолчанию
--gogc Целевая загрузка heap (в процентах, -1 = отключить GC) 100
--gome-mlimit Ограничение памяти (например 4GiB, 2048MB) ""
--gomax-procs Максимальное количество процессоров (0 = авто) 0
--gc-percent Процент heap перед GC (синоним GOGC) 0
--panic-on-fault Вызывать panic при fault false

analyze

Флаг Описание По умолчанию
--format Формат входных данных (gctrace, pprof) gctrace
-o, --output Формат вывода (table, json) table

simulate

Флаг Описание По умолчанию
--format Формат входных данных (gctrace, pprof) gctrace
--gogc Значения GOGC через запятую 50,100,200,400
-o, --output Формат вывода (table, json) table

Руководство по использованию

Шаг 1: Проверить текущую конфигурацию

mt config

Покажет текущие значения GOGC, GOMEMLIMIT, GOMAXPROCS и статистику памяти. Это отправная точка — вы узнаёте, с чем работаете.

Шаг 2: Собрать данные профилирования

Выберите один из двух способов в зависимости от того, что доступно:

Вариант A — лог gctrace (проще, не требует изменений в коде):

GODEBUG=gctrace=1 ./myapp 2> gctrace.log

Запустите приложение под нагрузкой, затем остановите. Лог будет содержать строки вида:

gc 1 @0.010s 2%: 0.023+1.2+0.012 ms clock, 0.18+0.91/1.1/0.036+0.098 ms cpu, 4->4->2 MB, 5 MB goal, 8 P

Вариант B — pprof heap-профиль (точнее, но требует подключения net/http/pprof):

go tool pprof http://localhost:6060/debug/pprof/heap > heap.pprof

Шаг 3: Проанализировать данные

# Анализ gctrace
mt analyze gctrace.log

# Анализ pprof
mt analyze heap.pprof --format pprof

# Вывод в JSON (для автоматизации)
mt analyze gctrace.log --output json

Инструмент покажет: количество сборок, общее время GC, среднюю и максимальную паузу, средний и максимальный heap, среднюю долю CPU на GC.

Шаг 4: Симулировать разные GOGC

# Значения по умолчанию: 50, 100, 200, 400
mt simulate gctrace.log

# Пользовательские значения
mt simulate gctrace.log --gogc 25,50,100,200,400,800

# На основе pprof
mt simulate heap.pprof --format pprof

Таблица показывает для каждого GOGC: размер heap, нагрузку на CPU, частоту сборок, p99-задержку и описание компромисса.

Пример вывода:

GOGC  Heap (MB)  CPU overhead  Частота GC  Задержка p99 (мс)  Trade-off
50    80.2       53.4%         0.32x       0.1                +29% heap, +53% CPU, низкая задержка
100   106.9      26.7%         0.16x       0.1                baseline — стандартное поведение
200   160.3      13.3%         0.08x       0.1                +159% heap, -13% CPU, выше задержка
400   267.2      6.7%          0.04x       0.2                +331% heap, минимум CPU, максимальная задержка

Шаг 5: Применить настройки

# Через флаги (временно, до перезапуска)
mt tune --gogc 50 --gome-mlimit 4GiB

# Через конфиг (постоянно)
cat > mt.yaml <<EOF
gogc: 50
gome-mlimit: 4GiB
gomax-procs: 4
EOF
mt tune

Шаг 6: Проверить результат

mt config

Убедитесь, что параметры применились. Затем соберите новый профиль и повторите анализ (шаги 2–3), чтобы проверить результат.

Типичные сценарии

Задача Команда
Уменьшить потребление памяти mt simulate gctrace.log --gogc 25,50,100 → выбрать GOGC < 100
Снизить задержку сборщика мусора mt simulate gctrace.log --gogc 200,400,800 → выбрать GOGC > 100
Ограничить память в контейнере mt tune --gome-mlimit 80% от лимита контейнера
Эксперимент с GOMAXPROCS mt tune --gomax-procs 2 → измерить латентность
Автоматизация в CI mt analyze gctrace.log --output json → парсить JSON

Лицензия

MIT

About

mt — инструмент для настройки параметров Go runtime. Настраивает GOGC, GOMEMLIMIT, GOMAXPROCS, debug.SetGCPercent и SetPanicOnFault для вашего сервиса.

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors