Cases2 cases
1 to 2 of 2
IL-0268AdGuard DNS resolvers in Amsterdam, Frankfurt and London overloaded and answered with timeouts and SERVFAILAdGuard DNS2025- Symptoms
Between about 15:30 and 18:00 UTC on 25 November 2025 some AdGuard DNS users saw slow or failed DNS resolution, with timeouts and SERVFAIL responses. Alerts fired for increased DNS error rates and server load, and a significant part of the traffic in several European locations, primarily Amsterdam, Frankfurt and London, had intermittent DNS failures for up to 2.5 hours.
- Trigger
A new version of AdGuard DNS, deployed on 25 November to improve how resolvers cache user data, had a bug that saved only the recently changed subset of user data into the local cache file. The first deployment failed partway on a network issue and left about half the servers on the new version; the second attempt made many resolvers start full synchronizations at once.
- Root cause
- Component
- Contributing factor
- Detection
Alerts for increased DNS error rates and server load fired during the second deployment attempt, between 15:30 and 16:00 UTC.
- Remediation
- Rolled back the buggy version on all servers
- Partially rerouted Amsterdam's traffic to other European locations
- Reduced connection concurrency and request pipeline depth in Frankfurt and London, from 5 to 1 in Frankfurt
- Adjusted limits to the actual hardware capacity
- Repaired corrupted cache files and user data snapshots to stop further full synchronizations
- Normalised the traffic distribution once the rollback was complete
- Action items
- Add automated tests that the full user dataset is correctly written to and restored from the local cache file, including detection of empty or truncated caches
- Add integration tests that simulate resolver startup with an empty or corrupted cache under realistic load
- Standardize server hardware profiles per location, or keep separate configurations per hardware class
- Review and adjust connlimit, cache sizes and connection limits for each standard node type
- Reevaluate and lower pipelining depth where needed
- Reevaluate how connections and goroutines are limited so resource use stays bounded with decent throughput after a connection break
- Monitor Go heap size, GC time, GC cycles per second and per-cluster request latency distributions
- Alert on sustained increases in SERVFAIL rate and request duration while upstreams are healthy
- Refine DNS resolver deployment and rollback procedures to avoid simultaneous cache invalidation across a large part of the fleet
- Document and rehearse playbooks for adjusting pipeline depth, connection limits and connlimit during live incidents
- Lessons
How nodes behaved depended on the interaction between available RAM, Go's garbage collector and the connlimit setting. On 64-GiB nodes a high limit let the heap grow large under heavy concurrency and pipelining, and the garbage collector then spent more and more CPU, a known worst case for high-memory applications in which memory is not exhausted but latency rises and throughput falls. On 32-GiB nodes the same configuration reached practical memory limits sooner because it had not been scaled down. Together with high pipelining and client retries, GC pressure, connection saturation and retries formed a feedback loop.
IL-0274GitHub's code search Elasticsearch cluster hit near-100% CPU and rapid master elections; a restart found lost shardsGitHub2013- Symptoms
On Thursday 24 January 2013 GitHub's exception tracking and monitoring systems detected a large spike in exceptions. Most of them were timeouts in code search queries and in the background jobs that update the code search indexes with data from new pushes, and the outage of the newly launched Code Search lasted into Friday 25 January.
- Trigger
On 17 January GitHub upgraded the code search cluster from Elasticsearch 0.19.9 to 0.20.2 before launching Code Search publicly; the outage began on 24 January, after the public launch.
- Root cause
- Component
- Contributing factor
- Detection
GitHub's exception tracking and monitoring systems detected a large spike in exceptions, mostly timeouts from code search queries and from the indexing background jobs.
- Remediation
- Stopped the whole cluster and brought it back in maintenance mode, with shard allocation and rebalancing disabled
- Brought in engineers from elasticsearch, the company, to review the cluster and its unallocatable shards
- Upgraded Java and Elasticsearch and applied the recommended configuration through a Puppet topic branch and environment
- Action items
- Provision a staging environment for the code search cluster to test infrastructure changes
- Have the elasticsearch team audit the code search cluster configuration again in future
- Lessons
The Elasticsearch upgrade was not tested enough on GitHub's infrastructure before it reached the code search cluster, partly because the cluster had no proper staging environment. For large clusters the elasticsearch team recommended equal minimum and maximum JVM heap through ES_HEAP_SIZE, at 50% of system RAM, starting recovery immediately instead of after recover_after_time, and configuring minimum_master_nodes so that paused nodes do not form their own clusters.
These 2 cases involve Language runtime settings and Elasticsearch or OpenSearch. 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 cause2
Faulty deployment1 case
- Organisation
Software defect1 case
- Contributing factor
- Organisation