Tối ưu hóa Network cho Replication Database

Trong quá trình vận hành các hệ thống database PostgreSQL kích thước lớn, đặc biệt những hệ thống sinh WAL với tốc độ cao, tôi cũng gặp qua các tình huống replication lag tăng bất thường dù vấn đề chưa phải do server, không bị bottleneck I/O và không có checkpoint burst. Lúc đó, phần lớn mọi người thường soi vào disk hoặc config database, nhưng thực tế có một tầng ít được chú ý hơn là Network.

Replication trong PostgreSQL về bản chất là một luồng WAL liên tục. Chỉ cần đường truyền gặp bottleneck, bị limit hoặc có điểm nghẽn trong pipeline, toàn bộ quá trình sẽ chậm lại. Vì vậy việc nhận biết network có phải là nguyên nhân và tối ưu đúng chỗ sẽ giúp giảm lag đáng kể.

Dưới đây là vài điểm quan trọng tôi đúc kết từ các case thực tế liên quan đến replication lag do network và cách tối ưu để pipeline WAL vận hành ổn định hơn.

ec11e79e-357d-4120-8eab-c7e24acd5284

Khi nào Network là nguyên nhân gây Replication Lag

Khi hệ thống tạo ra hàng chục đến hàng trăm MB WAL mỗi giây, việc truyền WAL qua network trở thành một phần quan trọng. Trước khi tối ưu, cần kiểm tra network có thực sự là bottleneck hay không.

Kiểm tra trạng thái replication:

SELECT application_name,
       state,
       sent_lsn,
       write_lsn,
       flush_lsn,
       replay_lsn,
       sent_lsn - write_lsn AS send_delay,
       write_lsn - flush_lsn AS write_delay,
       flush_lsn - replay_lsn AS replay_delay
FROM pg_stat_replication;

Nếu send_delay tăng còn write_delay và replay_delay nhỏ thì bottleneck nằm ở quá trình gửi WAL sang replica.

Kiểm tra NIC:

ip -s link show eth0
ethtool -S eth0

Nếu xuất hiện dropped packets, rx_no_buffer hoặc tx_queue_full thì network đang nghẽn.

Nhiều bạn mặc định nghĩ replication lag là do I/O hoặc checkpoint. Nhưng nếu sent_lsn gửi không kịp thì đó là vấn đề network chứ không phải lỗi WAL writer.

Tối ưu TCP Buffer Size

TCP buffer là nơi kernel giữ dữ liệu WAL trước khi gửi ra network. Với hệ thống WAL heavy, buffer mặc định có thể không đủ để chịu các đợt burst.

Linux có auto tuning, nhưng max limit nếu đặt thấp sẽ giới hạn throughput thực tế khi WAL lên cao.

Đây là khuyến nghị thực tế mọi người có thể tham khảo:

NIC tcp rmem wmem max
1Gbps 8MB đến 16MB
10Gbps 32MB đến 64MB
25Gbps trở lên 64MB đến 128MB

Ghi chú: một số tài liệu mọi người có thấy đưa đến 256MB. Điều này hợp với WAN latency lớn nhưng trong LAN hoặc datacenter dễ gây tăng latency vì buffer quá sâu.

Cấu hình:

net.core.rmem_max = 67108864
net.core.wmem_max = 67108864

net.ipv4.tcp_rmem = 4096 87380 67108864
net.ipv4.tcp_wmem = 4096 65536 67108864

Áp dụng:

sysctl -p

TCP Congestion Control

Cubic phù hợp cho LAN hoặc datacenter có latency thấp. BBR phù hợp với replication chạy qua WAN hoặc cross datacenter.

Kiểm tra:

sysctl net.ipv4.tcp_congestion_control

Đổi sang BBR khi cần:

net.core.default_qdisc = fq
net.ipv4.tcp_congestion_control = bbr

BBRv1 trên một số distro cloud chưa tối ưu bằng BBRv2. Trong cùng datacenter latency thấp thì nên giữ Cubic.

Tối ưu NIC: RSS, IRQ Affinity, GRO GSO TSO

RSS

Kiểm tra RSS:

ethtool -l eth0
ethtool -x eth0

RSS giúp phân phối packet vào nhiều RX queue gắn vào nhiều core, tránh nghẽn tại một core.

Nhiều hệ thống dùng NIC 10Gbps nhưng do IRQ dồn vào CPU0 nên throughput thực tế thấp hơn rất nhiều.

IRQ Affinity

Kiểm tra:

cat /proc/interrupts | grep eth0

Nếu toàn bộ interrupt của NIC chạy trên một core thì throughput sẽ giảm mạnh. Cần trải IRQ đều hơn.

GRO, GSO và TSO

ethtool -K eth0 gro on
ethtool -K eth0 gso on
ethtool -K eth0 tso on

Những tính năng này giảm chi phí xử lý packet và giúp streaming WAL ổn định hơn.

Một vài môi trường low latency đặc thù có thể tắt TSO GSO, nhưng trong đa số workload replication WAL thì bật lên vẫn tối ưu.

LRO

Không bật mặc định:

ethtool -K eth0 lro off

LRO có thể gây reorder packet khi đi qua firewall hoặc overlay.

Tối ưu MTU

MTU 1500 tạo ra nhiều packet nhỏ. Nếu path hỗ trợ, nên dùng Jumbo Frame.

Kiểm tra path MTU:

ping -M do -s 8972 replica-host

Nếu thành công, cấu hình:

ip link set dev eth0 mtu 9000

Hầu hết cloud dùng overlay như VXLAN hoặc Geneve nên MTU hiệu dụng thấp hơn MTU danh nghĩa. Test path là bắt buộc.

Các tham số PostgreSQL liên quan WAL

Một vài tham số ảnh hưởng trực tiếp đến pipeline WAL nên được tối ưu cùng với network.

Cấu hình gợi ý:

wal_compression = on
max_wal_senders = 16
wal_keep_size = 4GB
wal_sender_timeout = 0
wal_receiver_timeout = 0
wal_buffers = 64MB
max_replication_slots = 16

wal_buffers lớn hơn giúp Postgres xử lý WAL burst tốt hơn và đẩy WAL ra network đều hơn.

Kiểm tra và benchmark

Đo throughput network:

iperf3 -c replica-host -t 30 -P 4

Đo lượng WAL:

SELECT pg_current_wal_lsn();

Benchmark tổng quan:

pgbench -c 64 -j 64 -T 120

So sánh trước và sau để xác định tuning có hiệu quả hay không.

Kết luận

Network stack là một layer rất dễ bị bỏ qua khi phân tích replication lag. Khi hệ thống sinh WAL liên tục với tốc độ cao, bottleneck nhiều khi không nằm ở disk hoặc CPU mà nằm ở TCP buffer, congestion control, IRQ, hoặc MTU.

Các nhóm tối ưu quan trọng:

  • Đọc pg_stat_replication để xác định đúng bottleneck
  • Đặt TCP buffer phù hợp với tốc độ NIC
  • Chọn congestion control phù hợp với WAN hay LAN
  • Bật RSS, TSO, GSO, GRO để tăng throughput
  • Kiểm tra path MTU trước khi bật Jumbo Frame
  • Tối ưu các tham số WAL của PostgreSQL

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