Новости

Post Thumbnail

Go конкурентность в C

Автор исследует, насколько близко можно воспроизвести конкурентную модель Go на чистом C с помощью только POSIX-потоков. Это делается для проекта Solod - строгого подмножества Go, транслируемого в C без рантайма и сборщика мусора. Реализация построена на д...

Post Thumbnail

OpenTelemetry в комптайме

Разрабы OpenTelemetry объявили о первом стабильном релизе Go Compile-Time Instrumentation (v1) Новый инструмента otelc, который встраивает телеметрию в Go-бинарник на этапе компиляции через механизм -toolexec, без правок исходного кода и без отдельного кода...

Post Thumbnail

Объединение запросов

Статья объясняет технику объединения запросов на Go с помощью пакета singleflight для борьбы с проблемой "громового стада". Когда после истечения популярного ключа в кэше сотни одновременных запросов промахиваются и каждый выполняет собственный идентичный запр...

Post Thumbnail

mmap или pread

Автор статьи - инженер из VictoriaMetrics. На примере реального движка хранения VictoriaLogs разбирает выбор между системным вызовом pread и отображением файла в память mmap при чтении байтов из файлов. Автор объясняет, что pread имеет заметную цену: каждый...

Post Thumbnail

TypeScript переписали на Go

Команда Microsoft с помощью AI переписала компилятор TypeScript 7.0 на Go, а не на Rust (шах и мат!). Команда добилась примерно десятикратного ускорения сборки, и автор использует это как повод доказать, что Go - оптимальный язык для эпохи агентной разработки ...

Post Thumbnail

На 49% быстрее из-за выравнивания

Разбор неожиданной оптимизации в Go: сдвиг массива на 4 байта через добавление padding-поля ускоряет операцию обнуления на 49% на Intel и на 9% на AMD. Обнуляция - это что-то типо b.data = [words]uint32{} Но почему так происходит? Компилятор генерирует инст...

Post Thumbnail

Активация сокетов

Автор рассказывает, как с помощью сокет-активации systemd запускать Go-сервис только когда в него реально приходит запрос, чтобы не тратить память и CPU. systemd сам открывает и слушает сокет на нужном порту, а при первом подключении запускает сервер, пере...

Post Thumbnail

Джину уже 12 лет

Ману Мартинес-Алмейда рассказывает историю как он создавал Gin - одного из самых популярных веб-фреймворков для Go, который вырос из его несостоявшегося стартапа Fyve и разрабатывался по принципу "простое важнее легкого". Вдохновившись выступлением Роба Па...

Post Thumbnail

zero-copy-оптимизации

Разбор zero-copy-оптимизаций в Go. Когда вы передаете `*os.File` напрямую `в io.Copy(conn, f)`, рантайм распознает это через цепочку type-assertions и вызывает `sendfile(2)`, передавая данные из кеша странички в сокет без копирования в юзерспейсе. Но вот к...

Post Thumbnail

WAL-RUS

ClickHouse Cloud переписали утилиту для бэкапов и WAL-архивирования Postgres с Go на Rust. В результате появился WAL-RUS - опенсорсный инструмент, у которого пиковое потребление виртуальной памяти более чем на 70% ниже, чем у WAL-G. Это достигнуто за счет прям...

Post Thumbnail

Профилирование

Статья разбирает пять встроенных профилировщиков в Go (CPU, heap, block, mutex и goroutine), показывая, что все они собирают данные в единый pprof-формат, но отличаются способом записи. CPU-профайлер работает асинхронно через сигналы ОС и кольцевой буфер. Heap...

Post Thumbnail

6 популярных кешей

Автор сравнивает шесть подходов к реализации потокобезопасного in-memory кеша в Go. От наивного map без блокировок до copy-on-write через atomic.Pointer и все это на своем на 20-ядерном i7-14700K под разными нагрузками - read-only, read-heavy, write-heavy. ...

Post Thumbnail

Детектор утечек горутин

В Go 1.27 в runtime/pprof добавляется встроенный детектор утечек горутин, принятый из предложения Uber. В отличие от uber-go/goleak, который работает только в тестах и дает ложные срабатывания на живом сервере, новый профиль goroutineleak через сборщик мусо...

Post Thumbnail

Мидделвари лимитеров

При использовании цепочки мидлварей, которые выполняют какие-то ограничения, в Go внутренний обработчик не может ослабить ограничение, установленное внешним, так как каждый мидлварь оборачивает тело запроса в новый ограничитель - внешний срабатывает первым. ...

Post Thumbnail

Рефлексия

Статья о том, как устроен пакет reflect в Go. Он, кстати, не вычисляет как-то хитро информацию о типах в рантайме - он просто читает статические дескрипторы, которые компилятор встроил в исполняемый файл на этапе сборки. Каждый тип, подпадающий под интерфе...

Post Thumbnail

Зеро аллокации

Все мы знаем, что пустая структура struct{} в Go действительно занимает ноль байт. Но как это реализовано? Во время выполнения среда не выделяет под нее память, а вместо этого возвращает указатель на глобальную переменную zerobase, поэтому все экземпляры s...

Post Thumbnail

Уровни микроархитектуры amd64

Возможно вы слышали про уровни микроархитектуры. Каждый уровень включает в себя набор расширений набора команд. Тулинг Go предоставляет доступ к настройке уровней через переменную окружения GOAMD64 Наши 64-битные процессоры Intel и AMD совершенствовались на...

Post Thumbnail

Wi-Fi данные

Не знаю зачем вам это может буть нужно, но мне всегда нравятся статьи по работе с сетью. Вот в этой статье про то, как добраться до данных Wi-Fi в macOS Apple удалила утилиту airport в macOS Sonoma 14.4, а ее замена wdutil скрывает BSSID и другие данные ка...

Post Thumbnail

Golang Ревью

Продолжение серии заметок о неочевидных и опасных поведениях Go, дополнение к первой части 2024 года. Автор освещает ряд проблем: - тихие целочисленные переполнения, где тип int зависит от архитектуры, что ведёт к реальным уязвимостям вроде SQL-инъекций ...

Post Thumbnail

Эээксперименты

В Go есть "экспериментальные" возможности, чтобы вы могли опробовать новые функции или изменения в поведении до того, как они будут окончательно зафиксированы. Но знаете ли вы, как их найти и включить или как они переходят в статус общедоступных? Алекс объясня...

Post Thumbnail

TigerFS

Файловая система — это просто API. А TigerFS — это файловая система, работающая поверх PostgreSQL. Файлы становятся строками в БД, директории — таблицами, а YAML-фронтматер — колонками. Поддерживается два режима. В "file-first" монтируешь БД и работаешь с о...