- Postgres 18, hiện đang ở beta1, giới thiệu hỗ trợ I/O bất đồng bộ (Asynchronous I/O), đặc biệt cải thiện đáng kể hiệu năng đọc trong môi trường đám mây
- Thông qua giá trị cấu hình mới
io_method, có thể chọn phương thức worker hoặc io_uring bên cạnh cách sync truyền thống
- Theo kết quả benchmark trên AWS, khi dùng
io_uring, hiệu năng đọc đĩa tăng tối đa 3 lần
- Tuy nhiên, do được bất đồng bộ hóa, việc diễn giải thời gian I/O trong phân tích truy vấn hiện có (
EXPLAIN ANALYZE) trở nên khó hơn
- Cần tối ưu hiệu năng thông qua view giám sát mới (
pg_aios) và tham số tuning (effective_io_concurrency)
Giới thiệu I/O bất đồng bộ trong Postgres 18
- Theo truyền thống, Postgres sử dụng mô hình I/O chặn (blocking I/O), phải chờ cho đến khi mỗi lần đọc đĩa hoàn tất
- Do độ trễ cao của storage dựa trên mạng (như EBS), nút thắt cổ chai phát sinh trong môi trường đám mây
- I/O bất đồng bộ cho phép xử lý song song nhiều lần đọc đĩa, từ đó tăng mức sử dụng CPU và tổng thông lượng
Công việc chuẩn bị trong Postgres 17: Read Stream API
- Trong Postgres 17, API
read_stream được giới thiệu để chuẩn hóa phần trừu tượng của tác vụ đọc
- Tuy nhiên, nó vẫn phụ thuộc vào page cache của OS và không được phản ánh trực tiếp vào shared buffer của chính Postgres
- Trong Postgres 18, đọc bất đồng bộ trực tiếp thay vì chỉ dùng kernel hint trở nên khả thi
Cấu hình mới: io_method
- Postgres 18 bổ sung cấu hình
io_method vào postgresql.conf, cung cấp 3 tùy chọn sau:
io_method = sync
- Phương thức đồng bộ giống như Postgres hiện tại
- Sử dụng cách yêu cầu đọc đón đầu dựa trên
posix_fadvise()
io_method = worker (mặc định)
- Các tiến trình worker chuyên trách I/O đọc dữ liệu bất đồng bộ rồi chuyển vào shared buffer
- Tiến trình chính có thể tiếp tục chạy mà không bị gián đoạn bởi tác vụ đọc
- Số worker mặc định là 3 và có thể điều chỉnh bằng cấu hình
io_workers
io_method = io_uring
- Giao diện I/O hiệu năng cao có thể dùng trên Linux kernel 5.1 trở lên
- Thực hiện đọc bất đồng bộ trực tiếp thông qua shared ring buffer với kernel mà không cần tiến trình worker
- Yêu cầu kernel, filesystem và thiết lập hiện đại
Benchmark hiệu năng của I/O bất đồng bộ (theo AWS)
- Môi trường thử nghiệm:
- AWS c7i.8xlarge (32 vCPU, 64GB RAM)
- 100GB io2 EBS, 20,000 IOPS
- Chạy
SELECT COUNT(*) trên bảng có kích thước 3.5GB
So sánh hiệu năng khi cold cache:
| Phiên bản/cấu hình |
Thời gian chạy (ms) |
| Postgres 17 (sync) |
15,831 |
| Postgres 18 (sync) |
15,071 |
| Postgres 18 (worker) |
10,052 |
| Postgres 18 (io_uring) |
5,723 |
io_uring cải thiện hiệu năng 2.8 lần so với sync
- Rất hiệu quả trong việc giảm độ trễ đĩa trên đám mây
Tuning effective_io_concurrency
- Trong Postgres 18, tham số này ảnh hưởng đến số lượng yêu cầu read-ahead bất đồng bộ nội bộ
- Giá trị mặc định được nâng từ 1 → 16, và khi nhân với
io_combine_limit sẽ quyết định phạm vi đọc tối đa
- Trong môi trường đám mây có độ trễ cao, giá trị lớn có thể có lợi, nhưng cần benchmark theo từng workload
Công cụ giám sát mới: pg_aios
- Trong
pg_stat_activity, khi có tác vụ bất đồng bộ, nó xuất hiện dưới dạng sự kiện AioIoCompletion, khiến việc phân tích trạng thái chờ của backend trở nên khó khăn
- Với
io_uring, do kernel xử lý trực tiếp nên trạng thái I/O không hiển thị trong Postgres
- Có thể kiểm tra thông tin chi tiết về các yêu cầu bất đồng bộ đang diễn ra thông qua view
pg_aios
SELECT * FROM pg_aios;
- Có thể kiểm tra các trạng thái như
SUBMITTED, COMPLETED_IO và thông tin block đích
Lưu ý: thay đổi trong cách diễn giải thông tin thời gian I/O
I/O Timings vốn thấy trong EXPLAIN ANALYZE trước đây chỉ đáng tin cậy trong phương thức đồng bộ
- Khi dùng
worker, io_uring đã được bất đồng bộ hóa, thông tin timing bị méo do xử lý song song và phân tán qua worker
- Khi đánh giá nỗ lực I/O thực tế, nên dùng số lượng buffer
shared read và pg_aios
Kết luận
- Postgres 18 mang lại đóng góp thực tế cho việc cải thiện hiệu năng của workload thiên về đọc
- Đặc biệt, có thể thu được lợi ích lớn khi dùng đĩa có độ trễ cao trong môi trường đám mây
- Đồng thời, cũng đòi hỏi học lại cách diễn giải chỉ số quan sát, tuning hiệu năng và áp dụng cấu hình
- Trong Postgres 19 tương lai, hỗ trợ ghi bất đồng bộ cũng được kỳ vọng
2 bình luận
Postgres đúng là đỉnh của chóp.
Ý kiến Hacker News
preadv2(..., RWF_NOWAIT)để thực hiện đọc bất đồng bộ từ page cache. Điều này có thể hữu ích để giảm độ trễ khiio_method = workeraio(4)của FreeBSD, và sẽ rất thú vị khi xem cách nó hoạt động vì nó không có các nhược điểm củaaiotrên Linux/glibcio_uring, cùng câu hỏi liệu nhiều quản trị viên hoặc bản phân phối Linux có đang vô hiệu hóa nó hay khôngVACUUM ANALYZEtự động bằngpgcronpgbouncer