keep-alive là cơ chế giữ connection ở trạng thái usable trong thời gian dài, hoặc chủ động phát hiện dead peer để fail fast. Tùy layer, keep-alive có thể là connection reuse ở L7 như HTTP keep-alive, hoặc probe ở L4 như TCP keepalive.
Trong DevOps và SRE, keep-alive ảnh hưởng trực tiếp tới latency, connection churn, và độ ổn định của traffic đi qua middlebox như NAT, firewall, load balancer, reverse proxy. Nhiều lỗi production nhìn giống application timeout, nhưng root cause lại là idle timeout ở giữa đường và connection bị drop khi đang idle.
Ví dụ: Client 10.0.2.5 port 53122 kết nối tới 10.0.1.10 port 443 và reuse connection đó cho nhiều request. Nếu connection reuse hoạt động đúng, bạn giảm TLS handshake, giảm CPU trên client và server, và giảm connection rate trên load balancer.
keep-alive cho biết điều gì
keep-alive giúp bạn kiểm soát những thứ rất vận hành:
- Connection reuse có đang xảy ra hay không, hay mỗi request tạo connection mới
- Idle connection có bị middlebox drop không, và drop diễn ra sau bao lâu
- Traffic pattern là long lived connection hay short lived connection
- Risk của connection storm khi retry hoặc autoscale
TCP keepalive vs HTTP keep-alive
Hai thứ hay bị gọi chung tên nhưng bản chất khác nhau:
- TCP keepalive: Kernel gửi keepalive probe trên một TCP connection idle để phát hiện dead peer, hoặc để tránh một số thiết bị drop idle connection quá sớm
- HTTP keep-alive: Application reuse cùng một TCP connection cho nhiều HTTP request, giảm handshake overhead và giảm TIME_WAIT
Ngoài ra còn có keep-alive ở application protocol như gRPC keepalive ping, mục tiêu là phát hiện connection dead sớm hơn và giữ stream ổn định khi đi qua proxy chain.
Idle timeout và keep-alive
Idle timeout thường nằm ở middlebox như NAT, firewall, load balancer, hoặc proxy. Khi một connection idle quá lâu, thiết bị có thể drop state và gói tin tiếp theo sẽ gặp RST, timeout, hoặc EOF tùy tình huống.
Một nguyên tắc vận hành hay dùng là đặt keepalive interval nhỏ hơn idle timeout nhỏ nhất trên đường đi, để giảm xác suất connection bị drop trong lúc idle và để phát hiện dead peer nhanh.
Tuning TCP keepalive trên Linux
Tuning TCP keepalive thường xoay quanh 3 sysctl:
- net.ipv4.tcp_keepalive_time: Thời gian idle trước khi bắt đầu gửi probe
- net.ipv4.tcp_keepalive_intvl: Khoảng cách giữa các probe
- net.ipv4.tcp_keepalive_probes: Số probe trước khi coi connection dead
Command hay dùng để kiểm tra:
sysctl net.ipv4.tcp_keepalive_time
sysctl net.ipv4.tcp_keepalive_intvl
sysctl net.ipv4.tcp_keepalive_probes
Nếu mục tiêu là tránh idle timeout ở middlebox, bạn quan tâm nhiều nhất tới tcp_keepalive_time và tcp_keepalive_intvl. Nếu mục tiêu là fail fast khi peer chết, tcp_keepalive_probes cũng quan trọng.
keep-alive trong proxy như Nginx
Ở reverse proxy, keep-alive thường có hai hướng:
- Client connection reuse: Giảm handshake và giảm connection churn từ client vào proxy
- Upstream connection reuse: Giảm connection churn từ proxy tới backend, giảm CPU và giảm pressure lên conntrack trên node backend
Pitfall hay gặp là giữ quá nhiều idle upstream connections, làm tăng file descriptor usage và tăng memory usage, đặc biệt khi upstream shard lớn.
keep-alive và health check
Health check là cơ chế xác nhận endpoint có healthy để nhận traffic, thường là request riêng biệt theo interval. Keep-alive là cơ chế giữ hoặc reuse connection cho traffic thật.
Bạn có thể có health check xanh nhưng traffic thật vẫn fail vì idle timeout hoặc vì upstream keep-alive reuse một connection đã bị middlebox drop.
Symptom thiếu keep-alive hoặc mismatch timeout
Các symptom rất hay gặp trong production:
- broken pipe khi app ghi vào socket đã bị close
- EOF hoặc connection reset khi đọc response
- 499 ở Nginx khi client đóng connection trước khi upstream trả
- 504 khi upstream response không về kịp vì connection bị drop và request bị retry
Các symptom này thường xuất hiện theo pattern idle, ví dụ traffic burst theo batch, hoặc user activity theo giờ.
Observability keep-alive
Những thứ hay nhìn khi debug:
- Kiểm tra socket state và timer
ss -tanop | head
ss -ti state established | head
- Bắt gói tin để phân biệt RST từ đâu và ai đóng connection
tcpdump -ni eth0 tcp port 443
- Correlate với metrics như connection rate, active connections, TIME_WAIT, CLOSE_WAIT, error rate ở proxy
Nếu bạn thấy connection rate tăng bất thường trong khi request rate không tăng tương ứng, khả năng cao keep-alive reuse đang không hiệu quả.
Checklist cấu hình keep-alive cho production
- Xác định idle timeout nhỏ nhất trên path, thường là LB, firewall, NAT, proxy
- Đặt TCP keepalive hoặc application keep-alive interval thấp hơn idle timeout nhỏ nhất với một khoảng an toàn
- Giới hạn số idle connections và giới hạn reuse theo upstream để tránh FD pressure
- Monitor connection churn, TIME_WAIT, CLOSE_WAIT, và error như reset, EOF, broken pipe
- Test bằng traffic pattern giống production, đặc biệt workload theo burst và long idle gap
Kết luận
keep-alive không chỉ là tối ưu hiệu năng, nó còn là một phần của độ ổn định connection khi traffic đi qua middlebox. Làm đúng keep-alive giúp giảm handshake overhead, giảm connection churn, và giảm intermittent reset do idle timeout mismatch.







