The LLM is unavailable.Investigate with fundamentals.
NetworkingAdvanced
Under load, some requests hang for exactly 60 seconds
Page: during the 12:00 peak, ~4% of calls from checkout to pricing hang for exactly 60 s and fail with ETIMEDOUT. The other 96% complete in 12 ms. Off-peak the failure rate is zero and pricing’s own p99 is 14 ms all day.
What you know
checkoutcallspricingover plain HTTP on every cart change:POST pricing.internal:8080/quote, behind an internal load balancer with three healthy targets.- Four
checkoutpods run per Kubernetes node; at peak the node originates about 1 200pricingcalls per second. - The
pricingclient is a thin wrapper around a Pythonrequests.post(...)call withtimeout=(60, 5)— a 60 s connect timeout and a 5 s read timeout. - Nothing in
checkoutorpricinghas been deployed in nine days; peak traffic is about 30% higher than a month ago. - Available: application logs on both sides,
pricingaccess logs, LB metrics, and shell access to acheckoutnode.
# checkout application log, 12:04
12:04:11.020 pricing.quote cart=c_91a connect pricing.internal:8080
12:05:11.024 pricing.quote cart=c_91a ETIMEDOUT after 60 001 ms (connect)
12:04:11.031 pricing.quote cart=c_91b 200 in 11 ms
12:04:11.033 pricing.quote cart=c_88f OSError [Errno 99] Cannot assign requested address (EADDRNOTAVAIL, 0 ms)
# pricing access log, cart=c_91a, 12:04–12:06
(no entries)
# checkout node, 12:04
$ ss -s
TCP: 31 402 (estab 118, closed 31 180, orphaned 0, timewait 31 020)
$ sysctl net.ipv4.ip_local_port_range
net.ipv4.ip_local_port_range = 32768 60999 # 28 232 ephemeral ports
$ ss -tan state time-wait | awk '{print $4}' | cut -d: -f1 | sort | uniq -c
10 391 10.20.4.11 # the three pricing targets
10 322 10.20.4.12
10 307 10.20.4.13
$ conntrack -C ; sysctl net.netfilter.nf_conntrack_max net.netfilter.nf_conntrack_tcp_timeout_time_wait
131072
net.netfilter.nf_conntrack_max = 131072
net.netfilter.nf_conntrack_tcp_timeout_time_wait = 120
$ dmesg | tail -3
nf_conntrack: nf_conntrack: table full, dropping packet
nf_conntrack: nf_conntrack: table full, dropping packet
nf_conntrack: nf_conntrack: table full, dropping packet
# checkout/src/clients/pricing.py
def quote(cart):
r = requests.post(PRICING_URL + "/quote", json=cart, timeout=(60, 5))
return r.json()Investigate
For each area: first say why you would check it (reveal the reasoning), then look. Commit to a root cause when you are confident.
Application logs on the caller
Server access logs
`ss -s`, ports and conntrack on the client node
The HTTP client
Load balancer health
DNS resolution time
TLS handshake cost