# Gopheria > Go, beneath the surface. Deep dives into the Go runtime, concurrency, performance, and the trade-offs behind clean abstractions. Every behaviour or performance claim here names the Go version and the machine it was measured on, ships a command you can run, and pastes the output rather than summarising it. The harnesses are kept runnable at https://github.com/CognatePress/experiments.gopheria.com. Article prose is © Gopheria, all rights reserved; code samples inside articles are MIT. Every post is also served as plain Markdown at its URL plus `.md`, carrying a canonical Link header back to the HTML page — quote from either. - Language: en-US - Author: Nolan Keir - Measured on: go1.27.0 darwin/arm64, Apple M4 Pro, 12 cores, macOS 26.6.2 - Full text: https://gopheria.com/llms-full.txt - Feed: https://gopheria.com/rss.xml ## Start here - [What the Go scheduler does when your goroutine blocks](https://gopheria.com/blog/go-scheduler-blocking-goroutine/): 2026-08-25 · Runtime internals · A blocking syscall costs an OS thread. A blocking network read costs nothing. Measured with 200 goroutines, GOMAXPROCS=2 and a thread count. · Markdown: https://gopheria.com/blog/go-scheduler-blocking-goroutine.md - [sync.Pool survives one GC, not two](https://gopheria.com/blog/sync-pool-under-gc-pressure/): 2026-08-27 · Runtime internals · A pool holding 100 objects lost none across one collection and all 100 across two. Here is the victim cache, and what it costs at 122,000 ops per millisecond. · Markdown: https://gopheria.com/blog/sync-pool-under-gc-pressure.md - [Escape analysis is not a rule of thumb](https://gopheria.com/blog/escape-analysis-is-not-a-rule-of-thumb/): 2026-08-26 · Performance and measurement · The compiler said "does not escape" and the benchmark reported 104 KiB per operation. Both were right. What -gcflags=-m actually tells you. · Markdown: https://gopheria.com/blog/escape-analysis-is-not-a-rule-of-thumb.md ## Posts - [The GOGC I set next to GOMEMLIMIT never fired](https://gopheria.com/blog/gogc-and-gomemlimit-are-different-knobs/): 2026-10-04 · Runtime internals · GOGC=100 with a 256 MiB limit produced exactly what GOGC=off produced: same collections, same CPU share, same throughput. The tighter rule binds, the other goes quiet. · Markdown: https://gopheria.com/blog/gogc-and-gomemlimit-are-different-knobs.md - [A 404 from net/http costs 62 allocations](https://gopheria.com/blog/http-router-dispatch-cost/): 2026-09-27 · Ecosystem and tooling · A static route through net/http's mux costs 85.6 ns and nothing on the heap. A path that matches no pattern costs 2125.5 ns and 62 allocations. · Markdown: https://gopheria.com/blog/http-router-dispatch-cost.md - [The mutex was 68 times faster, until I added work](https://gopheria.com/blog/mutex-versus-channel-at-contention/): 2026-09-20 · Concurrency in practice · One goroutine: 2.5 ns for the mutex, 172.6 ns for the channel. Sixteen goroutines with real work: the channel wins by less than the harness's own error. · Markdown: https://gopheria.com/blog/mutex-versus-channel-at-contention.md - [A 1 MiB goroutine stack costs 136µs and reports 144 B/op](https://gopheria.com/blog/goroutine-stacks-grow-by-copying/): 2026-09-13 · Runtime internals · Reaching a 1 MiB stack copied it nine times. The copying cost 136µs of CPU that -benchmem reports as 144 bytes, because stack memory is not heap memory. · Markdown: https://gopheria.com/blog/goroutine-stacks-grow-by-copying.md - [benchstat reported p=0.000 between a function and itself](https://gopheria.com/blog/benchstat-or-it-didnt-happen/): 2026-09-06 · Performance and measurement · Two sub-benchmarks calling the same function with the same argument came back 1.10% apart at p=0.000. What a benchmark measures is not only your code. · Markdown: https://gopheria.com/blog/benchstat-or-it-didnt-happen.md - [GOMAXPROCS is not your thread count](https://gopheria.com/blog/gomaxprocs-is-not-thread-count/): 2026-08-30 · Runtime internals · GOMAXPROCS=1 with 200 goroutines blocked in read(2) produced 202 OS threads. Measured on go1.27.0, alongside the container case Go 1.25 changed. · Markdown: https://gopheria.com/blog/gomaxprocs-is-not-thread-count.md - [sync.Pool survives one GC, not two](https://gopheria.com/blog/sync-pool-under-gc-pressure/): 2026-08-27 · Runtime internals · A pool holding 100 objects lost none across one collection and all 100 across two. Here is the victim cache, and what it costs at 122,000 ops per millisecond. · Markdown: https://gopheria.com/blog/sync-pool-under-gc-pressure.md - [Escape analysis is not a rule of thumb](https://gopheria.com/blog/escape-analysis-is-not-a-rule-of-thumb/): 2026-08-26 · Performance and measurement · The compiler said "does not escape" and the benchmark reported 104 KiB per operation. Both were right. What -gcflags=-m actually tells you. · Markdown: https://gopheria.com/blog/escape-analysis-is-not-a-rule-of-thumb.md - [What the Go scheduler does when your goroutine blocks](https://gopheria.com/blog/go-scheduler-blocking-goroutine/): 2026-08-25 · Runtime internals · A blocking syscall costs an OS thread. A blocking network read costs nothing. Measured with 200 goroutines, GOMAXPROCS=2 and a thread count. · Markdown: https://gopheria.com/blog/go-scheduler-blocking-goroutine.md ## Topics - [Runtime internals](https://gopheria.com/category/internals/): The scheduler, the memory allocator, the garbage collector, goroutine stacks, the netpoller, runtime/trace. What actually happens beneath a language feature. 5 articles. - [Performance and measurement](https://gopheria.com/category/performance/): Benchmarking method, profiling, allocation, escape analysis and compiler behaviour — the subject where the evidence standard is most visible. 2 articles. - [Concurrency in practice](https://gopheria.com/category/concurrency/): Channels, sync, context, and the patterns that survive production rather than the ones that only survive blog posts. 1 article. - [Ecosystem and tooling](https://gopheria.com/category/ecosystem/): Frameworks, libraries, the standard library's edges and the toolchain, judged against the same evidence standard as everything else. 1 article. - [All tags](https://gopheria.com/tags/): the finer-grained tag vocabulary, one archive per tag. ## Series - [Runtime internals](https://gopheria.com/series/runtime-internals/): What the Go runtime actually does underneath the parts of the language you write every day — scheduling, allocation, and the garbage collector — measured rather than asserted. 4 parts, in reading order. ## Pages - [About](https://gopheria.com/about/): Gopheria is a technical journal about Go, its runtime and its ecosystem, written by Nolan Keir and built on reproducible experiments. ## Optional - [Archive](https://gopheria.com/archive/): every post on one page, grouped by year. Everything above under ## Posts. - [Privacy Policy](https://gopheria.com/privacy/): What Gopheria processes when you read it, why, on what legal basis, and the rights you have under the GDPR. Short version - almost nothing. - [Cookie Policy](https://gopheria.com/cookies/): Gopheria sets no cookies. This page explains what that means under the ePrivacy Directive, what is stored on your device, and why there is no banner. - [Terms of Use](https://gopheria.com/terms/): The terms that apply to reading and reusing Gopheria. Prose is all rights reserved, code samples are MIT, and your statutory rights are untouched.