- Một hồi quy hiệu năng nghiêm trọng đã được kỹ sư Amazon/AWS phát hiện trên kernel phát triển Linux 7.0, khi thông lượng của máy chủ cơ sở dữ liệu PostgreSQL giảm xuống còn khoảng một nửa so với kernel trước đó
- Kết quả đo trên máy chủ Graviton4 cho thấy Linux 7.0 chỉ cung cấp khoảng 0,51 lần thông lượng so với kernel trước, và nguyên nhân được xác định là thời gian tiêu tốn trong spinlock ở user space tăng lên đáng kể
- Nguyên nhân của hồi quy là thay đổi giới hạn chế độ preemption của kernel được thực hiện trong Linux 7.0; một bản vá khôi phục PREEMPT_NONE làm giá trị mặc định đã được gửi lên, nhưng khả năng được chấp nhận vẫn chưa rõ ràng
- Tác giả ban đầu Peter Zijlstra cho biết thay vì sửa kernel, PostgreSQL nên được chỉnh sửa để tận dụng phần mở rộng time slice của RSEQ (Restartable Sequences)
- Phiên bản ổn định Linux 7.0 dự kiến phát hành sau khoảng 2 tuần và cũng sẽ được dùng làm kernel nền tảng cho Ubuntu 26.04 LTS, làm dấy lên lo ngại về suy giảm hiệu năng trên diện rộng cho đến khi PostgreSQL thích nghi
Phát hiện vấn đề và mức độ ảnh hưởng
- Kỹ sư Amazon/AWS Salvatore Dipietro đã báo cáo hồi quy về thông lượng và độ trễ của PostgreSQL
- Theo phép đo trên máy chủ Graviton4, Linux 7.0 chỉ mang lại 0,51 lần thông lượng so với kernel hiện tại
- Nguyên nhân được xác nhận là do tiêu tốn nhiều thời gian hơn đáng kể trong spinlock ở user space
Nguyên nhân hồi quy: giới hạn chế độ preemption
- Kết quả bisecting cho thấy nguyên nhân là thay đổi giới hạn chế độ preemption của kernel trong Linux 7.0
- Thay đổi này được thực hiện theo hướng chỉ giữ lại chế độ Full và Lazy preemption cho các kiến trúc CPU mới, và được đưa vào như một phần của bản cập nhật scheduler của Linux 7.0
Bản vá đã được gửi và phản ứng của maintainer kernel
- Một bản vá khôi phục PREEMPT_NONE làm chế độ preemption mặc định đã được gửi lên mailing list của Linux kernel với lý do đây là một hồi quy nghiêm trọng
- Tuy nhiên, Peter Zijlstra, người viết đoạn mã gốc, tỏ ra không ủng hộ việc chấp nhận bản vá này và cho rằng giải pháp là PostgreSQL tận dụng phần mở rộng time slice của RSEQ (Restartable Sequences)
- Phần mở rộng time slice của RSEQ cũng là một tính năng được đưa vào Linux 7.0
- Zijlstra giải thích rằng "điều này có thể hạn chế việc lock holder bị đưa vào trạng thái preempt"
Phạm vi ảnh hưởng và lịch phát hành
- Nếu quan điểm này được giữ nguyên, hiệu năng PostgreSQL trong một số kịch bản trên bản ổn định Linux 7.0 có thể suy giảm mạnh cho đến khi PostgreSQL được cập nhật
- Phiên bản ổn định Linux 7.0 dự kiến phát hành sau khoảng 2 tuần
- Linux 7.0 sẽ là kernel nền tảng của Ubuntu 26.04 LTS, vì vậy Ubuntu 26.04 LTS dự kiến phát hành vào cuối tháng 4 cũng có khả năng chịu ảnh hưởng tương tự
2 bình luận
Nghe nói các nhà phát triển kernel đã nói với các nhà phát triển PostgreSQL suốt gần 10–20 năm rằng "spinlock ở userspace không được khuyến khích, nên mong họ cân nhắc lại"..
https://x.com/kosaki55tea/status/2040458791536497035
Ý kiến trên Hacker News
Đáng đọc bài viết tiếp theo trên LKML của Andres Freund, một nhà phát triển Postgres
Có ý kiến cho rằng các maintainer của Linux nên ưu tiên hỗ trợ các ứng dụng cốt lõi như PostgreSQL
Điều này gợi nhớ đến trường hợp trước đây Fedora chặn cập nhật khi cài Wine
Tức là đây không phải vấn đề mà mọi người dùng PostgreSQL nâng lên kernel mới nhất đều sẽ gặp phải
Có ý kiến rằng dùng spinlock trong user space mà không có hỗ trợ từ kernel thì chẳng khác nào tự chuốc lấy suy giảm hiệu năng
Tuy nhiên, lock dựa trên futex lại gây hồi quy hiệu năng do tăng memory barrier
Ngoài ra, Postgres vẫn phải tính đến các nền tảng chưa hỗ trợ phép toán nguyên tử 8 byte, nên khó thay thế
Spinlock gây ra vấn đề đã được loại bỏ gần đây, và khi dùng huge pages thì nút thắt cổ chai gần như biến mất
Cũng có người nói rằng “không ai dùng kernel mới nhất trong production”
Nhưng trên thực tế, Ubuntu 26.04 LTS sẽ sớm phát hành dựa trên Linux 7.0, nên nhiều người dùng sẽ sớm sử dụng nó
Vấn đề hiện tại là cần bản vá kernel chứ không phải sysctl
Có thể xem bối cảnh về PREEMPT_LAZY trong bài viết của LWN
Có bình luận đùa rằng “đã kiểm tra xem gần đây Jia Tan có gửi bản vá kernel nào chưa chưa?”,
và có người đáp lại rằng “không cần đâu, lỗ hổng đã quá nhiều rồi”
Có ý kiến thắc mắc liệu I/O bất đồng bộ và tối ưu hóa truy vấn song song của PostgreSQL 18 có thể bù lại mức suy giảm hiệu năng lần này hay không
Có thể xem nội dung liên quan trong ghi chú phát hành PostgreSQL 18
Cũng có người đặt câu hỏi vì sao lại cần chế độ preemption động như PREEMPT_LAZY
Ý là lợi ích mà người dùng thông thường nhận được không rõ ràng
Kernel sẽ nhận được thông tin rõ ràng hơn để cải thiện các quyết định scheduling
Có bình luận nói rằng họ đo được mức giảm hiệu năng 10% giữa FreeBSD 14 và 15.0, và nhìn trường hợp lần này thấy cũng được an ủi phần nào
Cũng có chỉ trích rằng Phoronix đã đăng bài mà không kiểm chứng đầy đủ
Trong email tiếp theo, kết luận là bản thân benchmark có vấn đề và thực tế không phải chuyện nghiêm trọng
Có thể PostgreSQL sẽ không bị ảnh hưởng lớn, nhưng những ứng dụng khác không thể dùng huge pages thì vẫn có thể bị tác động
Vì vậy không phải chuyện có thể đơn giản bỏ qua
Một liên kết thread LKML cũ cũng được chia sẻ kèm theo