PostgreSQL 18 (dự kiến phát hành cuối năm 2025) bắt đầu hỗ trợ I/O bất đồng bộ (Asynchronous I/O - AIO), một bước tiến quan trọng nhằm cải thiện hiệu năng hệ thống trong các môi trường xử lý I/O cao như OLTP, big data hoặc hệ thống nhiều người dùng đồng thời.

Trước đây, PostgreSQL sử dụng mô hình I/O đồng bộ, nghĩa là mỗi lần đọc dữ liệu đều phải chờ hệ điều hành trả về kết quả trước khi tiếp tục. Điều này gây ra độ trễ, đặc biệt trong môi trường đám mây với lưu trữ mạng như Amazon EBS, nơi độ trễ I/O có thể vượt quá 1ms. I/O bất đồng bộ cho phép PostgreSQL gửi nhiều yêu cầu đọc song song mà không cần chờ từng yêu cầu hoàn tất, giúp giảm độ trễ và tăng hiệu suất đọc dữ liệu.
1. PostgreSQL 18 áp dụng AIO như thế nào?
- Trên hệ điều hành hỗ trợ AIO (Linux, FreeBSD, v.v.), PostgreSQL 18 có thể:
+ Gửi lệnh đọc/ghi và tiếp tục xử lý mà không chờ đợi.
+ Nhận kết quả I/O thông qua cơ chế callback hoặc polling.
- Kết hợp với hệ thống buffer pool, giúp:
+ Quản lý bộ nhớ hiệu quả hơn.
+ Giảm lock contention khi nhiều kết nối đồng thời.
- Hiện được thử nghiệm với các thành phần như:
+ shared_buffers
+ wal (Write-Ahead Logging)
+ temp files
2. Yêu cầu và điều kiện hệ thống
- Hệ điều hành: Linux với io_uring (từ Linux 5.1+) hoặc POSIX AIO.
- Filesystem: ext4, xfs, zfs đều tương thích.
- Cấu hình PostgreSQL: Có thể bật AIO thông qua biến cấu hình như: enable_async_io = on
Trên Windows, PostgreSQL hiện tại (kể cả bản 18) chưa hỗ trợ đầy đủ I/O bất đồng bộ (Asynchronous I/O – AIO) như trên Linux, do:
  + Kiến trúc I/O của Windows khác biệt: Trên Windows, AIO chủ yếu dựa vào I/O Completion Ports (IOCP) và các hàm như ReadFileEx(), WriteFileEx() hoặc OVERLAPPED structures. PostgreSQL không được thiết kế để sử dụng IOCP, vì IOCP là một cơ chế phức tạp, đòi hỏi quản lý thread pool riêng và callback phức tạp; Việc tích hợp IOCP sẽ đòi hỏi viết lại hoàn toàn tầng quản lý I/O.
  + Thiếu API AIO chuẩn POSIX trên Windows
3. Để khai thác hiệu suất io_uring trong PostgreSQL 18, đảm bảo hệ thống hỗ trợ tối đa các tham số
Thành phần Yêu cầu tối thiểu
Kernel Linux 5.10 (5.15+ khuyến nghị)
liburing 2.1 (mới nhất tốt nhất)
PostgreSQL Biên dịch với --with-io-uring
File system ext4, XFS (với hỗ trợ O_DIRECT)
CPU & Disk Nhiều nhân CPU, SSD tốc độ cao
4. Kiểm tra PostgreSQL đã bật io_uring
Sau khi cài hoặc build, kiểm tra bằng lệnh: postgres -c debug_print_io_uring=on
Hoặc xem log khi PostgreSQL khởi động, sẽ có dòng như: using io_uring for async I/O
5. Tối ưu nhân Linux cho io_uring
Tăng giới hạn file descriptorsulimit -n 1048576
Tăng hàng đợi I/O của kernel: echo 4096 > /proc/sys/fs/aio-max-nr
Tăng IO scheduler hiệu suất cao:
    # Xem disk hiện tại
    cat /sys/block/nvme0n1/queue/scheduler

    # Đổi sang "none" hoặc "mq-deadline" nếu dùng NVMe
    echo none > /sys/block/nvme0n1/queue/scheduler
6. Build PostgreSQL 18 với io_uring
Nếu tự build từ source:
    sudo apt install liburing-dev
    ./configure --with-io-uring
    make -j$(nproc)
    sudo make install
7. Kiểm tra hoạt động của io_uring
PostgreSQL 18 hiện chưa có lệnh nội bộ để giám sát io_uring, nhưng có thể dùng bpftrace để kiểm tra hoạt động của io_uring:
    sudo bpftrace -e 'tracepoint:io_uring:io_uring_complete { @[comm] = count(); }'
Hoặc kiểm tra từ thư mục /proc: cat /proc/<postgres_pid>/io
8. Cấu hình postgresql.conf để tối ưu cho io_uring:
Thêm hoặc điều chỉnh file postgresql.conf:
- Bật AIO (mặc định nếu io_uring khả dụng): enable_async_io = on
Giúp quản lý nhiều AIO hiệu quả: effective_io_concurrency = 256 (hoặc 64, 128 nếu hệ thống trung bình)
- Nếu sử dụng EXT4 hoặc XFS với hỗ trợ O_DIRECT: wal_sync_method = open_datasync
Tăng buffer để tránh nghẽn khi xử lý AIO nhiều:
    maintenance_work_mem = 512MB
    work_mem = 32MB
    shared_buffers = 25% - 40% RAM
Nếu chạy trên SSD NVMe tốc độ cao, thì việc tối ưu các tham số liên quan đến ghi dữ liệu nền (background write) là cực kỳ quan trọng
    checkpoint_completion_target = 0.9
    bgwriter_lru_maxpages = 2000
    bgwriter_delay = 10ms