<!-- mobian-agent-page publisher="dailydev" canonical="https://daily.dev/posts/postgres-18-tuning-gotchas-surface-vercel-details-its-redis-to-dynamodb-migration-xlhpnxll3" -->

---
title: Postgres 18 tuning gotchas surface, Vercel details its...
description: Today's posts skew toward Postgres internals and hard-won migration lessons. A new GUC in Postgres 18, io_max_concurrency, can silently throttle I/O...
canonical: https://daily.dev/posts/postgres-18-tuning-gotchas-surface-vercel-details-its-redis-to-dynamodb-migration-xlhpnxll3
twitter:card: summary_large_image
twitter:site: @dailydotdev
og:type: website
og:site_name: daily.dev
og:title: Postgres 18 tuning gotchas surface, Vercel details its Redis-to-DynamoDB migration | daily.dev
og:description: Today's posts skew toward Postgres internals and hard-won migration lessons. A new GUC in Postgres 18, io_max_concurrency, can silently throttle I/O...
og:url: https://daily.dev/posts/postgres-18-tuning-gotchas-surface-vercel-details-its-redis-to-dynamodb-migration-xlhpnxll3
og:image: https://api.daily.dev/og/posts/XLHpNxll3.png
og:image:alt: Postgres 18 tuning gotchas surface, Vercel details its Redis-to-DynamoDB migration
og:image:width: 1200
og:image:height: 630
og:locale: en
---

> ## Documentation Index
> Fetch the complete documentation index at: https://daily.dev/llms.txt
> Use this file to discover all available pages before exploring further.

# Postgres 18 tuning gotchas surface, Vercel details its Redis-to-DynamoDB migration

**[Databases Digest](https://daily.dev/sources/databases_digest)** · 4 min read · 0 upvotes · 1 comments

## Summary

Today's posts skew toward Postgres internals and hard-won migration lessons. A new GUC in Postgres 18, io_max_concurrency, can silently throttle I/O concurrency if max_connections is overprovisioned. Vercel and Tailscale both published detailed postmortems on infrastructure moves that went sideways before they went right. Meanwhile a 16-year-old SQLite bug got fixed after an AI agent reproduced it in 15 minutes, following months of manual forensic work by Tailscale.

## Content

**TLDR:** Today's posts skew toward Postgres internals and hard-won migration lessons. A new GUC in Postgres 18, io_max_concurrency, can silently throttle I/O concurrency if max_connections is overprovisioned. Vercel and Tailscale both published detailed postmortems on infrastructure moves that went sideways before they went right. Meanwhile a 16-year-old SQLite bug got fixed after an AI agent reproduced it in 15 minutes, following months of manual forensic work by Tailscale.

---

## Postgres 18's io_max_concurrency can silently throttle I/O even when you've tuned effective_io_concurrency up

io_max_concurrency is a new per-process hard ceiling on in-flight I/O operations, enforced at the postmaster level and requiring a restart to change. Its default auto-calculates from shared_buffers divided across all possible processes, so overprovisioned max_connections with small shared_buffers can quietly resolve it down to single digits with no warning in the logs. If you've raised effective_io_concurrency for NVMe or striped cloud volumes, you need to raise this too, or the extra concurrency you asked for never gets used. Check pg_aios to see actual in-flight I/O against the ceiling before deciding to raise it. [Read more](https://daily.dev/posts/pJu4KgU6W)

## A 16-year-old SQLite WAL bug: months of forensics versus 15 minutes of AI-driven fuzzing

Tailscale spent months chasing random corruption in its control plane database, eventually building a custom VFS shim and a new transaction logging pipeline just to catch the bug happening in production. The culprit turned out to be a data race in SQLite's WAL code that had existed for at least 16 years, now fixed in SQLite 3.51.3. Separately, a developer paired Antithesis's deterministic testing platform with Claude agent skills, wrote two generic invariants, and reproduced the same bug in 15 minutes. Tailscale's manual work is what made isolating a live production bug possible in the first place, but the gap between the two approaches is worth sitting with if you run critical infra on SQLite. [Read more](https://daily.dev/posts/qBIKVYoyY)

## Vercel moved its build state from Redis to DynamoDB live, hit an N+1 bug Redis had been masking

Vercel migrated the state behind every build's warm pool from Redis to DynamoDB while serving production traffic, using feature-flagged phases with dual writes, shadow reads, and a primary flip with rollback available at every step. They redesigned the schema around DynamoDB's access patterns instead of porting Redis's data structures directly. Two production incidents surfaced along the way: one from comparison overhead, and one that exposed a pre-existing N+1 query that Redis's speed had been quietly covering up for years. [Read more](https://daily.dev/feed-by-ids?id=wsTvjzaBz&id=vJjwu23wh)

## iFood cut SIEM costs 40-50% moving from Databricks to ClickHouse, unlocking AI-driven threat hunts

iFood migrated its security incident response platform from Databricks to ClickHouse Cloud, citing 9-16x faster queries at 40-50% lower cost. The bigger shift is agentic: AI agents running parallel sub-queries can now complete threat hunts that used to take a human analyst a week in about two hours, drawing on months of historical data (EDR logs alone generate 1.6TB/day). They're using Langfuse, now owned by ClickHouse, to tune agent behavior, and plan to migrate CDN/API logs from OpenSearch next. [Read more](https://daily.dev/posts/0yktjC5Xt)

---

## Also notable

- **Diagnosing pg_stat_statements cardinality blowout:** A side-by-side demo shows 671 unique normalized statements on Postgres 17 versus 120 on Postgres 18 for the same workload, thanks to IN-list normalization, which matters if ORMs or AI tooling are eating your pg_stat_statements.max budget. [Read more](https://daily.dev/posts/uG5Fr9Nrx)
- **GitHub outage traced to a stale index hint after migration:** A recent database migration removed an index that a query still referenced via an index hint, causing 500 errors on Pull Requests, Issues, and Search until GitHub disabled the config. [Read more](https://daily.dev/posts/NiZesZqma)
- **pg-java driver passes 6,851 of 7,331 pgjdbc tests, was written almost entirely by Claude:** The ground-up JVM Postgres driver rewrite, built around virtual-thread-friendly blocking I/O and a batch INSERT rewrite that gets ~2x throughput via unnest, came from a six-week agentic loop of roughly 1,400 commits and 52K lines of Java, guided by 22 Architecture Decision Records. [Read more](https://daily.dev/feed-by-ids?id=SOaGD6m0G&id=Iyswltsgp)
- **Aurora PostgreSQL major-version upgrade with zero-downtime Debezium cutover in 2.21 seconds:** A native logical replication bridge between PostgreSQL 14 and 17 clusters lets you avoid the hours-long re-snapshot that standard Aurora upgrade paths force on active Debezium CDC connectors, with a database-side cutover measured at about 2.21 seconds and zero duplicate or missed events in testing. [Read more](https://daily.dev/posts/Vp2MYL7Zt)
- **Postgres collation regression: glibc 2.28+ can take 2 hours to sort 25 million strings:** A new visual fingerprint grid across OS/language combinations shows glibc 2.28 and later causing catastrophic sort performance regressions on certain locales, worth checking before your next OS upgrade touches a Postgres box. [Read more](https://daily.dev/posts/TGNQ8cMgw)

## Community discussion

Top comments from developers on daily.dev.

**@pdfopsdev** · 0 upvotes

> that Redis-to-DynamoDB story is a classic pattern: a fast cache hides a bad access pattern until you rip it out. dual writes during the cutover buy you safety but the N+1 was always there, it just needed a slower backend to show up.

---

Tags: [#database](https://daily.dev/tags/database), [#postgresql](https://daily.dev/tags/postgresql), [#sqlite](https://daily.dev/tags/sqlite), [#aws-dynamodb](https://daily.dev/tags/aws-dynamodb)

[View this post on daily.dev](https://daily.dev/posts/postgres-18-tuning-gotchas-surface-vercel-details-its-redis-to-dynamodb-migration-xlhpnxll3)

```json
{"@context":"https://schema.org","@graph":[{"@type":"Organization","@id":"https://daily.dev/#organization","name":"daily.dev","url":"https://daily.dev","logo":{"@type":"ImageObject","url":"https://daily.dev/apple-touch-icon.png","width":180,"height":180},"sameAs":["https://twitter.com/dailydotdev","https://github.com/dailydotdev","https://www.linkedin.com/company/daily-dev-ltd"]},{"@type":"WebSite","@id":"https://daily.dev/#website","url":"https://daily.dev","name":"daily.dev","publisher":{"@id":"https://daily.dev/#organization"},"potentialAction":{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https://daily.dev/search?q={search_term_string}"},"query-input":"required name=search_term_string"}}]}
{"@context":"https://schema.org","@type":"DiscussionForumPosting","mainEntityOfPage":"https://daily.dev/posts/postgres-18-tuning-gotchas-surface-vercel-details-its-redis-to-dynamodb-migration-xlhpnxll3","headline":"Postgres 18 tuning gotchas surface, Vercel details its Redis-to-DynamoDB migration","text":"Today's posts skew toward Postgres internals and hard-won migration lessons. A new GUC in Postgres 18, io_max_concurrency, can silently throttle I/O concurrency if max_connections is overprovisioned. Vercel and Tailscale both published detailed postmortems on infrastructure moves that went sideways before they went right. Meanwhile a 16-year-old SQLite bug got fixed after an AI agent reproduced it in 15 minutes, following months of manual forensic work by Tailscale.","url":"https://daily.dev/posts/postgres-18-tuning-gotchas-surface-vercel-details-its-redis-to-dynamodb-migration-xlhpnxll3","datePublished":"2026-08-13T04:17:39.044Z","dateModified":"2026-08-13T04:18:04.914Z","author":{"@type":"Organization","name":"Databases Digest","logo":"https://media.daily.dev/image/upload/s--ir1hdV8b--/f_auto,q_auto/v1773839400/logos/databases_digest?_a=BAMAMiiu0","url":"https://daily.dev/sources/databases_digest"},"interactionStatistic":[{"@type":"InteractionCounter","interactionType":{"@type":"LikeAction"},"userInteractionCount":0},{"@type":"InteractionCounter","interactionType":{"@type":"CommentAction"},"userInteractionCount":1}],"comment":[{"@type":"Comment","text":"that Redis-to-DynamoDB story is a classic pattern: a fast cache hides a bad access pattern until you rip it out. dual writes during the cutover buy you safety but the N+1 was always there, it just needed a slower backend to show up.","datePublished":"2026-08-13T18:05:02.955Z","url":"https://daily.dev/posts/XLHpNxll3#c-eGtfJgRTj","author":{"@type":"Person","name":"PDFops","url":"https://daily.dev/pdfopsdev","image":"https://media.daily.dev/image/upload/s---8isRBKc--/f_auto/v1782922291/avatars/avatar_orjMeK8QKaaVZwGq7ScPz?_a=BAMAMicg0"}}],"isPartOf":{"@type":"WebPage","url":"https://daily.dev/sources/databases_digest","name":"Databases Digest"}}
{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https://daily.dev"},{"@type":"ListItem","position":2,"name":"Databases Digest","item":"https://daily.dev/sources/databases_digest"},{"@type":"ListItem","position":3,"name":"Postgres 18 tuning gotchas surface, Vercel details its Redis-to-DynamoDB migration"}]}
```

