Библиотека Go (Golang) разработчика
Библиотека Go (Golang) разработчика
1 881 подписчиков · @golang_lib
К каналу →
Counterfeiter — инструмент для генерации самостоятельных, типобезопасных тестовых заглушек в Go При модульном тестировании часто нужны поддельные реализации зависимостей. В Go так…
Читать далее →
180
Препроцессоры на Go: нарушение границ или сила -toolexec Мы в Смартомато — супер продуктовые ребята. Со временем у нас скопились недовольство по поводу работы с Golang, захотелось…
Читать далее →
198

🧠 Планировщик Go (GMP): Как 100 000 горутин работают на 4 ядрах Джуны часто думают, что горутины это магия.

🧠 Планировщик Go (GMP): Как 100 000 горутин работают на 4 ядрах

Джуны часто думают, что горутины это магия. Написал go func(), и оно как-то само параллелится. Сеньоры знают, что под капотом работает безжалостная и гениальная машина Go Scheduler.

Понимание того, как он работает, спасает от жестких просадок производительности в Kubernetes. Погнали в хардкор.



ОС (Linux/Windows) ничего не знает про горутины. Она умеет работать только с потоками ОС (OS Threads). Но потоки ОС тяжелые: у них большой стек (1-8 МБ) и их очень дорого переключать (context switch). Если создать 100 000 потоков ОС, ваш сервер умрет.

Поэтому создатели Go написали свой планировщик (уровня user-space), который работает по модели G-M-P.

• G (Goroutine) - Сама горутина. Легкая (стек всего ~2 КБ), содержит код, который нужно выполнить.

• M (Machine) - Поток операционной системы. Именно он выполняет инструкции на процессоре.

• P (Processor) - Логический процессор / Контекст. У него есть локальная очередь (Local Run Queue) из горутин (G), которые ждут выполнения.

Количество P строго ограничено и по умолчанию равно количеству ядер вашего процессора (переменная GOMAXPROCS).

Как это работает в динамике?
Поток ОС (M) берет логический процессор (P), достает из его очереди горутину (G) и начинает её выполнять.
Если горутина делает сетевой запрос или засыпает (time.Sleep), поток M не блокируется! Он откладывает эту G в сторону, берет из очереди P следующую G и продолжает работу. Безотходное производство.

А что если горутина сделала тяжелый системный вызов (CGO или чтение файла)?
Тут поток M неизбежно блокируется на уровне ОС.
В этот момент планировщик Go делает финт ушами: он отрывает логический процессор P от заблокированного M, создает (или берет из пула) новый поток ОС M_new, прикрепляет к нему этот P и продолжает выполнять оставшиеся в очереди горутины. Старый M остается спать вместе со своей системной горутиной.

🔥 Киллер-фича: Work Stealing (Кража работы)
Представьте, что один P быстро выполнил все свои горутины, а у другого P в очереди их еще 100. Чтобы ядра не простаивали, свободный P пойдет к соседу и украдет у него ровно половину горутин из очереди. Коммунизм в чистом виде.


☝️ Senior Tip: Ловушка Kubernetes и CFS Quota

Вот ради чего всё это писалось.
Если вы деплоите Go-сервис в Docker/K8s и ставите ему лимит limits.cpu: "2", вы думаете, что приложению дадут 2 ядра.
Но Go при старте смотрит не на лимиты контейнера, а на железо хост-машины! Если на ноде 64 ядра, Go создаст 64 P (логических процессора) и наплодит 64 потока ОС.

Linux увидит, что контейнер с лимитом в 2 ядра пытается выполнить 64 потока, и начнет их жестко троттлить (душить). Ваш сервис начнет дико тормозить на ровном месте.

Лечение:
Всегда синхронизируйте GOMAXPROCS с лимитами контейнера. Лучший способ - добавить один импорт в main.go, который сделает это автоматически при старте:

import _ "go.uber.org/automaxprocs"

#golang #underhood #architecture #performance #devops

👉 @golang_lib
Ты не все знаешь о массивах и слайсах в Go Таймкоды: 00:00 - Введение 00:47 - Устройство массивов в Go 01:40 - Работа с массивами в Go 10:00 - Перемещение массива в стеке 11:29 - …
Читать далее →
168
Как мы ускорили Golang-тесты на CI В этой статье я расскажу о том, как желание улучшить свой рабочий процесс CI помогло ускорить все golang-пайплайны в PaaS СберМаркета. В СберМа…
Читать далее →
170
Другие главы канала «Библиотека Go (Golang) разработчика»
Выберите главу, чтобы продолжить чтение
Все посты →
Глава от 11.06.2026
📜 Паттерн Saga: Как откатить то, что откатить нельзя Представьте классическую з…
👁 275 просмотров
Глава от 09.06.2026
🔄 Идемпотентность: Как не списать деньги дважды при ретраях Худшее, что может с…
👁 328 просмотров
Глава от 27.05.2026
📦 go mod: Хватит удалять go.sum, когда что-то сломалось Управление зависимостям…
👁 580 просмотров
Глава от 14.05.2026
🗑 Сборщик мусора в Go: Скрытый налог на ваш CPU Если вы спросите джуна, как раб…
👁 588 просмотров
Глава от 08.05.2026
🧬 Generics: Как перестать писать Java на Go Мы ждали их 10 лет. И вот, когда он…
👁 572 просмотров
Глава от 04.05.2026
🧩 Struct Padding: Как вы теряете гигабайты памяти на ровном месте Знаете это чу…
👁 583 просмотров
Глава от 30.04.2026
🚀 PGO: Как получить +10% к скорости, не написав ни строчки кода Все мы любим оп…
👁 617 просмотров
Глава от 26.04.2026
🌪 Fuzzing: Ломаем свой код, пока это не сделали другие Мы привыкли писать Unit-…
👁 670 просмотров
Глава от 24.04.2026
Челлендж по обработке миллиарда строк на Go: от 1 минуты 45 секунд до 4 секунд …
👁 660 просмотров

Популярные посты канала «Библиотека Go (Golang) разработчика»

Хватит мучить sync.WaitGroup для HTTP-запросов Каждый джун проходит этот путь: 1. Запускаем 10 горутин через go func(). 2. Добавляем wg.Ad…
👁 755 просмотров
JSON быстрее, чем вы думаете Стандартный encoding/json в Go надежный, но... медленный. Он активно использует рефлексию, что бьет по CPU на …
👁 755 просмотров
"Семафор". Не убей базу данных Запустить 10,000 горутин в Go дешево. А вот открыть 10,000 коннектов к базе или внешнему API - дорого и боль…
👁 698 просмотров
🌪 Fuzzing: Ломаем свой код, пока это не сделали другие Мы привыкли писать Unit-тесты по принципу: "Я ожидаю, что если подать А, выйдет Б". …
👁 670 просмотров
Челлендж по обработке миллиарда строк на Go: от 1 минуты 45 секунд до 4 секунд Пару недель назад я прочитал о запавшем мне в душу челлендже…
👁 660 просмотров
Context Cancellation - это не kill -9 Одна из самых частых иллюзий у разработчиков, приходящих в Go: "Я вызвал cancel(), почему моя горутин…
👁 660 просмотров
🧪 Table-Driven Tests: Хватит плодить функции-клоны Проверяю PR джуниора. Файл на 500 строк, из них 450 - это тесты. Смотрю внимательнее, а …
👁 658 просмотров
🚀 PGO: Как получить +10% к скорости, не написав ни строчки кода Все мы любим оптимизировать. Переписываем мапы, пулим объекты в sync.Pool, …
👁 617 просмотров
🗑 Сборщик мусора в Go: Скрытый налог на ваш CPU Если вы спросите джуна, как работает память в Go, он ответит: "Ну, там есть GC, он сам всё …
👁 588 просмотров
🧩 Struct Padding: Как вы теряете гигабайты памяти на ровном месте Знаете это чувство, когда вы долго проектируете структуру, высчитываете т…
👁 583 просмотров
📦 go mod: Хватит удалять go.sum, когда что-то сломалось Управление зависимостями в Go выглядит элегантно: написал import, сделал go mod tid…
👁 580 просмотров
🧬 Generics: Как перестать писать Java на Go Мы ждали их 10 лет. И вот, когда они появились, код-ревью превратились в выставку угловых скобо…
👁 572 просмотров
🔄 Идемпотентность: Как не списать деньги дважды при ретраях Худшее, что может сделать ваш микросервис, это упасть с пятисоткой. Нет, вру. Х…
👁 328 просмотров
📜 Паттерн Saga: Как откатить то, что откатить нельзя Представьте классическую задачу: клиент нажимает кнопку «Купить тур». Вашему бэкенду н…
👁 275 просмотров
Тихая смерть памяти c time.After Внутри select часто используют таймеры для отмены долгих операций. Но есть нюанс, который может положить в…
👁 253 просмотров
🚧 Errors in Go: Хватит сравнивать ошибки через == Знакомая картина? Вы пишете запрос к базе, получаете ошибку, оборачиваете её для логов и …
👁 229 просмотров
⚡Memory Alignment: Когда порядок полей стоит гигабайты Часто при проектировании структур мы группируем поля логически: ID рядом с Name, фла…
👁 222 просмотров
Препроцессоры на Go: нарушение границ или сила -toolexec Мы в Смартомато — супер продуктовые ребята. Со временем у нас скопились недовольст…
👁 198 просмотров
Counterfeiter — инструмент для генерации самостоятельных, типобезопасных тестовых заглушек в Go При модульном тестировании часто нужны подд…
👁 180 просмотров
Как мы ускорили Golang-тесты на CI В этой статье я расскажу о том, как желание улучшить свой рабочий процесс CI помогло ускорить все golang…
👁 170 просмотров

Связанные темы в других каналах

Каналы из той же тематики, где часто появляются близкие сюжеты
Вся тема →
@canalmaxone
AntiCloudMod
AntiCloudMod — сообщество для тех, кто ценит свободу общения без облачной цензуры. Здесь обсуждают альтернативные мессенджеры, инструменты для приватности и децентрализов…
👥 374 683 · +72 163/7д
@WylsacomRed
Wylsacom Red
Официальный канал Wylsacom в Max. Тут всё про технологии и жизнь в ногу со временем! Номер заявления для регистрации в РКН: № 6979154178 Розыгрыши: kichaev@wylsacom.med…
👥 154 385 · +9 461/7д
@BelgorodDRONE
Информация БПЛА Белгород, Белгородский район
Информация БПЛА Белгород, Белгородский район — специализированный канал в мессенджере Макс, посвященный новостям и информации о беспилотных летательных аппаратах в регион…
👥 138 491 · +8 057/7д
@TikTokModCloud
TikTokModCloud
Официальные обновления стабильного мода TikTok Чат: https://clck.ru/3S6mVh По рекламе: https://iimax.ru/dim4ugan
👥 82 773 · +18 684/7д
@hitech
Hi-Tech
Оперативные новости, обзоры гаджетов, собственное видео, трансляции мировых анонсов и мероприятий По вопросам сотрудничества и размещения рекламы i.ostapenko@corp.mail.r…
👥 53 217 · -166/7д
@na_kruchok
ГЛЕНТ | МЕМЫ
Глент мемы Это фан-сообщество, созданное преданными поклонниками для поддержки творчества Глента. Данный канал НЕ является официальным и ведется фанатом.
👥 44 842 · +33 823/7д
🏷 Темы и теги
#golang #underhood #architecture #performance #devops #go разработка #библиотеки go #материалы для go #golang советы #Технологии
📋 О канале Библиотека Go (Golang) разработчика
Погрузись в мир Golang с библиотекой полезных материалов: от новых библиотек и фреймворков до лучших практик и советов по оптимизации. Канал для тех, кто хочет писать эффективный и чистый код на Go. Ежедневные подборки, обзоры инструментов и лайфхаки от сообщества разработчиков. Подписывайся, чтобы не пропустить ничего важного для своего роста как Go-разработчика.
🔍 Архив всех постов Макс
Поиск по 8,617,524 постам из 201,174 каналов
Попробовать за 1 ₽ →
Удалить пост или канал с МАКСОТЕКИ
Заявка подтверждается через бота Макс: нужно быть администратором канала и добавить бота МАКСОТЕКИ в администраторы. После проверки канал или конкретный пост скрывается с сайта.
📊 Аналитика канала «Библиотека Go (Golang) разработчика» ➡️ Перейти в канал Макс
Заявка в МАКСОТЕКА
Добавьте свой канал в каталог
Зарегистрируйтесь в личном кабинете и добавьте канал за пару кликов.
Перейти в личный кабинет →

Бесплатная регистрация, быстрая модерация.