Skip to content

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 = отключить GCgogc: 100# Ограничение памяти Go runtime# Примеры: "4GiB", "2048MB", "2147483648" (байты)gome-mlimit: ""# Максимальное количество процессоров (GOMAXPROCS)# 0 = автоматически (NumCPU)goma-xprocs: 0# Процент heap перед GC (синоним GOGC)# 0 = не менятьgc-percent: 0# Вызывать panic при faultpanic-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 при faultfalse

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 <<EOFgogc: 50gome-mlimit: 4GiBgomax-procs: 4EOF
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% от лимита контейнера
Эксперимент с GOMAXPROCSmt tune --gomax-procs 2 → измерить латентность
Автоматизация в CImt analyze gctrace.log --output json → парсить JSON

Лицензия

MIT

About

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

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages