Graph
Cases2 cases
1 to 2 of 2
IL-0390PostHog US Cloud event ingestion slowed to delays of up to 2 days as writes to the Persons Postgres table stalledPostHog2025- Symptoms
From 11 November 2025 at 16:02 UTC, PostHog's event ingestion pipeline for US Cloud became severely degraded, and events for all customers in the US region were processed with delays from 10 minutes up to 2 days. Writes to the Postgres database that stores Person information could take multiple seconds per update, and the pipeline slowed until no standard scaling option helped.
- Trigger
The 32-bit OID space used to track TOASTed values of the Persons table's properties column, a JSONb field that often exceeds the 2KB threshold for out-of-line storage, was nearly exhausted.
- Root cause
- Component
- Contributing factor
- Remediation
- Created a new partitioned Persons table with a fresh TOAST table and OID space
- Added database triggers to keep the old and new Persons tables in sync for live writes
- Copied the existing Person data from the old table to the new one with a backfill script
- Changed ingestion and application code to write to the new table and read from it first, with fallback to the old table
- Deployed the web app changes to production under manual control rather than a fully automated rollout
- Scaled ingestion workers to process the accumulated backlog
- Paused ingestion when the MSK local disk reached about 85%
- Reduced the local retention of the affected Kafka topic
- Resumed ingestion after confirming there was enough disk headroom
- Moved the backfill into Dagster to finish it over the weekend
- Action items
- Add metrics and alerts for heavy disk read amplification per write
- Add metrics and alerts for TOAST table statistics
- Add metrics and alerts for other Postgres engine limits that matter at large scale
- Write runbooks for engine-level Postgres limits, with decision trees for migrating versus repairing in place
- Create customer communication runbooks with a clear escalation path and redundancies
- Evaluate other data stores for the persons database
- Complete the reconsolidation on the new Persons tables
- Improve the backfill tooling and the safeguards for Kafka tiered storage
- Design and operate Person-like tables so they avoid similar limits
- Lessons
TOAST OID exhaustion degrades writes long before the hard limit of about 4 billion OIDs, it is rare even at large scale, and standard dashboards for CPU, memory, IOPS and lock contention did not immediately point at it, so diagnosis took a day and a half without monitoring of TOAST growth, OID usage or disk reads per write. Many core features depended on timely updates to the persons table, so its slowdown reached a wide part of the product. The first backfill approach lacked visibility for a long migration, the Kafka tiered storage settings and alerts were not tuned for a large backlog, and the people who normally handle customer communications were all unavailable.
- Symptoms
At 05:01 UTC on 9 October 2024 a page fired for GatewayBackendErrorsHigh, elevated 5xx errors from page-analytics_cluster in codfw, followed by a growing number of KubernetesCalicoDown alerts for WikiKube nodes not running the calico-node pod and by MediaWikiMemcachedHighErrorRate. For about an hour uncached MediaWiki requests, such as those of logged-in users, edits and API calls, saw high latency or errors.
- Trigger
An operator used the new mwscript-k8s utility to run a batch of video transcode maintenance, the TimedMediaHandler requeueTranscodes.php script. mwscript-k8s deploys a whole helm release for every script invocation, so the batch created close to 2k Calico NetworkPolicies along with many other resources over several hours.
- Root cause
- Component
- Contributing factor
- Detection
Automated monitoring detected the issue and paged the on-call SRE: GatewayBackendErrorsHigh at 05:01:36 UTC, 16 KubernetesCalicoDown alerts at 05:03:32 UTC and MediaWikiMemcachedHighErrorRate at 05:04:15 UTC.
- Remediation
- Raised the resource limits of the Calico and Typha pods and applied the change with helmfile, which redeployed all Calico pods
- Action items
- Stop mwscript-k8s from creating so many resources
- Lessons
The incident came close to a full outage. Automated monitoring caught it and many responders found the cause, but end users were affected and responders were unsure whether they could switch over to eqiad. The problem was noticed just before the hand-off from Americas to EMEA SRE shifts, a period with a long-known lack of coverage, and it helped that the transcodes were not queued on a Friday evening in the US.
These 2 cases involve Calico and Database. kubegap audits a Kubernetes cluster for gaps like these, read-only, from Claude Code or Codex; its checks cite public reports like the ones in this library.
By root cause1
Capacity exhaustion2 cases
- Contributing factor
- Organisation