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@latestgit clone https://github.com/turkprogrammer/mt.git
cd mt
go build -o bin/mt ./cmd/mtgo 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.
- Флаги командной строки (наивысший)
- Конфигурационный файл
- Значения по умолчанию
# Целевая загрузка 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| Флаг | Описание | По умолчанию |
|---|---|---|
--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 |
| Флаг | Описание | По умолчанию |
|---|---|---|
--format |
Формат входных данных (gctrace, pprof) | gctrace |
-o, --output |
Формат вывода (table, json) | table |
| Флаг | Описание | По умолчанию |
|---|---|---|
--format |
Формат входных данных (gctrace, pprof) | gctrace |
--gogc |
Значения GOGC через запятую | 50,100,200,400 |
-o, --output |
Формат вывода (table, json) | table |
mt configПокажет текущие значения GOGC, GOMEMLIMIT, GOMAXPROCS и статистику памяти. Это отправная точка — вы узнаёте, с чем работаете.
Выберите один из двух способов в зависимости от того, что доступно:
Вариант 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# Анализ gctrace
mt analyze gctrace.log
# Анализ pprof
mt analyze heap.pprof --format pprof
# Вывод в JSON (для автоматизации)
mt analyze gctrace.log --output jsonИнструмент покажет: количество сборок, общее время GC, среднюю и максимальную паузу, средний и максимальный heap, среднюю долю CPU на GC.
# Значения по умолчанию: 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, максимальная задержка
# Через флаги (временно, до перезапуска)
mt tune --gogc 50 --gome-mlimit 4GiB
# Через конфиг (постоянно)
cat > mt.yaml <<EOF
gogc: 50
gome-mlimit: 4GiB
gomax-procs: 4
EOF
mt tunemt 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