<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Performance on Bits, Trades &amp; Systems</title>
    <link>https://blog.turboawesome.win/tags/performance/</link>
    <description>Recent content in Performance on Bits, Trades &amp; Systems</description>
    <generator>Hugo</generator>
    <language>en-us</language>
    <lastBuildDate>Wed, 09 Oct 2024 13:00:00 +0000</lastBuildDate>
    <atom:link href="https://blog.turboawesome.win/tags/performance/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Tail-Based Trace Sampling: Why Head Sampling Is Usually Wrong</title>
      <link>https://blog.turboawesome.win/2024/10/tail-based-trace-sampling-why-head-sampling-is-usually-wrong/</link>
      <pubDate>Wed, 09 Oct 2024 13:00:00 +0000</pubDate>
      <guid>https://blog.turboawesome.win/2024/10/tail-based-trace-sampling-why-head-sampling-is-usually-wrong/</guid>
      <description>Head-based sampling decides whether to trace a request at the start. Tail-based sampling decides after the request completes. For finding latency outliers and errors, tail-based sampling is almost always what you want — and almost never what gets implemented.</description>
    </item>
    <item>
      <title>Go&#39;s net/http: Building Production HTTP Servers Without a Framework</title>
      <link>https://blog.turboawesome.win/2023/07/gos-net/http-building-production-http-servers-without-a-framework/</link>
      <pubDate>Wed, 05 Jul 2023 10:44:00 +0000</pubDate>
      <guid>https://blog.turboawesome.win/2023/07/gos-net/http-building-production-http-servers-without-a-framework/</guid>
      <description>Go&amp;#39;s standard net/http package is capable enough for most production workloads without a framework. What &amp;#39;capable enough&amp;#39; means in practice, and the patterns for middleware, graceful shutdown, and observability.</description>
    </item>
    <item>
      <title>Memory Layout in Go: Structs, Alignment, and Cache Performance</title>
      <link>https://blog.turboawesome.win/2022/08/memory-layout-in-go-structs-alignment-and-cache-performance/</link>
      <pubDate>Wed, 17 Aug 2022 10:03:00 +0000</pubDate>
      <guid>https://blog.turboawesome.win/2022/08/memory-layout-in-go-structs-alignment-and-cache-performance/</guid>
      <description>Go&amp;#39;s struct layout follows alignment rules that affect both memory consumption and cache performance. Understanding them matters more than most Go developers realise.</description>
    </item>
    <item>
      <title>Go&#39;s Scheduler: GOMAXPROCS, Work Stealing, and Why It Matters</title>
      <link>https://blog.turboawesome.win/2020/08/gos-scheduler-gomaxprocs-work-stealing-and-why-it-matters/</link>
      <pubDate>Wed, 12 Aug 2020 10:27:00 +0000</pubDate>
      <guid>https://blog.turboawesome.win/2020/08/gos-scheduler-gomaxprocs-work-stealing-and-why-it-matters/</guid>
      <description>Go&amp;#39;s M:N scheduler is one of the reasons goroutines are cheap enough to use liberally. Understanding how it works changes how you reason about concurrency bugs and performance anomalies.</description>
    </item>
    <item>
      <title>Building a High-Throughput Event Pipeline in Go Without Losing Your Mind</title>
      <link>https://blog.turboawesome.win/2020/07/building-a-high-throughput-event-pipeline-in-go-without-losing-your-mind/</link>
      <pubDate>Wed, 01 Jul 2020 14:30:00 +0000</pubDate>
      <guid>https://blog.turboawesome.win/2020/07/building-a-high-throughput-event-pipeline-in-go-without-losing-your-mind/</guid>
      <description>Channels are Go&amp;#39;s concurrency primitive, but a naive pipeline of goroutines and channels won&amp;#39;t survive high throughput. The patterns that scale: batching, backpressure, worker pools, and knowing when to abandon channels entirely.</description>
    </item>
    <item>
      <title>Profiling Go Services in Production with pprof</title>
      <link>https://blog.turboawesome.win/2020/04/profiling-go-services-in-production-with-pprof/</link>
      <pubDate>Wed, 01 Apr 2020 10:18:00 +0000</pubDate>
      <guid>https://blog.turboawesome.win/2020/04/profiling-go-services-in-production-with-pprof/</guid>
      <description>Go&amp;#39;s pprof tooling is built in, low-overhead, and more useful than most engineers realise. Here&amp;#39;s how to capture CPU and memory profiles from production services and actually read what they tell you.</description>
    </item>
    <item>
      <title>Go Benchmarks: Writing Ones That Actually Tell You Something</title>
      <link>https://blog.turboawesome.win/2020/03/go-benchmarks-writing-ones-that-actually-tell-you-something/</link>
      <pubDate>Tue, 17 Mar 2020 09:29:00 +0000</pubDate>
      <guid>https://blog.turboawesome.win/2020/03/go-benchmarks-writing-ones-that-actually-tell-you-something/</guid>
      <description>Go&amp;#39;s built-in benchmark framework is excellent, but it&amp;#39;s easy to write benchmarks that measure the wrong thing — compiler optimisations, cache warming artifacts, or benchmark overhead rather than the code under test.</description>
    </item>
    <item>
      <title>Goroutines Are Not Threads: The Mental Model Shift</title>
      <link>https://blog.turboawesome.win/2019/04/goroutines-are-not-threads-the-mental-model-shift/</link>
      <pubDate>Mon, 22 Apr 2019 13:07:00 +0000</pubDate>
      <guid>https://blog.turboawesome.win/2019/04/goroutines-are-not-threads-the-mental-model-shift/</guid>
      <description>Coming from Java, I initially modelled goroutines as lightweight threads. That model is mostly right but subtly wrong in ways that matter — understanding the Go scheduler changes how you think about goroutine lifecycle and blocking.</description>
    </item>
    <item>
      <title>Backpressure in Practice: Keeping Fast Producers from Killing Slow Consumers</title>
      <link>https://blog.turboawesome.win/2018/06/backpressure-in-practice-keeping-fast-producers-from-killing-slow-consumers/</link>
      <pubDate>Thu, 14 Jun 2018 10:33:00 +0000</pubDate>
      <guid>https://blog.turboawesome.win/2018/06/backpressure-in-practice-keeping-fast-producers-from-killing-slow-consumers/</guid>
      <description>Every system has components that produce faster than consumers can handle under some conditions. Backpressure is the mechanism by which fast producers are slowed rather than dropping data or consuming unbounded memory. Here&amp;#39;s what the options look like in practice.</description>
    </item>
    <item>
      <title>Project Loom Preview: Virtual Threads and What They Mean for Server Code</title>
      <link>https://blog.turboawesome.win/2018/05/project-loom-preview-virtual-threads-and-what-they-mean-for-server-code/</link>
      <pubDate>Thu, 24 May 2018 09:38:00 +0000</pubDate>
      <guid>https://blog.turboawesome.win/2018/05/project-loom-preview-virtual-threads-and-what-they-mean-for-server-code/</guid>
      <description>Project Loom&amp;#39;s virtual threads promise to fix Java&amp;#39;s thread-per-request scalability problem by making millions of lightweight threads practical. Here&amp;#39;s what the early design looked like and why it matters for server-side Java.</description>
    </item>
    <item>
      <title>Reading GC Logs Like a Detective</title>
      <link>https://blog.turboawesome.win/2017/04/reading-gc-logs-like-a-detective/</link>
      <pubDate>Tue, 18 Apr 2017 09:11:00 +0000</pubDate>
      <guid>https://blog.turboawesome.win/2017/04/reading-gc-logs-like-a-detective/</guid>
      <description>GC logs are the most information-dense diagnostic output the JVM produces, and most engineers never learn to read them properly. A guide to interpreting G1GC logs and using them to diagnose real production problems.</description>
    </item>
    <item>
      <title>Clojure Data Pipelines: Transducers in Production Risk Processing</title>
      <link>https://blog.turboawesome.win/2016/11/clojure-data-pipelines-transducers-in-production-risk-processing/</link>
      <pubDate>Wed, 23 Nov 2016 13:55:00 +0000</pubDate>
      <guid>https://blog.turboawesome.win/2016/11/clojure-data-pipelines-transducers-in-production-risk-processing/</guid>
      <description>Transducers are Clojure&amp;#39;s answer to pipeline composition that works without creating intermediate collections. For production data processing where allocation matters, they&amp;#39;re not a theoretical nicety — they&amp;#39;re genuinely useful.</description>
    </item>
    <item>
      <title>Threading Models in Java: Which One Does Your System Actually Need?</title>
      <link>https://blog.turboawesome.win/2016/11/threading-models-in-java-which-one-does-your-system-actually-need/</link>
      <pubDate>Wed, 09 Nov 2016 10:22:00 +0000</pubDate>
      <guid>https://blog.turboawesome.win/2016/11/threading-models-in-java-which-one-does-your-system-actually-need/</guid>
      <description>Thread-per-request, event-loop, work-stealing, single-threaded with message passing — Java supports all of them, but each optimises for different things. Choosing the wrong model means fighting the runtime rather than working with it.</description>
    </item>
    <item>
      <title>Five Years in High-Frequency Trading: What I Actually Learned</title>
      <link>https://blog.turboawesome.win/2015/11/five-years-in-high-frequency-trading-what-i-actually-learned/</link>
      <pubDate>Thu, 12 Nov 2015 16:03:00 +0000</pubDate>
      <guid>https://blog.turboawesome.win/2015/11/five-years-in-high-frequency-trading-what-i-actually-learned/</guid>
      <description>Looking back at five years of low-latency systems work: what the environment teaches you that you can&amp;#39;t learn elsewhere, and what habits it instils that don&amp;#39;t always transfer cleanly to other domains.</description>
    </item>
    <item>
      <title>ZGC and Shenandoah: What Low-Pause GC Means for Trading Systems</title>
      <link>https://blog.turboawesome.win/2015/10/zgc-and-shenandoah-what-low-pause-gc-means-for-trading-systems/</link>
      <pubDate>Thu, 01 Oct 2015 09:44:00 +0000</pubDate>
      <guid>https://blog.turboawesome.win/2015/10/zgc-and-shenandoah-what-low-pause-gc-means-for-trading-systems/</guid>
      <description>In 2015 the JVM GC landscape was about to change significantly. ZGC and Shenandoah were in development, promising sub-millisecond GC pauses regardless of heap size. Here&amp;#39;s what the previews looked like and what they meant for latency-sensitive Java.</description>
    </item>
    <item>
      <title>Understanding Safepoints: The JVM Pauses Nobody Talks About</title>
      <link>https://blog.turboawesome.win/2015/05/understanding-safepoints-the-jvm-pauses-nobody-talks-about/</link>
      <pubDate>Wed, 27 May 2015 14:38:00 +0000</pubDate>
      <guid>https://blog.turboawesome.win/2015/05/understanding-safepoints-the-jvm-pauses-nobody-talks-about/</guid>
      <description>GC pauses get all the attention, but safepoints are a broader category of JVM stop-the-world events that affect latency in ways GC tuning can&amp;#39;t fix.</description>
    </item>
    <item>
      <title>Memory-Mapped Files in Java: Chronicle and the Art of Zero-Copy I/O</title>
      <link>https://blog.turboawesome.win/2015/04/memory-mapped-files-in-java-chronicle-and-the-art-of-zero-copy-i/o/</link>
      <pubDate>Wed, 15 Apr 2015 09:53:00 +0000</pubDate>
      <guid>https://blog.turboawesome.win/2015/04/memory-mapped-files-in-java-chronicle-and-the-art-of-zero-copy-i/o/</guid>
      <description>Memory-mapped files let you treat disk storage as if it&amp;#39;s RAM — the OS handles the mapping and caching transparently. Chronicle Queue uses this to give you a persistent ordered log with throughput approaching raw memory bandwidth.</description>
    </item>
    <item>
      <title>Building a Trade Blotter That Doesn&#39;t Lie Under Load</title>
      <link>https://blog.turboawesome.win/2015/03/building-a-trade-blotter-that-doesnt-lie-under-load/</link>
      <pubDate>Wed, 04 Mar 2015 10:12:00 +0000</pubDate>
      <guid>https://blog.turboawesome.win/2015/03/building-a-trade-blotter-that-doesnt-lie-under-load/</guid>
      <description>A trade blotter shows traders their current positions and recent executions. When the system is under load, naive implementations show stale, inconsistent, or missing data. Here&amp;#39;s the design that kept our blotter honest.</description>
    </item>
    <item>
      <title>Chronicle Queue vs Kafka: Choosing a Persistent Journal at Nanosecond Scale</title>
      <link>https://blog.turboawesome.win/2015/01/chronicle-queue-vs-kafka-choosing-a-persistent-journal-at-nanosecond-scale/</link>
      <pubDate>Wed, 21 Jan 2015 10:44:00 +0000</pubDate>
      <guid>https://blog.turboawesome.win/2015/01/chronicle-queue-vs-kafka-choosing-a-persistent-journal-at-nanosecond-scale/</guid>
      <description>Both Chronicle Queue and Kafka provide persistent, ordered message logs. Their performance profiles, operational models, and use cases are almost completely different.</description>
    </item>
    <item>
      <title>Benchmarking Without Lying: JMH, Coordinated Omission, and Honest Numbers</title>
      <link>https://blog.turboawesome.win/2014/10/benchmarking-without-lying-jmh-coordinated-omission-and-honest-numbers/</link>
      <pubDate>Wed, 29 Oct 2014 10:14:00 +0000</pubDate>
      <guid>https://blog.turboawesome.win/2014/10/benchmarking-without-lying-jmh-coordinated-omission-and-honest-numbers/</guid>
      <description>Most latency benchmarks are wrong in the same ways. JMH solves the JVM measurement problems; coordinated omission is the harder issue that lives above it.</description>
    </item>
  </channel>
</rss>
