Skip to content
Gabriel Martin

Greetings

Software developer usually working on distributed systems within various (programming) languages or paradigms.

  • domain — building and scaling ecommerce platforms; AI agents; enterprise software
  • languages — Go, TypeScript / Node.js, PHP, Python, C#; React on the frontend (polyglot by choice)
  • data — MSSQL, MySQL, PostgreSQL, Oracle, MongoDB, Redis, ClickHouse, Snowflake, Elasticsearch
  • AI & search — custom agent systems built to scale, LLM-powered intelligent document processing, hybrid / semantic search with embeddings
  • platform — Kubernetes, Helm, Apache Kafka, RabbitMQ, Prometheus, Grafana, Redis, Temporal
  • infra as code & CI — Terraform, Ansible, Packer, Jenkins
  • cloud — AWS, GCP, Azure, OCI, plus a few certifications along the way
  • os — Arch Linux / MacOS
  • yeah, that’s my cat

Latest posts

Go 1.28: HTTP/2 Connection Parking

I run a small Go API that serves somewhere between 300k and 500k requests a day. Spread over 24 hours that is only a handful of requests per second, which means that most of the time, most of the connections to it are doing nothing at all. Go 1.28 brings a change aimed exactly at that situation: an idle HTTP/2 connection no longer pins a goroutine in the server’s serve loop. I wanted to understand what the change actually does and measure it myself, on a real router with real middleware instead of a bare handler.

 · 14 min read

Halving MySQL's Memory Footprint: glibc Arenas and the Thread Cache

A while ago I wrote about migrating the legacy PHP app behind a hobby project of mine, a community driven subtitles website. Three years later it runs on PHP 8 and still talks to the same MySQL 8.0.32 container. The VPS is still a small one, and MySQL is the most expensive tenant on it. Recently I noticed that the database container was sitting at around 1.17 GiB of RSS during peak hours, with a hard mem_limit of 1.5 GiB. That is not a comfortable margin, so I spent a couple of evenings figuring out where the memory was going. Today the same container peaks somewhere between 550 and 650 MiB under the same traffic, and it stays there. The fix was two lines of configuration, and neither of them has anything to do with queries.

 · 9 min read

Implementing hybrid searching in ElasticSearch

I’ve been playing a lot lately with embeddings and semantic search implementations and strategies so I’ll present a bit my learnings - tailored around search systems already using ElasticSearch as the engine behind it. Some terms Let’s start with some introductions. What’s ElasticSearch? You can view it as a manager of Lucene instances. (open-source search engine) Each index is running under the hood a Lucene instance and through this setup you can query your data. It’s what Kubernetes is for container orchestration (of course, keeping proportions for a very simplified overview).

 · 6 min read

LLMs - First Major Murder

StackOverflow has published recently its latest stats about usage - and apparently, starting with the public access on ChatGPT, the service’s usage has decreased with ~50%. Everybody has rushed in saying that probably the Internet will start forgetting what SO did over this whole time, but I doubt this is the case. Actually, these stats will probably pump back as ChatGPT is not able to answer the latest tech trends and it shouldn’t - it needs new training data, traning data which is now becoming harder to fetch than it was before (see the reddit drama). (source with some nice graphs)

 · 2 min read

Migrating a Legacy PHP App

Recently, I’ve been working on an old hobby project as I needed to rehost it somewhere else. This website serves something like 10k unique users / day and it’s completely community driven - our users interact on the website through comments, forum posts, a chat widget (self-stored) and the content they’re providing (movie subtitles). I’ll just guide you through the entire process. Initial landscape The initial architecture was pretty simple:

 · 13 min read