keep-alive là gì? vì sao giảm handshake overhead

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.

Thông tin nổi bật

Sự kiện phát trực tiếp​

Event Thumbnail

Báo cáo quan trọng

Article Thumbnail
Article Thumbnail
Chia sẻ bài viết:
Theo dõi
Thông báo của
0 Góp ý
Được bỏ phiếu nhiều nhất
Mới nhất Cũ nhất
Phản hồi nội tuyến
Xem tất cả bình luận

Tiêu điểm chuyên gia