Richard Schneeman
Richard “Ruby Hero” Schneems writes Ruby at Heroku, maintains CodeTriage.com, and co-organizes Keep Ruby Weird. He is in the top 50 Rails contributors and is an accidental maintainer of Sprockets. He also wrote a few gems you might have heard of including Wicked, and derailed_benchmarks. Find more writing at https://schneems.com
- Engineering
- Last Updated: November 05, 2025
- Richard Schneeman, Chap Ambrose
Puma 7 is here, and that means your Ruby app is now keep-alive ready. This bug, which existed in Puma for years, caused one out of every 10 requests to take 10x longer by unfairly “cutting in line.” In this post, I’ll cover how web servers work, what caused this bad behavior in Puma, and how it was fixed in Puma 7; specifically an architectural change recommended by MSP-Greg that was needed to address the issue.
- Engineering
- Last Updated: November 04, 2025
- Richard Schneeman, Chap Ambrose
The Performance Penalty of Repeated Connections
Before the latest improvements to the Heroku Router, every connection between the router and your application dyno risked incurring the latency penalty of a TCP slow start. To understand why this is a performance bottleneck for modern web applications, we must look at the fundamentals of the Transmission Control Protocol (TCP) and its history with HTTP.
Maybe you’ve heard of a keep-alive connection, but haven’t thought much about …
- News
- Last Updated: April 14, 2025
- Richard Schneeman
Do you run Rails or pure Ruby applications on Heroku? If so, it’s important to be aware of upcoming end-of-life (EOL) dates for both your stack and your Ruby version. The Heroku-20 stack, built on Ubuntu 20.04 LTS, will reach EOL for standard support in April 2025. Ruby 2.7 has already passed its EOL, meaning it’s no longer receiving critical security updates. Continuing to run your app with either an outdated Ruby version or an …
- Engineering
- Last Updated: June 03, 2024
- Richard Schneeman
Your app is slow. It does not spark joy. This post will use memory allocation profiling tools to discover performance hotspots, even when they're coming from inside a library. We will use this technique with a real-world application to identify a piece of optimizable code in Active Record that ultimately leads to a patch with a substantial impact on page speed.
In addition to the talk, I've gone back and written a full technical recap …
- Engineering
- Last Updated: June 03, 2024
- Richard Schneeman
When API requests are made one-after-the-other they’ll quickly hit rate limits and when that happens:
If you provide an API client that doesn’t include rate limiting, you don’t really have an API client. You’ve got an exception generator with a remote timer.
— Richard Schneeman Stay Inside (@schneems) June 12, 2019
That tweet spawned a discussion that generated a quest to add rate throttling logic to the platform-api gem that Heroku maintains for talking to …
- News
- Last Updated: December 25, 2019
- Richard Schneeman
When Heroku launched in 2007 there was only a single Ruby version that could be used on the platform. In 2012 Heroku began to support multiple Ruby versions. Since then, we’ve had a holiday tradition of releasing the new versions of Ruby on the same day they come out, which always happens on Christmas day (December 25th).
If you’re new to the community, you might be curious about where releasing a new minor version …
- Engineering
- Last Updated: June 03, 2024
- Richard Schneeman
Update: On closer inspection, the lock type was not on the table, but on a tuple. For more information on this locking mechanism see the internal Postgresql tuple locking documentation. Postgres does not have lock promotion as suggested in the debugging section of this post.
I maintain an internal-facing service at Heroku that does metadata processing. It’s not real-time, so there’s plenty of slack for when things go wrong. Recently I discovered a Postgres …
- Engineering
- Last Updated: July 12, 2019
- Richard Schneeman
For quite some time we've received reports from our larger customers about a mysterious H13 – Connection closed error showing up for Ruby applications. Curiously it only ever happened around the time they were deploying or scaling their dynos. Even more peculiar, it only happened to relatively high scale applications. We couldn't reproduce the behavior on an example app. This is a story about distributed coordination, the TCP API, and how we debugged and fixed …
- Engineering
- Last Updated: May 14, 2024
- Richard Schneeman
Debugging is an important skill to develop as you work your way up to more complex projects. Seasoned engineers have a sixth sense for squashing bugs and have built up an impressive collection of tools that help them diagnose and fix bugs.
I’m a member of Heroku’s Ruby team and creator of CodeTriage and today we’ll look at the tools that I used on a journey to fix a gnarly bug in Sprockets. Sprockets …
- Engineering
- Last Updated: June 03, 2024
- Richard Schneeman
Rails applications that use ActiveRecord objects in their cache may experience an issue where the entries cannot be invalidated if all of these conditions are true:
- They are using Rails 5.2+
- They have configured config.active_record.cache_versioning = true
- They are using a cache that is not maintained by Rails, such as dalli_store (2.7.8 or prior)
In this post, we discuss the background to a change in the way that cache keys work with Rails, why this …
Subscribe to the full-text RSS feed for Richard Schneeman.